[解決済み】10億個の数字の配列から最大100個の数字を求めるプログラムを作成せよ
質問
先日、面接で「10億個の数字の配列から最大100個の数字を求めるプログラムを作成せよ」と問われました。
私は、時間計算量O(nlogn)で配列をソートし、最後の100個の数字を取り出すというブルートフォース・ソリューションしか与えることができなかった。
Arrays.sort(array);
面接官はより良い時間複雑性を求めていました。私は他の解決策をいくつか試しましたが、彼に答えることはできませんでした。より良い時間複雑性の解決策はありますか?
どのように解決するのですか?
100個の大きな数字の優先キューを用意しておき、10億個の数字を繰り返し処理し、キュー内の最小の数字(キューの先頭)より大きな数字に出会うたびに、キューの先頭を削除し、新しい数字をキューに追加すればよいのです。
EDIT
Devが指摘したように、ヒープで実装された優先キューでは、キューへの挿入の複雑さは
O(log N)
最悪の場合、次のようになります。
billion*log2(100)
よりも優れています。
billion*log2(billion)
一般に、N個の数の集合から最大のK個の数が必要な場合、その複雑さは
O(N log K)
よりも
O(N log N)
これは、KがNに比べて非常に小さい場合、非常に大きな意味を持つことがあります。
EDIT2です。
このアルゴリズムの期待時間は、各反復で挿入が起こるかもしれないし起こらないかもしれないので、かなり興味深いです。i 番目の番号がキューに挿入される確率は、ランダム変数が少なくとも
i-K
同じ分布からの確率変数(最初のk個の数値は自動的にキューに加えられる)。順序統計学を利用することができます (
リンク
) を使って、この確率を計算することができます。例えば、次の数字から一様にランダムに選んだとします。
{0, 1}
とすると、(i-K)番目の番号(i個の番号のうち)の期待値は
(i-k)/i
であり、確率変数がこの値より大きくなる確率は
1-[(i-k)/i] = k/i
.
したがって、挿入の期待回数は
そして、予想される実行時間は次のように表すことができる。
(
k
でキューを生成する時間です。
k
要素、次に
n-k
の比較と、上記のような挿入の予想数から、それぞれ平均的な
log(k)/2
時間)
ただし
N
と比較して非常に大きい
K
この式は
n
よりも、むしろ
N log K
. これは、質問の場合、1万回(10億回と比較すると非常に小さい)繰り返した後でも、キューに挿入される数字の確率が非常に小さいので、多少直感的に理解できます。
関連
-
[解決済み] 整数が [1,100] の範囲にあるとき、100万個の整数を最も速くソートする方法は何ですか?
-
[解決済み] ループ不変量によるマージソートの正しさの証明 (初期化 , 保守 , 終了)
-
[解決済み] n個のユニオンのfind(サイズによるユニオン)演算を実行する際の時間計算量がO(n log n)であるのはなぜか?
-
[解決済み] O(log n)とは具体的にどういう意味ですか?
-
[解決済み] NP - 非決定性多項式時間
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
-
[解決済み】ある点が2次元の三角形の中にあるかどうかを判断する方法は?[クローズド]
-
[解決済み】純粋な関数型プログラミングの効率性
-
[解決済み] 100万個の数字の文字列が与えられたとき、繰り返される3桁の数字をすべて返す。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] O(n)とO(log(n))の違い -どちらが優れていて、O(log(n))とは一体何なのか?
-
[解決済み] ビッグ・オー vs ビッグ・シータ【重複あり
-
[解決済み] 最大スパニングツリーの求め方は?
-
[解決済み] O(n)の整数ソートアルゴリズムはあるか?
-
[解決済み] 数字の範囲を表すときの「exclusive」「inclusive」の意味は?
-
[解決済み】有向グラフのサイクルを検出する最適なアルゴリズム【クローズド
-
[解決済み】log(n!)=Θ(n-log(n))なのか?)
-
[解決済み】スキップリストとバイナリサーチツリーの比較
-
[解決済み】純粋な関数型プログラミングの効率性
-
[解決済み】セグメントツリー、インターバルツリー、バイナリーインデックスツリー、レンジツリーの違いは何ですか?