私は2つの時間の複雑さで立ち往生しています。並べ替えられた配列でバイナリ検索を行うには、O(logN)を使用します。したがって、並べ替えられていない配列を検索するには、まずO(NlogN)になるように並べ替える必要があります。したがって、O(N))のように複雑さを与えるバイナリ検索を実行できますが、O(NlogN)である可能性があることを読みました。どちらが正しいですか?
バイナリ検索は、「並べ替え」リスト用です。複雑さはO(logn)です。
バイナリ検索は、「ソートされていない」リストでは機能しません。これらのリストについては、最初の要素から直接検索を行います。これはO(n)の複雑さを与えます。 MergeSortまたはその他のO(nlogn)アルゴリズムを使用して配列をソートする場合、複雑度はO(nlogn)になります。
O(logn) < O(n) < O(nlogn)
あなたの質問への答えはあなたの質問自体の中にあります。
最初にリストをソートしています。クイックソートまたはマージソートを使用してリストをソートすると、複雑度はo(n*log n)
になります。パート-1は乗り越えます。
バイナリ検索の実行の2番目の部分は、「並べ替えリスト」で行われます。二分探索の複雑さはo(log n)
です。したがって、最終的にプログラムの複雑さはo(n*log n)
のままです。
ただし、配列の中央値を計算する場合は、リストを並べ替える必要はありません。線形または順次検索の単純なアプリケーションは、それを支援することができます。
線形探索の時間の複雑さはO(n)
であり、二分探索の時間の複雑さはO(log n)
です(log base-2)。並べ替えられていない配列があり、これにバイナリ検索を使用する場合は、最初に配列を並べ替える必要があります。そしてここでは、配列をソートするためにO(n logn)
を費やしてから、要素を検索するために時間を費やす必要があります。