web-dev-qa-db-ja.com

実行時の複雑さを本当に理解するのに最適なリソース

特定のタイプのコードO(n)およびO(n ^ 2)を作成するものなど、ランタイム分析の基本に精通していますが、実際に学習するのに苦労しています、 O(n log n)やO(2 ^ n)などの他の複雑さで実行されるコードの一部を分析する方法を理解し、本当に覚えています。これらの他の複雑さがどのように機能するかを簡単な言葉で説明するリソースを探しています問題を実践して、私の理解を本当に強めます。

4
jmnwong

ここでさらに深い問題は、アルゴリズム分析だと思います。アルゴリズムで実際に何が行われているのかがわかっていれば、アルゴリズムの実行時の複雑さは簡単にわかります。

Introduction to Algorithms のような本は、必要なすべてのツールと十分な練習問題を提供します。 最初の答えはここ を見て、異なるランタイム。

ただし、全体として、練習は完璧です。 2つの数値を乗算する場合、乗算がどのように機能するかを「覚えていない」-それは2番目の性質であるため、乗算するだけです。十分なアルゴリズムを分析したら、実際に何が起こっているのかを理解することになります。アルゴリズム分析がどのように機能するかを「記憶」する必要はありません。アルゴリズムを見て、何が起こっているのかを見て、何が起こっているのかを理解するだけです。

8
BlackJack

私にとってうまくいくのは、情報理論について少し知ることです。特に、プログラムが次のようなIFステートメントを実行すると、

if (test){
  ... code A ...
} else {
  ... code B ...
}

testには、一定の確率Pがtrueであり、1-Pがfalseであることがあり、その分岐を行うときに(プログラムカウンターに)取得される情報はI = log(1/P)(基数2)。

Pが0.5である場合(偽としてtrueである可能性が高い)、I = log(2)= 1はどの分岐が実行されても関係ありません。これは、プログラムカウンターがその選択を行うときに「学習」する量です。

さて、エントロピー(恐ろしい言葉、私は知っています)は、すべてのブランチにわたって得られた平均情報です。したがって、ブランチは実行時に1ビットの作業を実行すると言えます。

Pが0.5でないとします。 1024エントリのテーブルで線形検索を行っているとします。最初に行うテストでは、「0番目のエントリは私が探しているエントリですか?」とあります。答えが本当にどこにでもある場合、P = 1/1024、1-P = 1023/1024になります。

したがって、探している要素が最初の要素である場合は、log(1024)= ten bitsが得られますが、そうでない場合は、log(1024/1023)のみが得られます。本質的にはゼロビットです。エントロピーとは何ですか?これは、各ブランチで得た情報の合計に、そのブランチの確率を掛けたものです。これは1/1024 * 10 + 1023/1024 * 0で、約1/102.4です。そのテストは、平均で100分の1ビット未満しか「学習」しません。

1024エントリのテーブルで要素を見つけるには、10ビットを学習する必要があるため、線形検索が遅い理由がわかります。実際、Nが学習する必要のあるビット数である場合、それは指数関数的です!

そのため、同様に可能性の高いバイナリディシジョンポイントに基づく検索はO(logN)になります。それよりも速く検索する方法はindexingです。ここにインデックスがあり、それを使用して配列の要素を見つけます。配列が1024要素の長さである場合、それは結果が1024の決定点のようなものです。それらがすべて同じように可能性がある場合、エントロピーは何ですか?それは1/1024 * log(1024)+ 1/1024 * log(1024)...であり、1024項では-ten bitsになります。 1回の操作で10ビットすべてを学習します。

OK、並べ替えはどうですか? N個のアイテムがある場合、各アイテムが配列のどこに属するかを検索する必要があるため、基本的には検索のN倍のコストがかかります。簡単にすることはできません。

3
Mike Dunlavey