回答:
私はO(n)を知っています、あなたは通常単一のループを持っています。O(n ^ 2)は二重ループです。O(n ^ 3)はトリプルループなどです。O(log n)はどうですか。
あなたは本当にここで間違った方法で行っています。どのbig-O式が特定のアルゴリズム構造に適合するかを記憶しようとしていますが、実際にアルゴリズムが必要とする操作の数をカウントアップし、それを入力のサイズと比較する必要があります。入力全体をループするアルゴリズムは、単一のループではなく、ループをn回実行するため、O(n)パフォーマンスを備えています。O(log n)パフォーマンスの単一ループを次に示します。
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
したがって、必要な操作の数が入力サイズの対数のオーダーであるアルゴリズムはO(log n)です。big-O分析が示す重要なことは、アルゴリズムの実行時間が入力のサイズに対してどのように変化するかです:入力のサイズを2倍にすると、アルゴリズムはさらに1ステップ(O(log n))かかります、2倍のステップ(O(n))、4倍のステップ(O(n ^ 2))など。
入力を繰り返しパーティション化するアルゴリズムは、通常、パフォーマンスのコンポーネントとして「log n」を持っていることを経験から知るのに役立ちますか?はい。しかし、パーティションを探して、アルゴリズムのパフォーマンスがO(log n)であるという結論にジャンプしないでください。O(n log n)のようなものかもしれません。
アルゴリズムはO(log n)
、構造を1 x 1でスクロールする代わりに、構造を何度も何度も分割し、分割ごとに一定数の操作を行う場合のアルゴリズムです。回答スペースが分割され続ける検索アルゴリズムはO(log n)
です。この例はバイナリ検索です。ここでは、番号が見つかるまで順序付けられた配列を何度も何度も分割し続けます。
注:必ずしも半分に分割する必要はありません。
log n
、人々のトリガーされたバイナリ検索反射について言及しているだけです。
典型的な例は、バイナリ検索を扱うものです。たとえば、バイナリ検索アルゴリズムは通常O(log n)
です。
バイナリ検索ツリーがある場合、検索、挿入、削除はすべてO(log n)
複雑です。
スペースを継続的にパーティション分割する状況には、多くの場合、log n
コンポーネントが関係します。多くのソートアルゴリズムがO(nlog n)
複雑になるのは、このためです。多くの場合、セットを分割し、進行するにつれてソートするからです。
アルゴリズムがO(log N)であるかどうかを識別する簡単な方法があるかどうかを知りたい。
さて、実行して時間を計ってください。入力1.000、10.000、100.000および100万に対して実行します。
実行時間が3,4,5,6秒(または数倍)のように見える場合は、O(log N)と安全に言うことができます。それがより多くの場合:1,10,100,1000秒なら、おそらくO(N)です。そして、3,40,500,6000秒のような場合、O(N log N)です。