対数複雑度のアルゴリズムの直観


60

、、およびような複雑さを十分に把握していると思います。O(1)Θ(n)Θ(n2)

リストに関しては、は定数ルックアップなので、リストの先頭を取得するだけです。 はリスト全体を検索する場所であり、はリスト内の各要素に対して1回ずつリストを検索します。O(1)Θ(n)Θ(n2)

と間のどこかにあることを知る以外に、を把握する同様の直感的な方法はありますか?Θ(logn)O(1)Θ(n)


8
バイナリ検索を考える:ログのn「検索」のためである
スレシュ

2
を使用してこの質問をするのは、上限を示すだけなので、正しくありません。たとえば、定数時間はです。方が適切です。メタ質問を参照してください:meta.cs.stackexchange.com/questions/182/...OO(logn)θ
アリヤバータ

1
SOに関するさらに詳しい情報:何をん正確に意味ですか?O(logn)
ランG.

ちょっとした注意:従来のチューリングマシンの設定では、すべてのアルゴリズムはです。これは、入力の各シンボルを少なくとも1回読み取る必要があるためです。たとえば、リストがソートされるという約束があるため、でバイナリ検索を実行できます。Ω(n)O(logn)
-chazisop

1
後半に貢献:定義によって、ベース数の対数あなたが掛けちょうど回数である取得するためにそれ自体で。。例えば、。したがって、数値あり、達するまで割るだけです(簡単にするため、は累乗であると仮定します)。分割数はと等しくなります。この除算動作を示すアルゴリズムの実行時間はn b n b l = nbnbn2 3 = 8bl=nl=logb(n)n l o g bn = b 1 n b l o g bn O l o g n 23=8log2(8)=3nlogb(n)=?b1nblogb(n)O(log(n))
saadtaame

回答:


54

複雑さは、通常、小分けに接続されています。リストを例として使用する場合、要素がソートされているリストを想像してください。このリストは時間で検索できます-リストのソートされた性質のため、実際に各要素を見る必要はありません。Olog n Θ(logn)O(logn)

リストの中央にある要素を見て、検索する要素と比較すると、配列の左半分にあるのか右半分にあるのかすぐにわかります。次に、これを半分だけ取り、見つけるまで手順を繰り返すか、簡単に比較できる1つの項目のリストに到達します。

リストが各ステップを効果的に半分にしていることがわかります。つまり、長さリストを取得する場合、1項目リストに到達するために必要な最大ステップはです。個のアイテムのリストがある場合、必要なステップはだけですリストの場合、必要なステップはだけです。5 128 = 2 7 7 1024 = 2 10 10325128=2771024=21010

ご覧のとおり、指数は常に必要なステップ数を示しています。対数は、この指数を正確に「抽出」するために使用されます(例:。また、2のべき乗ではない長さをリストするように一般化します。2 n log 2 2 10 = 10n2nlog2210=10


4
これはO(log n)、リストに一定時間のランダムアクセスがある場合のみであることに注意してください。より一般的なリストの実装(リンクリスト)では、これはO(n log n)
asm

1
ポインターがないため、リストでのバイナリ検索は機能しません。通常、配列で行われます。
ラファエル

バイナリ検索はリストでうまく機能します。必須/有用/実用よりもはるかに複雑であるため、まったく意味がありません。
アントン

@AndrewMyersリンクリストの検索は、より正確にO(n)
-phant0m

1
@ phant0mええ、毎回先頭から移動するのではなく、現在の位置から移動していると仮定していることを理解するために少しかかりました。
asm

38

(バランスのとれた)ツリー(たとえば、二分木なので、すべてのはベース2です):log

  • Θ(1)はツリーのルートを取得しています
  • Θ(logn)は、ルートからリーフへのウォークです
  • Θ(n)はツリーのすべてのノードを走査しています
  • Θ(n2)は、ツリー内の2つのノードのすべてのサブセットに対するアクションです。たとえば、2つのノード間の異なるパスの数です。
  • k kΘ(nk)ノードのサブセットに対する上記の一般化(定数)kk
  • K = 1 2 ... n個Θ(2n)は、ノードのすべての可能なサブセット(すべての可能なサイズのサブセット、つまり)に対するアクションです。たとえば、ツリーの異なるサブツリーの数。k=1,2,,n

5
これに追加するために、直感は次の2つから得られます。1)繰り返しおよび2)サイズ何か、つまり木の高さでのバイナリ検索。T n = T Θ(loglogn)lognT(n)=T((n))+1log(n)
mcorley

