フロント2コンテンツ:複雑分析

注:本明細書において呼ばれる\(\ N-ログ\)全てを参照し、\(\ログ_2n \) 全て、より他に説明しないさらに分割分割されている\(O \)記号を表現文言意味の違い。

まず、正確性、第2の動作効率:特定の問題については、問題解決の方法は2通りの方法で標準の1種類を測定します。

アルゴリズムが間違っている場合は、該当の値はありません。そのようなハードウェアなどの要因の影響に関連する効率の尺度は、比較的容易です。だから、どのように我々は、賛否両論がこのような観点からそれを、アルゴリズム量るのですか?


効率の側面を見て、メインの時間。

データのセットのために、見つけることができます異なる時間かもしれ異なるマシン上で実行されている非無作為化プログラムに、決定し、そのプロセスは同じです。換言すれば、各々が同じ動作です。だから我々は、使用できる回数プログラムの実行の基本動作をその動作効率を表現します。算術演算手段の基本的な動作は4、1つの関数呼び出し、運転条件判断であることに注意してください。循環を、ない再帰関数の基本的な操作のように。

一般的に、動作の数は、実質的に、入力データのサイズであるべきである\(N- \)関数\(T(N)\) 私たちは、一般的に容易に直接計算しないでください\(T(n)が\)特定の値、そして私たちは式で近似することができる必要がある\(T(n)が\)および他の関数計算が容易\(F(N)\)時間の複雑さと呼ばれます。呼ぶ(T(N)= O(F(N))\)\、としても知られている\(T(N)\)\(F(N)\)と同じオーダーの。

定義ウィキペディア、次いでによって場合\(F(N)\)選択が満たさなければならない:\(\ FRAC {T(N)} {F(N)} = C \ \リム\ limits_ {+ \ inftyのに\ N-} )、ここで\(C \)である非ゼロ定数。このとき、ということを意味\(\ N-)は、十分に大きい\(T(N)\)\(F(N)\)のみ係数に反映ギャップ。

人気のは、言うこと(F(N)\)\保存されなければならない(T(N)\)\最高度の用語の、他の項目が削除されてもよいし、最上位項係数。そのノート\(T(n)が\)必ずしも多項式、いわゆる最高度の用語ではない、を意味する場合\(N \)無限大になる傾向がある場合\(T(N)\)最大1インチ その後、我々は、一般的に使用される機能の間に何らかの関係を得ることができる(とき記号未満が示す\(N \)ときのサイズの結果が無限大になる傾向):

\(1 <\ 2 ^ n個<... <K ^ nは<N!\を\ sqrtの<NログN <N <N \ログのn <N ^ 2 <... <N ^ kの<C_N ^ K < )

前記\(K \) 2より大きい定数です。

例えば、\(T(N)= c_kn ^ K + C_ {K-1}のn ^ {K-1} + ... + c_1n ^ 1 + C_0 \) で\(C_I \)である定数、次いで、多項式関数、\(T(N)= O(N-K ^)\)

以外は、上記に列挙したものに加えて、いくつかの時間の複雑さのような、生じ得る(O(\アルファ(N))\)\ \、(互いに素なセットが均等複雑共有)(O(\ N-ログ\ログ) \) 等エッペンドルフふるいを、)、\ (O(N \ 2のn ^ログ)\) チェーン分割ツリー/ツリーセットツリー/分割ポイント/グループチャット他のデータ構造)、\ (O(N \ ^ N-2回)\) 一般的な成形圧力DP /受信部撥タイトルカウント)などが挙げられます。

一般的なゲームとOJでは、複雑さは、データの最大サイズが比較的一定である行うことができます。しかし、唯一の基準として、多かれ少なかれ影響は一定の動作効率であろうからです。また、以下の表の値が近似している、それはまた少し越えた一般ことができますが、それはそれは規模にしなければならないという意味ではありません。(シンプル\(O(1)\)\(O(\ログn)は \) 一般的ではなく、内部に含まれていない大きな範囲を行います)

時間複雑 時間\(1S \)時間スケールを行うには
\((\のSqrt N)\) \(N \ leq10 ^ {14} \)
\(O(n)\) \(N \当量10 ^ 7 \)
\(O(N \ Nログ)\) \(N \当量10 ^ 6 \)
\(O(N \ SQRT N)\) \(N \当量4 \回^ 4 10 \)
\(O(n^2)\) \(N \ leq3 \ times10 ^ 3 \)
\(O(N ^ 2 \ nはログ)\) \(N \当量10 ^ 3 \)
\(O(n^3)\) \(N \ leq200 \)
\(O(2^n)\) \(N \当量20 \)
\(O(n!)\) \(N \当量10 \)

