テストアルゴリズムの開発財団(1):複雑性分析

実行時間コードの時間の複雑さは、成長とトレンドデータスケールを表します。O()を使用して表す
コードの実行時間の各ラインを仮定[]と同じである、unit_timeです。すべてのコードT(N)の実行の合計時間は、コードの各行回数に比例します。

図1に示すように、唯一のコードの一部を実行サイクルの最も数に関係します

DEF CALC(N):
    「」」
    このコードの実行時間分析、(3 + 2N)* unit_time、削除定数、時間複雑さに到達するより高次の係数を削除するには、O(N)であります
    「」」
    合計= 0#1の実行
    Iの範囲内(0、N + 1)のために:#N + 1回の実行
        総計=総+ I#N + 1回行います
    リターンの合計

例を引用:

デフの組み合わせ(データ:リスト):
    「」」
    すべての組み合わせを見つけるために、2つずつのリストから削除しました。
    このコードの実行時間分析、(1 + N + 2N * N)* unit_time、時間複雑さに到達するために、低レベル、高次の係数、定数を削除O(N * N)であります
    思考:前とカウント数との連続的な組み合わせ後の異なる、など(1,3)との組み合わせと考える(3,1)として、どのように書くには?
    「」」
    N = LEN(データ)を行う#1
    #n回:範囲内でX(0、N)のために
        範囲のY(0、N)のために:#N * Nの実行時間
            印刷(データ[X]、DATA [Y])#実行時間N * N

3、乗算ルール

ネストされたタグは、ネストされた内側及び外側コードの複雑さの積に等しい複雑。

デフgeometric_progression(N:整数) - > int型:
    「」」
    等比数列を印刷
    場合nより大きいiが1から出発し、2は各サイクルで乗算され、サイクルが終了します。私は実際には、一般的な比率は2等比数列です。サイクルはlog2n、時間計算量O(log2n)です。
    かどうかは、下のための3にベース2、またはベース10には、我々は注文のすべての時間の複雑さはO(LOGN)として記録されている置きます
    「」」
    私は= 1
    しばらく私<= N:
        私は、私は、* = 2
        プリント(I)

4、の複雑さの順

デフgeometric_progression(N:整数) - > int型:
    「」」
    等比数列を印刷
    場合nより大きいiが1から出発し、2は各サイクルで乗算され、サイクルが終了します。私は実際には、一般的な比率は2等比数列です。サイクルはlog2n、時間計算量O(log2n)です。
    かどうかは、下のための3にベース2、またはベース10には、我々は注文のすべての時間の複雑さはO(LOGN)として記録されている置きます
    「」」
    私は= 1
    しばらく私<= N:
        私は、私は、* = 2
        プリント(I)

5、複雑さは、2つのデータのサイズによって決定されます

(M、N)DEF dependent_on_two_scale。
    「」」
    コード、Mから見てNすることができるように、2つのデータサイズを表します。私たちは、事前にその巨大なので、我々は複雑さを表し、単に追加ルール、省略されているのいずれかを使用することはできませんm程度とnを評価することはできません。
    コードの複雑さは、Mのサイズによって決定され、nは二つのデータであるれています。O(M + N)の時間複雑です
    「」」
    sum_1 = 0
    sum_2 = 0
    Iレンジ(M)での場合:
        sum_1 = sum_1 + I
    Iレンジ(N)でのために:
        sum_2 = sum_2 + I

    リターンsum_1 + sum_2

6、再帰アルゴリズムの時間計算量解析

再帰アルゴリズムの時間複雑超高です。

DEFフィボナッチ(N):
    「」」
    アイテムnはフィボナッチの求めています。
    再帰アルゴリズムの複雑さの分析。図に示す動画再帰木、そのようなフィボナッチ(6)。複雑さはO(2 ^ N)
    「」」
    もしN == 0:
        0を返します
    もしN [1、2]。
        1を返します
    戻りフィボナッチ(N  -  1)+フィボナッチ(N  -  2)

