pythonアルゴリズム開発ノート

4530 ワード

前言
最近《アルゴリズムの図解》を見終わってpythonのアルゴリズムに対して少し理解して、特に記録します
アルゴリズムの概要
  • 二分検索の速度は単純検索よりずっと速い
  • アルゴリズム実行時間は大O表現で表される.成長率の観点から測定した.
  • O(log n)はO(n)より速く、検索する要素が多ければ多いほど、前者は後者より速くなる.
  • 配列の速度:O(1)の読み取り、O(n)の挿入、O(n)チェーンテーブルの削除速度:O(n)の読み取り、O(1)の挿入、O(1)の削除
    ソートの選択
    #    
    def selectSort(arr):
        newArr = []
        oldArr = arr.copy()
        for i in  range(len(arr)):
            mix_index = 0
            #    oldArr      ,          
            for i in range(1,len(oldArr)):
                if oldArr[mix_index] > oldArr[i]:
                    mix_index = i
            newArr.append(oldArr[mix_index])
            oldArr.pop(mix_index)
    
        return newArr
    

    再帰
  • 再帰関数には2つの要点がある:1、ベースライン条件、すなわち呼び出しを停止し、再帰の条件2、再帰の条件を飛び出し、関数呼び出し自身
  • を指す.
  • 再帰を深く認識すれば、関数式プログラミング言語の学習が容易になります.Haskellなどの関数式プログラミング言語にはループがないため、再帰を使用して関数を記述するしかありません.

  • クイックソート
  • 動作原理:1、簡単なベースライン条件を探し出す2、問題の規模をどのように縮小するかを確定し、ベースライン条件
  • に合致させる
  • 帰納証明はアルゴリズム行を証明する有効な方法であり、ベースライン条件と帰納条件の2つのステップに分かれている.帰納条件は,1つの元素に対しても,2つ,3つの元素に対しても用いられることを証明することである.
  • クイックソートの平均運転時間はO(nlogn)、最高はO(n 2)
  • である
    #    
    def quickSort(arr):
        #    
        if len(arr) < 2:
            return arr
        else:
            #   
            pivot = arr[0]
            less = []
            gretter = []
            for i in arr[1:]:
                if i > pivot:
                    gretter.append(i)
                else:
                    less.append(i)
            #         
            return quickSort(less) + [pivot] + quickSort(gretter)
    

    ハッシュ関数
  • pythonとOCでは、辞書の呼称であり、マッピング、ハッシュマッピング、関連配列とも呼ばれる.ハッシュ関数の動作速度はO(1)である.
  • ハッシュ関数の性能:平均:検索O(1)、挿入O(1)、削除O(1)最も遅い場合:検索O(n)、挿入O(n)、削除O(n)、削除O(n)
  • 最適化ハッシュ関数:1、低い充填因子、すべての空席を埋めないでください.2、良好なハッシュ関数、因子は均一に散布し、マッピング範囲はできるだけ大きくしなければならない.

  • 広さ優先検索
  • は図アルゴリズムの一種に属し、両者の最短距離を探し出し、最短経路問題
  • を解決するのが得意である.
  • ステップ:1、図を用いて問題モデルを構築する2、広さ優先探索を用いて問題を解決する
  • fへのパスを検索:
  • #      
    #      
    from collections import deque #   (  )
    def search_queue(dic):
        searchQueue = deque()
        searchQueue.append(dic['a'])
        searched = [] #     
        while searchQueue:#       
            letter = searchQueue.popleft()
            if letter not in searched:
                if letter[-1] == 'f':
                    print("     ")
                    return True
                else:
                    for each in letter:
                        searchQueue.append(dic[each])
                    searched.append(letter)
        return False
    
     dic = {}
        dic['a'] = ['b','c']
        dic['b'] = ['d']
        dic['c'] = ['e']
        dic['d'] = ['g']
        dic['e'] = ['f']
        dic['f'] = []
        dic['g'] = []
        print(search_queue(dic))
    

    ディックストラアルゴリズム
  • は、各ノードに重みを加えて重み付け図について計算するが、有向無ループ図DAGにのみ適用され、負の重みのあるエッジには使用できない.
  • 負の重みのあるエッジの図に対して、最短の経路を探し出し、ベルマン・フォードアルゴリズム
  • を用いることができる.
    貪欲なアルゴリズム
  • 各ステップは局所最適解を選択し、必ずしも全体の最適解とは限らないが、最適解に非常に近く、速度が
  • 速い.
  • NPの完全な問題は、迅速な解決策がなく、近似アルゴリズム
  • を使用するのが最善の方法である.
  • 貪欲なアルゴリズムは実現しやすく、運行速度が速く、良い近似アルゴリズム
  • である.
  • NP完全問題の特徴:1、要素が少ない場合アルゴリズムの実行速度は非常に速いが、要素の数が増えるにつれて速度は非常に遅くなる.2、「すべての組み合わせ」に関する問題は通常NP完全問題3、問題を小さな問題に分けることができず、様々な可能性を考慮しなければならない.これはNPの完全な問題かもしれない.4、問題がシーケンス(例えば旅行者問題の洪水の都市シーケンス)に関連し、解決しにくい場合、それはNPの完全な問題である可能性がある.5.問題が放送局の集合のような集合に関連し、解決しにくい場合、それはNPの完全な問題である可能性がある.6、問題が集合オーバーライド問題または旅行者問題に変換できる場合、それはNP完全問題
  • に違いない.
    ダイナミックプランニング
  • 動的計画は、所与の制約条件下で最適解を見つけることができる.
  • は、問題が互いに独立して離散したサブ問題に分解される場合、動的計画を使用して解決することができ、各動的計画ソリューションはグリッドに関連する.
  • 各セルはサブ問題なので、問題をサブ問題
  • に分解する方法を検討する必要があります.
  • ダイナミックプランニングソリューションを計算する式は、四海に放されていない.

  • K近傍アルゴリズム
  • ビッグデータ比較でよく使われるアルゴリズムで、特徴値を抽出して他の要素の最近値と計算して
  • を分類する.
  • 回帰は予測の結果であり,分類は編成
  • である.
  • 両要素の距離を計算する場合、距離式を用いることもあれば、余弦類似度
  • を用いることもある.
    その他
  • 二叉木、データベースや高度なデータ構造に興味がある場合は、B木、赤黒木、スタック、伸張木
  • のデータ構造を研究することができます.
  • 逆インデックス、keyは単語、値は指定された単語を含むページであり、検索エンジン
  • の作成によく使用される.
  • フーリエ変換は、デジタル信号などの要素に変換できる限り、多くの場所で使用されています.
  • 並列アルゴリズム:1、分布式アルゴリズム、MapReduce、Apache Hadoopでその2、マッピング(Map)関数を使用して、一つの配列を別の配列3、集計(reduce)関数に変換し、一つの配列を一つの要素
  • に変換することができる.
  • ブロンフィルタ、確率的データ構造、主に重量除去に用いられ、すでに存在するかどうかを監視し、答えが正しい可能性があり、HyperLogが正しくない可能性もあり、ブロンフィルタのようなアルゴリズム
  • SHAアルゴリズム、ハッシュ関数、文字列に基づいて別の文字列を生成し、ファイルパスワードの局所的に敏感なハッシュアルゴリズム、Simhashを比較し、内容がほぼ同じかどうかを監視することができ、類似度
  • を比較することができる.
  • Diffie--Hellman鍵交換、そしてRSAは、公開鍵秘密鍵アルゴリズムである.
  • 線形計画は、すべてのグラフアルゴリズムが線形計画で期限を決めることができ、比較的広い枠組みであり、その一つがSimplexアルゴリズムであり、最適解を見つければ、線形計画
  • を研究することができる.