入力データが同時に可変サイズの複数の決定された場合、関数の時間計算量は1元の多価によって変換してもよい:例えば、\(T(N、M) =(N ^ 2メートルO)\)

我々はトピックのデータ範囲を取得すると、あなたはまた、この質問はおそらく時間の複雑さを解決するためにどのようなアルゴリズムの種類が必要になります後方考えてみることができ、いくつかのヒントを与えることができるかもしれません。

メインプログラムとして、ラウンドロビンのために、私たちは分析サイクルを通じてプログラムの時間計算量を分析することができます。分析サイクルは、我々は一般的に実行のその番号を分析します。

例1:次のコードフラグメント分析時間複雑:

for (int i=2;i<=n;i++) {
    ans++;
}
for (int i=2;i<=n;i++) {
    ans+=i;
}

加えて、カナダからは、我々は2つのサイクルを実行しているの数を分析し、基本的な操作です。2つのサイクルが実行されている\(N-1 \)倍、すなわち\(O(N)\)合計時間複雑であるので、時間\(O(N)+ O (N)= O(N)\

例2:次のコードフラグメント分析時間複雑:

for (int i=2;i<=n;i++) {
    for (int j=2;j<=n;j++) {
        ans+=j;
    }
}

2つのサイクルが実行され(O(N)\)\回、これはネストされたループであり、時間の複雑さは、\(O(N)\倍 O(N)= N O(^ 2)\

このようなメインループなどのプログラムのためのタイルのサイクルの複雑性添加剤、ネストされたループの乗法複雑。しかし、また、2つの多項式のため、計算が下記の法則:

\(O(N ^ P)+ O(N ^ Q)= O(N ^ {\ MAX(P、Q)})\ qquad O(N ^ P)\時間はO(n ^ Q)= O(N ^ {P + Q})\)

ビッグO記法の複雑さの定義によれば、それを証明するのは簡単です。

例3:次のコードフラグメント分析時間複雑:

for (int i=1;i<=n;i+=i) {
    for (int j=1;j<=n;j++) {
        ans+=j;
    }
}

各時間アウターループ\(I \)は二重になっているので、実行の数である(O(\ N-ログ)\)\、内側の層であるが、\(O(N)\) 総時間の複雑さであります\(O(N \ N-ログ)\)

実施例4:次のコードの時間複雑さの解析:

注:この場合には最適化されていないエッペンドルフモデルをふるいです。

for (int i=1;i<=n;i++) {
    for (int j=i;j<=n;j+=i) {
        ans+=j;
    }
}

この問題は、覚えておくべき結論として使用することができます。実際には、各\(J \)サイクルの数である(O(\ {N-FRAC} {I})\)\次いで、総時間複雑である\(O(\ {N-FRAC。1} + {\ FRAC {N-2}} + ... + {\ {N-FRAC N- {}})\)

導出過程は非常にここでは、リミット必要な機能の概念を複雑すぎてスキップされ、次の結論を証明することができます。

\(O(\ FRAC {N} {n}は{1} + \ FRAC {2} + ... + \ FRAC {N} {N})= O(\和\ limits_は{I = 1} ^ N \ FRAC {n}は{I})= O(N \ Nログ)\)

これらは、コードのみの流通に関わる分析の複雑さのいくつかです。状況再帰関数の複雑さで見てみましょう。

実施例5:実行するには、次のコードの分析\(F(1、N) \) 時間複雑。

注:バランスこの例貢献モデルセグメントツリー/ツリー。

void f (int l,int r) {
    if (l==r) {
        return;
    }
    int mid=(l+r)/2;
    f(l,mid),f(mid+1,r);
    return;
}

このような問題が発生し、我々はセット(\ T(N))\である\(RL = N \)ランタイム\(F(L、R) \) の複雑さは、で見つけることは容易である(L、R \ \ )は何の関係もありません()関連の唯一の違いでは、我々は上で取得することができます(T(N \)\)式:

\(T(N)= \開始{ケース} 2 \時刻T(\ FRAC {n}は{2})N \ NE 0 \\ 1 \ qquad \ qquad \ \ \ \ \ \ n = 0で\端\ qquad {ケース} \)

そして、我々は、上記の式を展開することができます。

\(T(N)= 2つの\時刻T(\ FRAC {n}は{2})= 2 ^ 2 \時刻T(\ FRAC {N} {^ 2 2})= 2 ^ {O(\ Nログ) } \時刻T(0)= O(N)\)

したがって\(T(N)= O(N)\) この方法の添加が速く一つのセグメントツリー/ツリーバランス寄与よりも理由を説明しています。

実施例6:実行するには、次のコードの分析\(F(1、N) \) 時間複雑。

注:本実施形態の基本的なモデルは、マージソートアルゴリズムアリコートルールです。

void f (int l,int r) {
    if (l==r) {
        return;
    }
    for (int i=l;i<=r;i++) {
        ans++;
    }
    int mid=(l+r)/2;
    f(l,mid),f(mid+1,r);
    return;
}

セット\(T(N)\)\(RL = N \)、実行(F(L、R)\ \) の複雑。本実施形態に係る実施例では、複数の比較\(L \)(R&LT \)\サイクル、次いで式があります。

\(T(N)= \開始{ケース} 2 \時刻T(\ FRAC {n}は{2})+ N \ qquad N \ NE 0 \\ 1 \ qquad \ qquad \ qquad \ \ \ \ \ N = 0 \端{ケース} \)

この式に続いて、理解するための2つの方法があります。

上記(1)式が展開されます。

\(T(N)= 2つの\時刻T(\ FRAC {n}は{2})+ N = ^ 2 2 \時刻T(\ FRAC {N} {^ 2 2})+ 2 \回\ FRAC {N } {2} + N \)

\(T(N)= 2 ^ K \時刻T(\ FRAC {N} {2 ^ K})+ \和\ limits_ ^ {K-1} 2 {I = 0} ^ I \回\ FRAC {N } {2 ^ I} \)

場合\(k = O(\ログ N)\) があります。

\(T(n)は2 ^ {O(\ログN)} \時刻T(0)+ \和\ limits_ {I = 1} ^ {O(\ログN)} N = O(N + N = \時間は、nログ)= O(N \ Nログ)\)\

我々が得るよう:\(T(N)= O(N \ N-ログ)\)

(2)分析再帰層:

\(F(1、\ FRAC {N} {2 ^ K})、F(\ FRAC {N} {2 ^ K} +1、\ FRAC {N} {2 ^ K} \回2)。 ..、F(N- \ FRAC { N} {2 ^ K} + 1、N)\) の長さ\(\ FRAC {N} { 2 ^ kが} \) の関数として定義されている\(K \ )機能層0の開始時に呼び出されるレイヤ機能と、\(F(1、N-)\) 我々はなお、([0、O(\ Nログ)] \におけるk \)\内部が有意義であるが、各層の機能を呼び出すためには、1からnまでの全ての数をカバーしなければなりません。これは、上記の分類から見ることができ、これらのセグメントは、1-Nを覆います。私たちは、その長さごとに別々に計算された関数を計算量を知って、各レイヤの機能は、複雑さと時間は以下のとおりです。

\(2 ^ K \倍O(\ FRAC {N} {2 ^ K})= O(N)\)

だから、すべての層のために、時間の複雑さは、次のとおりです。

\(T(N)= O(N)\倍O(\ Nログ)= O(N \ Nログ)\)

同様に右の結果を得ました。


(マスター羅バレーデイリーの記事について次の定理の参照時間と空間の複雑さの解析とChanisことでのマスターの定理、マスター定理の参照記事の主定理定理マスターを証明して使用します

我々は、分割統治再帰的な関係のスケール形成におけるその規模の複雑さである再帰的な分析の複雑さ、あり、次のような例で得た教訓だった、二つの例の上に見てきました。(NOIPの主な役割は、予備グループを増やすことで、予備に加えて、のような...通常困難な計算の複雑さを満たすために)

この再帰式を考えてみましょう:

\(T(N)=時(\ FRAC {N} {B})+ F(N)\ qquad(T(1)= 1、\ \、B> 1)\)

以下によれば、実際には上記二つの問題の延長である(A、B、F(N \ \)) で論じ異なる値を分類します。なお、(F(N)\)\多項式であり、以下に参照(= O(N ^ D)\ F(N))\、であり、\(F(N)\)直接書込み\(N ^ D \) 。

実際の式は、と言うことである:のサイズのために分割統治アルゴリズムが存在する\(N \)質問、各層が分裂し、統治である\(\)のスケール(\ \ FRAC {N} { B}を\)副問題、すべての部分問題および必要な複雑さの合併プロセスの最終結果の結果である(F(N)\ \) プロセス全体のアルゴリズムの複雑。

証拠のマージソートの複雑さに関する上記の例では、私たちに方向性を与えている、我々はこの問題を解決するための層とスタイル展開]一緒を通じて、二つの方法の統合の上にしようとします。

レベル0:すなわち、元のレイヤーは、時間の複雑さは、マージされた結果である\(N ^ D \)レベル。

層1:合計\(A \)サブ問題、各サブ複雑合わせ問題\((\ FRAC {N-} {B})^ D \) 総時間複雑である(\ \ FRAC {} B ^ D} {\ D ^ n倍\) なお単離されたアイテム分析の使用、我々定数\(B \)片側、変数に\(N- \)別の側に、

層2:合計\(^ 2 \)サブ問題、各サブコンビネーションの複雑さの問題\((\ FRAC {N-} {B ^ 2})^ D \) 総時間の複雑さである((\ \ {A}、{B FRAC ^ D})^ 2 \ ^ n倍D \)

最初の\(K \)層(\(K = \ log_bn \) ):\(^ K \)副問題、各サブコンビネーションの複雑さの問題\((\ FRAC {n}は {B ^ K}) ^ D \) 総時間複雑である\((\ FRAC {} {B ^ D})^ K \倍N- ^ D \) 達している\(N = 1 \)場合、再帰が停止されます。

見つけやすい、それが設けられ、幾何学的な配列である(Q = \ FRAC {\ \} {B ^ D}) 、すなわち:

\(T(N)= N ^ D \回(Q ^ K + ... + Q ^ 2 + Q + 1)\)

高次分散式等比級数の和を使用することは、我々が得ます:

\(T(N)= \ FRAC {N ^ D \回(Q ^ {K + 1} -1)} {Q-1} \)

欠落している、ちょっと待って(Q = 1 \)\、場合議論の\(T(N)= N ^ D \タイムズ= N-K ^ D \タイムズ\ log_bn \) すなわち\(T(N)= O(N-D ^ \ N-log_b)\)もし\(\ log_2b \)定数として扱われ、\(T(N)= O(N-D ^ \ Nログ)\)

以下の分析は明らかにされ(Q-1 \)\の正負。

  1. \(Q-1> 0 \)、次いで\(T(N)= O (N ^ D \回Q ^ K)= O(N ^ D \回\ FRAC {^ K}、{B ^ {DK} })\) および\(K = \ log_bn \)ので、(T(N)= O \ (N ^ D \回\ FRAC {^ K} {N ^ D})= O(^ K) \) 我々は、対数底の式を使用できるように、\(T(N)= O(A ^ {\ log_bn})= O(N - (^ {\ log_na})^ {\ log_bn})= O(N- {^ \ log_ba})\) 我々が正常に得られたように(T(n)が\ \)の発現。
  2. \(1-Q <0 \) 次いで\(T(N)= O(N-D ^)\) 別の定数、製品に影響を与えないで、非常に簡単です。

だから我々はマスター定理を得ました:

時間分割統治アルゴリズムの複雑さのために:

\(T(N)=時(\ FRAC {N} {B})+ N ^ D \ qquad(T(1)= 1、\ \、B> 1)\)

  1. \(\ log_ba <D \) \(T(N)= O(N ^ D)\)
  2. \(\ log_ba = D \) \(T(N)= O(N ^ D \ログN)\)
  3. \(\ log_ba> D \) \(T(N)= O(N ^ {\ log_ba})\)

プログラムを書くことは、トピックによってかどうかを予測するのに自分の時間のコードの複雑さを分析することができた後、これまでのところ、私たちは、いくつかの基本的な複雑さの分析サイクルタイムと再帰的な手順を学んできました。

複雑な時間介護者だけでなく、宇宙の複雑さに加えて。空間の複雑さは、主に再帰関数と層のアレイによって占められるメモリに関連しています。使用領域のアレイを計算する式である:\(のsizeof(タイプ)\時間の長さ\) \(タイプ\)、INT、CHAR、BOOL、長い長い、などであり、バイト数が異なるそれぞれ占有しました。長さは、配列のサイズです。計算された値は、少なくとも配列の点で、メモリ得タイトルメモリ限界未満である場合には、この実施形態によれば、被験者の要件を満たすことです。

このような二次元アレイとしてのみ最上位タームを保持する空間的複雑さと同様に、時間的複雑さ、\(F [2 \回N ] [N + 1] \) 空間的複雑である\(O(N ^ 2) \ ほとんどの場合、ボトルネックの最適化手順なりにくい空間の複雑さは、細部にあまりありません。(具体的な最適化は、主スクロールアレイで述べDP他の特定のセクターを最適化)

これまでのところ、私たちは、開口部が提起した効率の問題を解決しました。時間と空間分析の観点からこの問題には、後にアルゴリズムのメリットの中で最も重要な指標の一つとなり、時間と空間の概念の複雑さ。

おすすめ

転載: www.cnblogs.com/ix35/p/11973207.html