2009-04-15 5 views
9

私の質問は投稿"Plain English Explanation of Big O"から発生します。私は対数的複雑さの正確な意味を知らない。私は、時間と操作数の間に回帰を行い、X二乗値を計算し、その複雑さを判断できることを知っています。しかし、私は紙の上でそれを迅速に判断する方法を知りたい。Big Oがいつ対数であるかを知る方法?

どのように対数の複雑さを決定しますか?良いベンチマークはありますか?

答えて

10

これが意味するものなのかどうかは分かりませんが、対数複雑さは通常、ルートに1つのノード、2つの子ノード、2つの子ノードが含まれているバランス型バイナリツリーのような分散型データ構造で作業する場合に発生します。 4人の孫、8人の曾孫など基本的には各レベルでいくつかの要素(2)が乗算されますが、そのうちの1つだけが反復に含まれます。あるいは別の例として、インデックスは各ステップで倍増したループ:そのような

for (int i = 1; i < N; i *= 2) { ... } 

物事は対数複雑さの署名です。

+0

+1非常に興味深いです。私はあなたの例のようなものをもっと探しています。アルゴリズムのlogartihmicは次のようになります。for(int i = BIG_number; i> N; i * = 1/2){...} –

+1

1/2は整数除算ではゼロですが、代わりに "i/= 2"を使用すると、 はい、そうです。 (それがあなたが疑問に思っている特定のアルゴリズムであれば、それはあなたの質問に含めることをお勧めしているかもしれません)。 –

5

Master theorem通常動作します。

+0

多少考えにくいですが、一度マスターすれば非常に良いです。 – samoz

14

厳密ではありませんが、基本的に各反復で必要な作業を半分に分けるアルゴリズムがあり、対数の複雑さがあります。古典的な例はバイナリ検索です。

+3

である必要はありません。私はあなたが暗示しようとしていることを理解していますが、仕事を半分に分けただけでは対数的な複雑さを意味するわけではありません。ソリューションの再結合の仕方と、分割された問題の解決方法についても注意する必要があります。組換え工程が支配的な場合が多い。マスター定理を参照するか、定理なしで再帰をより良く解く。単純な再発の下には多くの驚きがあります。 – unj2

+2

@unjaan:あなたは私を誤解していると思います。私は作品を半分に分けるというだけではなく、「各反復で半分の作業をする必要がある」と言いました。つまり、各ステップで前のステップと比較して残りの作業の半分が残っていれば、対数の複雑さがあります(作業の場合は計算を読み込みます)。 –

4

ログオフについて知りたいのであれば、再発の各段階の半分でデータがカットされるのを目の当たりにしてください。

これは、前のステップの1/2の大きさのデータを処理している場合、無限級数なので、これが原因です。

+2

必ずしも1/2である必要はありません。1/cは定数である限り動作します。 –

+1

しかし1/2がよりintuiativeです。 –

+0

よくBig Oについて語るとき、logはlog base 2を意味します。 – samoz

3

これは別の言い方です。

アルゴリズムが問題のサイズの桁数で線形であるとします。だから、おそらく、あなたは数字の数が線形であることを示すことができる、大きな数を因数分解する新しいアルゴリズムを持っています。これにより、20桁の数字は、アルゴリズムを使用して10桁の数字の2倍の長さになります。これにはログの複雑さがあります。 (そしてそれは発明者のために何か価値があるだろう)

二重セクションは同じ振る舞いをしています。間隔の長さを1024 = 2^10の倍数にするには、約10分の2分の1ステップを要しますが、20ステップだけで、間隔は2^20分だけ短縮されます。

ログの複雑さは、必ずしもすべての問題でアルゴリズムが高速であるとは限りません。 O(log(n))の前の線形因子は大きいかもしれません。だからあなたのアルゴリズムは、小さな問題ではひどいかもしれませんし、他のアルゴリズムが指数関数的な(または多項式)死で死ぬまで問題の大きさがかなり大きくなるまで有効にならないかもしれません。

+0

大きな問題の大きさでよく説明されています。 –