2012-02-13 4 views
2

수백만 개의 정수가 있습니다. 이것에서 n 개의 가장 큰 숫자를 찾는 방법? 입력이 거대하기 때문에 메모리에 아무 것도 저장할 수 없습니다.가장 높은 숫자 n 찾으십시오.

제안 사항?

덕분에 모든 숫자를 통해

+0

'n'의 크기는 얼마나됩니까? 모든 결과를 메모리에 저장하기에 충분합니까? – millimoose

+0

== 가장 큰? – shift66

+1

몇 가지 코드를 보여주십시오. –

답변

4

당신은 반복 할 수있는 (예를 들어 하나 미디어 하나를 읽기) 만 10 개 최대 번호 목록을 유지 사랑을 나누지 . 의사 코드에서

은 :

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

나는 그것이 논리적 인 결론이다에 마이클의 제안을 고려하여 우선 순위 - 큐 (기반 힙)을 형성하는 것이 좋습니다

을 편집했다. 저장하지 마십시오 10, 상점 n.

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 개의 요소 배열을 가지며 배열에서 가장 작은 것보다 큰 하나의 번호를 찾으면 변경할 수 있습니다.

배열에서 가장 작은 숫자를 유지하는 추가 변수를 유지하면 변경할 필요가있을 때만 반복 할 수 있습니다.

관련 문제