部分ソートは配列のルックアップコストに役立ちますか?


7

並べ替えられていないリストで何かを調べることは、時間の複雑さ伴うタスクです。ただし、リストがソートされている場合、時間の複雑さはです。つまり、配列を並べ替える価値がある場合があります。ただし、ソートアルゴリズムの時間の複雑さはであるため、これはトレードオフです。O(n)O(log(n))O(nlog(n))

私の知る限り、配列を 時間未満でソートすることはできません。しかし、それよりも短い時間で部分的に配列をソートできるアルゴリズムがあるかどうか疑問に思っていますか?私はあなたが時間でそのような部分的にソートされた配列の値を検索できないと確信していますが、よりもうまくできますか?O(nlog(n))O(log(n))O(n)

つまり、よりも高速なアルゴリズムでソートされていない配列を処理して、ルックアップアルゴリズムがよりも高速に検索できるようにすることは可能ですが、ほど高速ではありません?O(nlog(n))O(n)O(log(n))


私は、どこかに非常に基本的なエラーや誤解があるかもしれないことを知っています。私はコンピュータサイエンスを勉強したことがないので、表記に慣れていません。O
SE-

2
リストは時間でソートできます。O(nlogn)
Rick Decker

1
正確に何を探しているのかは少しわかりませんが、クイックソート-中央ピボットバージョンを使用します(中央オーバーヘッドと引き換えにnlognで動作することが保証されています。これで、手順の半分を実行できます。これにより、データはパーティション化され、すべてのパーティション要素はソートされたインデックスから遠くないですが、ルックアップ中にパーティションをトラバースする必要があります
Evil

2
「部分的にソートされた」という意味を正確に定義してください。文献には、ソートの概念について多くの競合する概念があります。
ラファエル

1
「それはより速くアルゴリズムでソートされていない配列を処理することができるO(nlog(n))検索アルゴリズムは、より高速検索を行うことができるようなO(n)たぶん」。「部分ソートは配列のルックアップコストに役立ちますか?」絶対にありません(1回の検索の場合)。
Mooing Duck 2016

回答:


12

「すべてのステップで正確な中央値を使用して」「バランスのとれたクイックソート」を深さ(犠牲にして)まで実行すると、元の配列のパーティションがソートされた部分に分割されます未ソートの要素。要素を考えると、我々は正しいタイムでパート見つけることができますバイナリ検索を使用して、その後、追加使用してそれを見て、Aのために総複雑度。kO(nk)2kn/2kO(log(2k))=O(k)O(n/2k)O(n/2k+k)

もし k=o(logn) 部分的なソートには時間がかかります o(nlogn)。もしk=ω(1) ルックアップアルゴリズムには時間がかかります o(n)。したがって、1klogn 我々が得る o(nlogn) 前処理時間と o(n)ルックアップ時間。たとえば、k=loglogn その後、前処理に O(nloglogn) そしてルックアップは O(n/logn)


2
バランスの取れたクイックソートがターゲット値を認識していて、ターゲット値のある側でのみ再帰する場合、完全な深さになるまでの時間は〜4nです。これがC ++のstd::partial_sort実装方法です。
Mooing Duck 2016

別の方法は、不完全な基数ソートです。前処理時間はより速くなる可能性がありますが、バケットサイズの制御が少なくなります。プレフィックス完全ハッシュについても同様のコメントを行うことができます。
エリックタワーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.