17

以下のために可能にするために、あなたはに関連して、いくつかの任意の量によって比例問題のサイズを削減できるようにする必要があります、一定時間操作で。nO(logn)n

たとえば、バイナリ検索の場合、比較操作ごとに問題のサイズを半分に削減できます。

さて、問題のサイズを半分に削減する必要がありますか、実際にはありません。アルゴリズムがあるそれは限り、それはだ割合と、それは大きさが一定の問題を削減するために使用する操作として、0.0001%で、問題の探索空間を削減することができても、アルゴリズム、高速アルゴリズムではありませんが、非常に大きな定数を持つままです。(ベース2ログでについて話していると仮定)O log n O log n log nO(logn)O(logn)O(logn)logn


1
「ダウンカット量」が一定でない場合はどうなりますか?
-15:

@Svish問題を正の割合で切り詰めることができれば、アルゴリズムのままになりますが、おそらく厳密な制約はなくなります。負の率は言うのが難しいです。この場合、答えはかなり単純になるように仮定されています。この質問には独自のメリットがあるため、これを質問として単独で質問することを歓迎します。O(logn)
ケン・リー

ええ、私は問題の検索スペースが常に減少したことを意味していましたが、必ずしも一定の速度ではありませんでした。「問題のサイズを削減するために使用する割合と操作が一定である限り、それはO(log n)アルゴリズムです」と考えていました。パーセンテージが一定でない場合、名前が異なる場合。
Svish

8

10進数を2 進数に変換するアルゴリズムについて考えるn

while n != 0:
   print n%2, 
   n = n/2

このwhileループは回実行されます。log(n)


1
確かにこのプログラムは回ループしが、一般に複雑さについて話すとき、は入力のサイズです。ここで、入力のサイズはすでにであるため、このプログラムは線形()のみであると言えますO f s s s = log n O s lognO(f(s))ss=lognO(s)
-jmad

@jmadそう。ただし、この例ではlog(n)を直感的に理解できます。
プラティックデオガレ

@jmad アルゴリズムを使用して乱数を生成することもできましたが、できるだけ単純にしたかったのです。
プラティックデオガレ

8

はい、間にある及び、それはに近い以上。とは何ですか?対数関数は、べき乗の逆関数です。べき乗から始めましょう。対数とは何かをよりよく理解できるはずです。1 n 1 n log n log(n)1n1nlog(n)

とつの数値を考えます。は、倍の倍です。多少の努力で個の数字を数えることができますが、を数えることはできますか?できませんね。どうして?は非常に大きいため、宇宙のすべての原子の数よりも大きくなります。少し考えてみてください。これは膨大な数であるため、各原子に名前(番号)を付けることができます。そして、あなたの指の爪の原子の数は、おそらく数十億のオーダーです。 は誰にとっても十分なはずです(しゃれ:)。2 100 2 100 2 100 100 2 100 2 100 2 100100210021002100100210021002100

ここで、2つの数値と、は対数です(底)。はよりも比較的小さい数です。誰もが自分の家に種類のアイテムを持っているべきです。しかし、宇宙にはで十分です。と考えるとき、家と宇宙を考えてください。2 100 1001002100100 2 100 2 100 100 2 100ログN N2100210021001002100log(n)n

