web-dev-qa-db-ja.com

ソートされていない配列のバイナリ検索の時間の複雑さ

私は2つの時間の複雑さで立ち往生しています。並べ替えられた配列でバイナリ検索を行うには、O(logN)を使用します。したがって、並べ替えられていない配列を検索するには、まずO(NlogN)になるように並べ替える必要があります。したがって、O(N))のように複雑さを与えるバイナリ検索を実行できますが、O(NlogN)である可能性があることを読みました。どちらが正しいですか?

11
user1521306

バイナリ検索は、「並べ替え」リスト用です。複雑さはO(logn)です。

バイナリ検索は、「ソートされていない」リストでは機能しません。これらのリストについては、最初の要素から直接検索を行います。これはO(n)の複雑さを与えます。 MergeSortまたはその他のO(nlogn)アルゴリズムを使用して配列をソートする場合、複雑度はO(nlogn)になります。

O(logn) < O(n) < O(nlogn)

25
LuiNova

あなたの質問への答えはあなたの質問自体の中にあります。

最初にリストをソートしています。クイックソートまたはマージソートを使用してリストをソートすると、複雑度はo(n*log n)になります。パート-1は乗り越えます。

バイナリ検索の実行の2番目の部分は、「並べ替えリスト」で行われます。二分探索の複雑さはo(log n)です。したがって、最終的にプログラムの複雑さはo(n*log n)のままです。

ただし、配列の中央値を計算する場合は、リストを並べ替える必要はありません。線形または順次検索の単純なアプリケーションは、それを支援することができます。

2
yuvrajm

線形探索の時間の複雑さはO(n)であり、二分探索の時間の複雑さはO(log n)です(log base-2)。並べ替えられていない配列があり、これにバイナリ検索を使用する場合は、最初に配列を並べ替える必要があります。そしてここでは、配列をソートするためにO(n logn)を費やしてから、要素を検索するために時間を費やす必要があります。

0
Akash saha