2012-02-13 12 views
2

数百万の整数が与えられています。これから最大の数字を見つけるには?入力が巨大なのでメモリには何も格納できません。最高の数字を見つける

提案がありますか?

おかげであなたが(例えば一つのメディアの1からそれらを読んで)すべての数字を反復処理し、唯一の10個の最大の番号のリストを維持することができます

+0

「n」の大きさはどれくらいですか?すべての結果をメモリに保存するには十分ですか? – millimoose

+0

最大==最大? – shift66

+1

いくつかのコードを表示してください。 –

答えて

4

をシャグ 。擬似コードで

max_numbers = new int[n] 
until not end of file: 
    read number 
    if number > min(max_numbers): 
     'copy number to minimum value of max_numbers' 
-1

EDITED

私はそれにマイケルの提案を服用すると、論理的な結論ですが、プライオリティキュー(ヒープベース)を形成するお勧めします。 10を保管しないでください。

PQ a[n]; 
a.insert(input); 

O(log n) FTW

+2

いいえ、ヒープはO(N lg n)の答えを返します。ここで、Nは数百万になります。また、この作業には[min-heap](http://stackoverflow.com/a/9118787/166749)が必要です。 –

+0

ヒープをあらかじめ決められた最大深度だけに変更していない限り、すべての入力をメモリに保持する必要があります。私はこれがウィキペディアのリンクをあまりにも曖昧にして助けにならないと主張するだろう。 – millimoose

+0

私の答えが変更されました。レビューしてください。 –

1

あなたは数字を介して実行しながら、10の長さの配列を取得し、新しい大きなで最小を交換。

1
public void largest() { 
    int _current, _highest, _lowest; 

    if(_current >= _highest) { 
     _highest = _current; 
    } else if(_current <= _lowest) { 
     _lowest = _current; 
    } 
} 

私は何をしますか?

1

サイズnMax-Heapを維持します。

+0

これは動作しますが、Nlog(N)で実行されますが、理想的な解決策はN時間で実行できます。 – zzz

+0

@エリック:説明していただけますか? – Bhushan

2

ちょうどn個の要素の配列を持っていて、配列内で最小のものより大きいものを見つけたら、それを変更することができます。

何かを変更する必要があることがわかっているときに、配列の最小番号を保持しておくと、追加の変数を保持することができます。

関連する問題