forked from adnanaziz/EPIJudge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
k_largest_in_heap.py
39 lines (31 loc) · 1.24 KB
/
k_largest_in_heap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import heapq
from test_framework import generic_test, test_utils
def k_largest_in_binary_heap(A, k):
if k <= 0:
return []
# Stores the (-value, index)-pair in candidate_max_heap. This heap is
# ordered by value field. Uses the negative of value to get the effect of
# a max heap.
candidate_max_heap = []
# The largest element in A is at index 0.
candidate_max_heap.append((-A[0], 0))
result = []
for _ in range(k):
candidate_idx = candidate_max_heap[0][1]
result.append(-heapq.heappop(candidate_max_heap)[0])
left_child_idx = 2 * candidate_idx + 1
if left_child_idx < len(A):
heapq.heappush(candidate_max_heap, (-A[left_child_idx],
left_child_idx))
right_child_idx = 2 * candidate_idx + 2
if right_child_idx < len(A):
heapq.heappush(candidate_max_heap, (-A[right_child_idx],
right_child_idx))
return result
if __name__ == '__main__':
exit(
generic_test.generic_test_main(
"k_largest_in_heap.py",
"k_largest_in_heap.tsv",
k_largest_in_binary_heap,
comparator=test_utils.unordered_compare))