7、最適化は、再帰的なアルゴリズムの時間の複雑さを軽減します

デフfibonacci_plus(N:整数) - > int型:
    「」」
    左から右にフィボナッチ数は、その項目が順次N缶を計算することによって得られた各値について決定することができます。その時の複雑さはO(N)です。
    「」」
    、B = 0、1
    2 <nの場合:
        リターンのn
    用_範囲で(2、N + 1):
        、B = B + bの
    リターンB

8、最高、最悪時間計算量

異なる状況で異なる時間にコードの複雑さ。ベスト・ケースの時の複雑さは、このコードの最良の場合の実行時間の複雑さに、あります。最悪の場合の時間の複雑さは、このコードの最悪実行時間の複雑さに、あります。

デフ(:リスト、X:データint)を検索する - > int型:
    「」」
    無秩序な配列からの要素の添字を検索します。最高の時間計算量はO(1)で、最悪時間計算量はO(n)があります
    見つけるには、X変数は、アレイ内の任意の場所に表示されることがあります。
    配列の最初の要素は、あなたがXを見つけたいだけの変数である場合は、残りのn-1のデータを横断するために継続する必要がない、その時の複雑さはO(1)です。
    変数が配列xに存在しない場合は、我々は再び配列全体を横断するすべての必要性は、時間複雑度はO(n)であろう。
    :Paramのデータ:なしリピート要素、順序付けられていない配列
    :Paramのは、x:見ての要素があるために
    :リターン:添字のx
    「」」
    長さ= lenは(データ)
    I範囲(長さ)にするための:
        もしデータ[i]を== X:
            私を返します
        他:
            リターン-1

9、加重平均時間計算
最高と最悪時間計算量を超える導入は、より極端な例です。そして、平均時間の複雑さはどのくらいですか?

変数xは、データ内の位置を見つけるために、データではなく、存在するN + 1が下付き文字0〜N-1であってもよいです。我々それぞれの場合は、要素の数が横断する必要がある要素の数の平均値を得ることができ、加算検索時にトラバースした後、N + 1で除算する必要があります。(1 + 2 + 3 ... + N + N)/(N + 1)、係数省略、低次、定数は、従って、平均時間計算量はO(N)で得ました。

最大の問題は、以前の導出は、アカウントへの様々な状況の発生のない確率がないことです。アレイおよびアレイ内の確率が1/2ではありません。さらに、0〜n-1のn個の位置の出現確率を見つけるデータは、1 / nについても同様です。
私たちはそれぞれのケースの発生確率を置く場合も考慮され、計算は、平均時間の複雑さは、このなること:

 

 O表記大で表され、一定の係数を削除、このコードの加重平均時間計算量はO(n)のままです。

10、スペースの複雑さの解析

余分なメモリが割り当てられているどのくらい参照してください。

デフspace_complexity(N:整数):
    「」」
    1行目はコードの複雑さの空間全体がO(n)があるので、加えて、コードの残りの部分は、より多くのスペースを取りません、サイズのリストについては、適用されるn個。
    「」」
    スペース= [0] * N#は、サイズnのリストに適用されます
    Iレンジ(N)でのために:
        スペース[I] = I * I
    印刷(スペース)

11は、要約したもので
、複雑分析の実践的な方法を:

;最大コードのループ実行部の数に関係のみ
全体的な複雑さの複雑さは、コードの大部分の順序と同じである;またルール
乗算ルール:ネストされたタグの複雑さは、ネストされた内側及び外側コードの複雑さの積に等しい
2に関連付けられていると複雑データのサイズがmを決定し、Nにするとき、時間複雑性はO(M + n)は
共通の時間の複雑:O(1)<O( LOGN)<O(N)<O(nlogn)<O(N * n)の
分析、複雑な十分な余分なスペースが割り当てられているどのくらいのメモリを参照するために、比較的簡単です。

 

おすすめ

転載: www.cnblogs.com/jiliwei/p/12049471.html