n 개의 항목 중 top-m을 얻기위한 복잡성을 제공하는 "heap top의 peek"알고리즘 외에도 다음과 같은 두 가지 솔루션이 있습니다.
해결 방법 1 : 피보나치 힙을 사용하십시오.
JDK의 PriorityQueue 구현은 균형 잡힌 바이너리 힙입니다. Fibonacci heap 구현에서 더 많은 성능을 끌어낼 수 있어야합니다. 이진 힙에 삽입하는 동안 힙 크기에 복잡성 Ω (log n)이있는 동안 상각 시간 상각이 상각됩니다. 모든 요소에 대해이를 수행한다면 Ω (n log n)에있게됩니다. Fib 힙을 사용하여 n 개의 항목 중 top-m을 찾는 것은 복잡성 O (n + m log n)을 갖는다. 이를 힙에 m 요소 만 삽입하라는 제안과 결합하면 O (n + m log m)이됩니다.이 시간은 얻을 수있는 선형 시간에 가깝습니다.
해결 방법 2 : 목록을 M 번 탐색합니다.
O (n) 시간의 집합에서 k 번째로 큰 요소를 가져올 수 있어야합니다. 모든 것을 목록으로 읽고 다음을 수행하십시오.
kthLargest(k, xs)
Pick a random pivot element p from the list
(the first one will do if your list is already random).
Go over the set once and group it into two lists.
Left: smaller than p.
Right: Larger or equal to p.
If the Right list is shorter than k, return kthLargest(k - right.size, Left)
If the Right list is longer than k, return kthLargest(k, right)
Otherwise, return p.
그러면 O (n) 시간이됩니다. 그 m 번 실행하면 시간이 O (nm)의 집합에서 top-m 개체를 얻을 수 있어야합니다. n은 충분히 큰 n 및 충분히 작은 m에 대해 n log n보다 엄격하게 작습니다. 예를 들어, 상위 10 개 항목을 100 만 개가 넘는 항목을 가져 오는 데는 이진 힙 우선 순위 대기열을 사용하는 것의 절반이 소요되며 다른 모든 사항은 동일합니다.
이 코드에서 프로파일 러를 실행 해 보셨습니까? 비교기는 어떻게 쓰여 집니까? –
공개 INT 비교 (ListElement I, J의 ListElement) { \t \t \t \t \t \t \t 경우 (i.getValue() - j.getValue()> 0) 창 1; else return -1; } – BigG
ID는 코드의 프로필을 작성하고 코드 실행으로 인해 느리게 실행되는 원인을 찾아내는 것이 좋습니다. 코드가 표시되지 않고 추가 정보가 없으므로이 질문에 대답하기가 어렵습니다. 어떤 부분이 느리게 움직이고 있습니까? –