私は現在Big Ohの基本的なアルゴリズムを研究しています。 Java Big Ohを使用した場合のコード(n log n)はどのようなものか、またはSO存在する場所。
私は初心者なので、コードを書く前に想像するしかありません。したがって、理論的には(少なくとも)、n回のforループが含まれている必要があります。次に、ログnに対して、whileループを使用できます。したがって、ループはn回実行され、whileループはログベースで2回実行されます。少なくともそれは頭の中でそれを想像している方法ですが、コードを見ると事が明らかになります。
_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)
があります。
非常に一般的な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 を参照してください。
_log n
_を含むO(.)
時間の複雑さを伴うアルゴリズムは、通常、何らかの形の分割統治を伴います。
たとえば、 MergeSort の場合、リストは半分になり、各部分は個別にマージソートされてから、2つの半分がマージされます。各リストは半分です。
作業が半分になるか、サイズが固定されている場合は、通常、最終的にO(.)
の_log n
_コンポーネントになります。
コードに関しては、MergeSortのアルゴリズムを見てください。典型的な実装の重要な機能は、それが再帰的であることです(TopDownSplitMerge
はWikipediaで提供されているコードで自分自身を2回呼び出すことに注意してください)。
すべての優れた標準の並べ替えアルゴリズムはO(n log n)
の時間の複雑さを備えており、最悪の場合にはこれ以上のことはできません。 比較並べ替え を参照してください。
http://en.wikipedia.org/wiki/Heapsort
単純な例は、あなたが説明したのと同じです-log(n)時間を要する操作をn回実行します。バランスのとれた二分木はlog(n)の高さを持っているため、一部のツリーアルゴリズムはそのような複雑さを持っています。