、、およびような複雑さを十分に把握していると思います。
リストに関しては、は定数ルックアップなので、リストの先頭を取得するだけです。 はリスト全体を検索する場所であり、はリスト内の各要素に対して1回ずつリストを検索します。
と間のどこかにあることを知る以外に、を把握する同様の直感的な方法はありますか?
、、およびような複雑さを十分に把握していると思います。
リストに関しては、は定数ルックアップなので、リストの先頭を取得するだけです。 はリスト全体を検索する場所であり、はリスト内の各要素に対して1回ずつリストを検索します。
と間のどこかにあることを知る以外に、を把握する同様の直感的な方法はありますか?
回答:
複雑さは、通常、小分けに接続されています。リストを例として使用する場合、要素がソートされているリストを想像してください。このリストは時間で検索できます-リストのソートされた性質のため、実際に各要素を見る必要はありません。O(log n )
リストの中央にある要素を見て、検索する要素と比較すると、配列の左半分にあるのか右半分にあるのかすぐにわかります。次に、これを半分だけ取り、見つけるまで手順を繰り返すか、簡単に比較できる1つの項目のリストに到達します。
リストが各ステップを効果的に半分にしていることがわかります。つまり、長さリストを取得する場合、1項目リストに到達するために必要な最大ステップはです。個のアイテムのリストがある場合、必要なステップはだけですリストの場合、必要なステップはだけです。5 128 = 2 7 7 1024 = 2 10 10
ご覧のとおり、指数は常に必要なステップ数を示しています。対数は、この指数を正確に「抽出」するために使用されます(例:。また、2のべき乗ではない長さをリストするように一般化します。2 n log 2 2 10 = 10
O(log n)
、リストに一定時間のランダムアクセスがある場合のみであることに注意してください。より一般的なリストの実装(リンクリスト)では、これはO(n log n)
(バランスのとれた)ツリー(たとえば、二分木なので、すべてのはベース2です):
以下のために可能にするために、あなたはに関連して、いくつかの任意の量によって比例問題のサイズを削減できるようにする必要があります、一定時間操作で。n
たとえば、バイナリ検索の場合、比較操作ごとに問題のサイズを半分に削減できます。
さて、問題のサイズを半分に削減する必要がありますか、実際にはありません。アルゴリズムがあるそれは限り、それはだ割合と、それは大きさが一定の問題を削減するために使用する操作として、0.0001%で、問題の探索空間を削減することができても、アルゴリズム、高速アルゴリズムではありませんが、非常に大きな定数を持つままです。(ベース2ログでについて話していると仮定)O (log n )O (log n )log n
10進数を2 進数に変換するアルゴリズムについて考える
while n != 0:
print n%2,
n = n/2
このwhile
ループは回実行されます。
はい、間にある及び、それはに近い以上。とは何ですか?対数関数は、べき乗の逆関数です。べき乗から始めましょう。対数とは何かをよりよく理解できるはずです。1 n 1 n log (n )
とつの数値を考えます。は、倍の倍です。多少の努力で個の数字を数えることができますが、を数えることはできますか?できませんね。どうして?は非常に大きいため、宇宙のすべての原子の数よりも大きくなります。少し考えてみてください。これは膨大な数であるため、各原子に名前(番号)を付けることができます。そして、あなたの指の爪の原子の数は、おそらく数十億のオーダーです。 は誰にとっても十分なはずです(しゃれ:)。2 100 2 100 2 100 100 2 100 2 100 2 100
ここで、2つの数値と、は対数です(底)。はよりも比較的小さい数です。誰もが自分の家に種類のアイテムを持っているべきです。しかし、宇宙にはで十分です。と考えるとき、家と宇宙を考えてください。2 100 100 2 100 2 100 100 2 100ログ(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 1024?あなたは私を信頼していない場合はカウントが、それはに等しいである。今、10の都市があり、1つの都市から次の都市への2つのパスがあり、それらが直線上にあるように配置されている場合。最初から最後までいくつのパスがありますか?あなたが私を信用していない場合はそれらを掛けますが、、つまりがあることを伝えます。ことを見るの指数関数的な結果である、及びの対数で。は比べて小さい数値です。
対数関数であり何にある(ご注意対数のベースです)。あなたはmultipy場合自身で回(そのノート対数のベースである)あなたが得る。は非常に小さく、と比べて非常に小さいので、は宇宙のサイズです。n n 2 n 2 log b(n )b b n log (n )n n
実際には、関数は定数関数と非常によく似た働きをします。それらはとともに成長しますが、非常にゆっくりと成長します。1日前にかかっていた対数時間で実行するようにプログラムを最適化した場合、おそらく数分で実行されます。Project Eulerの問題を確認してください。n
我々が持っている場合は除算を、アルゴリズムを征服し、私たちは部分問題のために一つだけの再帰呼び出しを行い、それが第二ケースであるマスターの定理、非再帰部分の時間計算量、すなわち、ある、アルゴリズムの複雑さはます。Θ (lg k + 1 n )
言い換えれば、現在の問題の定数因子であるサイズの問題でそれ自体への再帰呼び出しを1つ持つ分割統治アルゴリズムがあり、非再帰部分の時間が(定数)である場合、アルゴリズムの実行時間はます。lg n
バイナリサーチアルゴリズムは、古典的な例です。
直観とは、数を半分にすることができる回数、たとえばnが1に減る前にO(lg n)になることです。
視覚化するために、バイナリツリーとして描画し、この幾何学的な進行を解いてレベルの数を数えます。
2^0+2^1+...+2^h = n