並べ替えられた配列のリストの中央値を見つける


8

入力:(数値の)配列 セット。 各配列内の要素は並べ替えられていますが、配列のセットは必ずしも並べ替えられていません。配列は必ずしも同じサイズである必要はありません。要素の総数はです。A I N

出力:入力のすべての要素のうち最小番目の要素。k

この問題の最も効率的なアルゴリズムは何ですか?

たとえば、実行時間を達成することは可能ですか?O+ログ


SOには非常に密接に関連する質問があり、満足のいく答えは得られません。
ジョー

すべての長さが同じですか?
フォンブランド2013

配列は必ずしも同じサイズである必要はありません。ただし、サイズが幾何学的である特別なケースにも興味があります。つまり、配列サイズは/2ですが、実行時間に役立つとは思えません。
ジョー

4
どのようにを取得しますか?「quickselect」アルゴリズムをエミュレートすることでを取得できます。各フェーズでは、ピボットを選択し、その下にある要素の数を計算します。次に、反対側の要素を削除して、繰り返します。プロセスは回の反復後に終了します(予想どおり、またはピボットをスマートに選択した場合は最悪の場合)。O ログN 2O ℓのログN ログNOログOログ2Oログログ
Yuval Filmus 2013

2
@Joeアルゴリズムについても説明する必要があると思います。これは非常に興味深いものであり、正しければ、より優れたアルゴリズムの出発点になるでしょう。正しくないと、エラーを見つけることができる可能性があります。
Paresh 2013

回答:


5

次のように時間と余分なスペースでそれを行うことができます:O l O(l+k log l)O(l)

  1. 配列ごとに1つのエントリを持つバイナリヒープを構築します。エントリのキーは、配列最小の要素です。これには時間かかります。A i O l iAiOl
  2. ヒープから最小のエントリを選択して削除します()時間かかります)。関連する配列の次に小さいエントリをキーとして(再び時間を使用して)、そのエントリをヒープに戻し。O log  l Oログ lO(log l)
  3. 前のステップを回実行します。ヒープから削除する最後の要素はあなたの答えです。k

バイナリヒープをフィボナッチヒープに置き換えると、償却済みの時間になると思いますが、実際には、が巨大でない限り、バイナリヒープよりも遅くなります。O(l+k)l

フィボナッチヒープ境界が最適であると思います。直観的には、番目に小さい要素を見つけるために少なくとも要素を検査する必要があり、それぞれから少なくとも1つの要素を検査する必要があるためです。配列のソート方法がわからないため、配列はすぐに下限を与え。kklΩ(max(k,l))=Ω(k+l


3
配列はソートされているため、少なくとも要素を検査する必要はありません。を与える私のコメントの解決策を参照してください。kOログ2
Yuval Filmus、2013

1
要素に優先キューを実装できるため、RAMモデルで最悪の場合の実行時間を改善できます。このモデルでは、挿入と削除の両方の操作と、findMin操作の時間を達成できます。no(lognOlogログO1
Massimo Cafaro、2013

1
Fibonnaciヒープが正しい操作をサポートしていることを確信していますか?私はあなたが最小ヒープの減少キーを考えていると思います。
ジョー

これは基本的にはvonbrandの回答と同じですが、k番目の要素の後に要素をマージする必要がないという追加の観察があります。
ジョー

フィボナッチヒープを使用すると、時間でキーを増減できます。はい、これは基本的に同じ答えですが、k要素のみをマージする必要があることを確認すると、ランタイムが公平に下がります。O(1)k
Matt Lewis

5

ここでランダム化されるアルゴリズム。通常のクイック選択を非ランダム化するために使用されるのと同じトリックを使用して、おそらくランダム化解除できます。O(log2n)

従来のクイック選択アルゴリズムをエミュレートします。各フェーズでは、あなたは、多くの要素がその下にあるかピボットと計算を選ぶ各リストでのバイナリ検索を使用して、。次に、反対側の要素を削除して、繰り返します。プロセスはlog n回の反復が予期された後に終了しますO(logn)logn


1

これは、STOC '80のFredericksonとJohnsonによる論文Generalized selection and rank (Preliminary Version)によって解決されるようです。

:彼らはの上限および下限を与える いることが判明ℓのログN最もアレイサイズ分布のために。Θ(+i=1log|Ai|)logn

上限を達成するための実際のアルゴリズムは、以前の論文で明らかに示されてい ます。第13回情報科学およびシステムに関する年次会議、ジョンズホプキンス大学(1979)47-52。


0

-wayマージは時間かかりΘ N ログℓは(各リストの先頭要素の優先度キューを表すために効率的な方法を使用して)、あなたが選んK定数時間で番目の要素を。これについては、Knuthの「並べ替えと検索」で説明されていると思います。最小(または最大)を取得するには、明らかにΘ が必要です。ソートされていない配列の場合、それはO n IIRCです。Θ(nlog)kΘ()O(n)

アルゴリズムを説明してください。


1
これは、私が興味を持っているよりも遅いです。リストを連結し、線形時間選択アルゴリズムを使用するだけで、時間の中央値を見つけることができます。O
ジョー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.