時間複雑度アルゴリズムの特徴は何ですか?


19

アルゴリズムの時間の複雑さを慎重に調べることで、簡単に特定できる場合があります。 2つのネストされたループを持つアルゴリズムは、明らかにN 2です。2つの値のNグループのすべての可能な組み合わせを探索するアルゴリズムは、明らかに2 Nです。NN2N2N

しかし、複雑さを持つアルゴリズムを「見つける」方法はわかりません。たとえば、再帰的なマージソートの実装は1つです。mergesortまたは他のΘ N log N アルゴリズムの一般的な特性は、分析するときに手がかりになりますか?Θ(NlogN)Θ(NlogN)

アルゴリズムが複雑ななる方法は複数あると思いますので、ありとあらゆる答えがありがたいです。ところで、厳密な証拠ではなく、一般的な特性とヒントを探しています。Θ(NlogN)


6
はツリーを意味します。O(logn)
プラティックドーハー


2
@PratikDeoghare:必ずしもではありません。
ラファエル

3
@Raphael私は主に意味しました!:)
プラティックドーハー

回答:


17

典型的なは、分割統治アルゴリズムであり、線形時間で作業を分割(および再結合)し、断片を再帰的に処理します。マージソートは、そのように動作する:支出O N 時間分割2つのおおよそ等しい片に入力、再帰的にソート各部分、および過ごすΘ N 二つの半体をソート結合時間。Θ(nlogn)O(n)Θ(n)

直感的には、分割統治のアイデアを続けると、分割にかかる時間は線形であるため、分割するピースの数の増加がピースのサイズの減少と正確に一致するため、各分割ステージは合計で線形の時間がかかります。合計実行時間は、分割ステージの合計コストに分割ステージの数を掛けた積です。小片の大きさは、各時点で半分になるので、ある実行時間の合計であるので、分割段をN ログN 。(乗法定数まで、対数の底は無関係です。)log2(n)nlog(n)

式()に入れて、このようなアルゴリズムの実行時間を推定する1つの方法は、それを再帰的に表現することです:T n = 2 T n / 2 + Θ n 。このアルゴリズムは線形時間よりも時間がかかることは明らかであり、nで除算することでどれだけ長くなるかを見ることができます: T n T(n)T(n)=2T(n/2)+Θ(n)nのn倍、TN/N一定量だけ増加:TN/Nが増加する対数、すなわち、TN=ΘNログN

T(n)n=T(n/2)n/2+Θ(1)
nT(n)/nT(n)/nT(n)=Θ(nlogn)

これは、より一般的なパターンのインスタンスです:マスター定理。サイズのその入力分割任意の再帰的アルゴリズムのにサイズの片N / Bを、時間かかりF nは分割及び再結合を行うために、実行時間を満たすT N = T N / B + f n 。値に依存閉形このリードとBとの形状nan/bf(n)T(n)=aT(n/b)+f(n)ab。もし = B及び F N = Θ N 、マスタ定理状態すなわち T N = Θ N ログN fa=bf(n)=Θ(n)T(n)=Θ(nlogn)


1
要約すると、一度に一定の割合の探索空間を排除するアルゴリズムは、対数項を示します。他の要因は、アウェイを行うのにかかる時間に依存します。
ラファエル

1
例:クイックソート平均ケースO(nlogn)
vzn

11

時間を要する他の2つのアルゴリズムのカテゴリー:Θ(nlogn)

各アイテムが順番に処理され、各アイテムの処理に対数時間がかかるアルゴリズム(HeapSortまたはプレーンスイープ計算ジオメトリアルゴリズムの多く)。

実行時間が処理の前処理ステップによって支配されるアルゴリズム。(たとえば、最小スパニングツリーのクラスカルのアルゴリズムでは、最初のステップとしてエッジを重みでソートできます)。


最初の段落に賛成。2番目の方法は冗長であるように見えます。なぜなら、私たちが知っているリニアリズムのソートアルゴリズムは、分割統治法またはヒープソート法だからです。最初のカテゴリの例は、サイズnのバイナリ検索ツリー(またはソートされた配列)でのオブジェクトの検索です。ただし、より抽象的なレベルでは、分割と征服と見なすこともできます。nn
ラファエル

@Raphaelソートは、すでに指定された実行時間のカテゴリでは冗長であることを知っています。ポイントは、並べ替えが「ボトルネック」である場合があり、並べ替えが必要なため、最初は問題が並べ替えに関する問題ではないアルゴリズムが実行時のままである場合があることです。
ジョー

9

別のカテゴリー:出力のサイズがであり、したがってΘ n log n )の実行時間が出力サイズで線形であるアルゴリズムΘ(nlogn)Θ(nlogn)

そのようなアルゴリズムの詳細は、しばしば分割統治法を使用しますが、必ずしもそうする必要はありません。ランタイムは基本的に質問されていることから来るので、別に言及する価値があると思います。

これは、拡張されたバイナリ検索ツリーに基づくデータ構造で発生します。各ノードは、そのノードのサブツリーの葉を検索するための線形サイズのデータ​​構造を格納します。このようなデータ構造は、幾何学的範囲の検索で頻繁に発生し、多くの場合、分解スキームに基づいています。Agarwal's Surveyを参照してください。

O(nlogn)O(logn)


θ(nlogn)


5

これらは通常、「分割して征服する」種類のアルゴリズムであり、サブソリューションを分割して結合するコストは「大きすぎません」。見てくださいこのFAQ再発の種類は、この動作を生じさせるかを確認します。



-1

O(nlogn)

for (i = 0; i < constant; i++){
    for(j = 0; j < n; j++){
        // Do some O(1) stuff on the input
    }
}

// Alternative Variant:
for (i = 0; i < constant; i++){
    for(j = n; j < constant; j++){
        // Do some O(1) stuff on the input
    }
}

O(n2)

このループを使用するアルゴリズムの具体的な例を挙げることはできませんが、カスタムアルゴリズムをコーディングするときに頻繁に発生します。


O(nlogn)Θ(n)Θ(1)Θ(|n|)n

O(nlogn)

さらに、元の質問はビッグシータを要求しませんでした。
ニコラスミアリ

1
O(nlogn)O(22n)O(almost anything else)Θ(nlogn)O(nlogn)
デビッドリチャービー

O(nlogn)O(nlogn)O(nlogn)O(nlogn)
ニコラスミアリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.