web-dev-qa-db-ja.com

(n log n)のBig Oh

私は現在Big Ohの基本的なアルゴリズムを研究しています。 Java Big Ohを使用した場合のコード(n log n)はどのようなものか、またはSO存在する場所。

私は初心者なので、コードを書く前に想像するしかありません。したがって、理論的には(少なくとも)、n回のforループが含まれている必要があります。次に、ログnに対して、whileループを使用できます。したがって、ループはn回実行され、whileループはログベースで2回実行されます。少なくともそれは頭の中でそれを想像している方法ですが、コードを見ると事が明らかになります。

14
_int n = 100
for(int i = 0; i < n; i++) //this loop is executed n times, so O(n)
{
    for(int j = n; j > 0; j/=2) //this loop is executed O(log n) times
    {

    }
}
_

説明:外側のforループは明確でなければなりません。 n回実行されます。次に内側のループに移ります。内側のループでは、nを受け取り、常に_2_で除算します。それで、あなたはあなた自身に尋ねます:_2_でnを何回除算できますか?

これはO (log n)であることがわかります。実際、logのベースは_2_ですが、Big-O表記では、興味のないlogに要素を追加するだけなので、ベースを削除します。

したがって、ループをn回実行し、そのループ内で別のループをlog(n)回実行します。したがって、O(n) * O(log n) = O(n log n)があります。

46
productioncoder

非常に一般的なO(n log n)アルゴリズムはマージソートです。 http://en.wikipedia.org/wiki/Merge_sort アルゴリズムと疑似コードの例。アルゴリズムのlog nの部分は、問題をより小さなサブ問題に分解することによって達成されます。この場合、再帰ツリーの高さはlog nです。

ソートアルゴリズムの多くは、O(n log n)の実行時間を持っています。その他の例については、 http://en.wikipedia.org/wiki/Sorting_algorithm を参照してください。

4
rcs

_log n_を含むO(.)時間の複雑さを伴うアルゴリズムは、通常、何らかの形の分割統治を伴います。

たとえば、 MergeSort の場合、リストは半分になり、各部分は個別にマージソートされてから、2つの半分がマージされます。各リストは半分です。

作業が半分になるか、サイズが固定されている場合は、通常、最終的にO(.)の_log n_コンポーネントになります。

コードに関しては、MergeSortのアルゴリズムを見てください。典型的な実装の重要な機能は、それが再帰的であることです(TopDownSplitMergeはWikipediaで提供されているコードで自分自身を2回呼び出すことに注意してください)。

すべての優れた標準の並べ替えアルゴリズムはO(n log n)の時間の複雑さを備えており、最悪の場合にはこれ以上のことはできません。 比較並べ替え を参照してください。

Javaコードでこれがどのように見えるかを確認するには、単に searchこれが1つの例です です。

2
Daniel Renshaw

http://en.wikipedia.org/wiki/Heapsort

単純な例は、あなたが説明したのと同じです-log(n)時間を要する操作をn回実行します。バランスのとれた二分木はlog(n)の高さを持っているため、一部のツリーアルゴリズムはそのような複雑さを持っています。

1
mabn