べき乗と対数はどこから来ますか?なぜ彼らはコンピューターサイエンスにそれほど関心があるのでしょうか?気づかないかもしれませんが、べき乗はどこにでもあります。クレジットカードで利息を支払いましたか?あなたはあなたの家に宇宙を支払っただけです(それほど悪くはありませんが、曲線は合っています)。べき乗はプロダクトルールに由来すると考えるのが好きですが、他の例を挙げて歓迎します。プロダクトルールとは何ですか?そして答えます。

2つの都市と、それらの間を移動する2つの方法があるとします。それらの間のパスの数は何ですか?二。それは簡単です。ここで、別の都市があり、3つの方法でからに行くことができます。現在、と間にはいくつのパスがありますか?六、そうですか?どうやってそれを手に入れたの?それらを数えましたか?またはそれらを掛けましたか?いずれにせよ、どちらの方法でも同様の結果が得られることは簡単にわかります。4つの方法でから到達できる都市を追加すると、と間にはいくつの方法がありますかB C B C A C D C A D 2 3 4 24 2 10 1024 2 10 10 10 2 10 10 1024ABCBCACDCAD?あなたは私を信頼していない場合はカウントが、それはに等しいである。今、10の都市があり、1つの都市から次の都市への2つのパスがあり、それらが直線上にあるように配置されている場合。最初から最後までいくつのパスがありますか?あなたが私を信用していない場合はそれらを掛けますが、、つまりがあることを伝えます。ことを見るの指数関数的な結果である、及びの対数で。は比べて小さい数値です。2342421010242101010210101024

対数関数であり何にある(ご注意対数のベースです)。あなたはmultipy場合自身で回(そのノート対数のベースである)あなたが得る。は非常に小さく、と比べて非常に小さいので、は宇宙のサイズです。n n 2 n 2 log bn b b n log n n nlog2(n)nn2n2logb(n)bbnlog(n)nn

実際には、関数は定数関数と非常によく似た働きをします。それらはとともに成長しますが、非常にゆっくりと成長します。1日前にかかっていた対数時間で実行するようにプログラムを最適化した場合、おそらく数分で実行されます。Project Eulerの問題を確認してください。nlog(n)n


3
うまく書かれていますが、この回答には「 is really small」以外の情報はほとんど含まれていません。log(n)
ラファエル

3
私はそれがどれほど小さいかについて直観を与えようとしていました。
ラヴィ

5

テーマを継続するために、は、がリスト内のどこにあるかを繰り返し推測し、「インデックス」で「より高い」または「より低い」と言われるようなものです。xO(logn)x

まだリストのサイズに基づいていますが、ほんの一部の要素にアクセスするだけで済みます。


4

我々が持っている場合は除算を、アルゴリズムを征服し、私たちは部分問題のために一つだけの再帰呼び出しを行い、それが第二ケースであるマスターの定理、非再帰部分の時間計算量、すなわち、ある、アルゴリズムの複雑さはます。Θ lg k + 1 n Θ(lgkn)Θ(lgk+1n)

言い換えれば、現在の問題の定数因子であるサイズの問題でそれ自体への再帰呼び出しを1つ持つ分割統治アルゴリズムがあり、非再帰部分の時間が(定数)である場合、アルゴリズムの実行時間はます。lg nΘ(1)lgn

バイナリサーチアルゴリズムは、古典的な例です。


1

直観とは、数を半分にすることができる回数、たとえばnが1に減る前にO(lg n)になることです。

視覚化するために、バイナリツリーとして描画し、この幾何学的な進行を解いてレベルの数を数えます。

2^0+2^1+...+2^h = n

サイトへようこそ!もちろん、あなたの言うことは本当ですが、それが既存の答えに何を追加するのかわかりません。いくつかの回答では、対数は1を押す前に2で割ることができる回数であると既に述べています。Ranの回答では、は葉の二分木の高さであると既に述べてい。nlognn
デビッドリチャービー16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.