【題目】
有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。
例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。
219, 405, 538, 845, 971
148, 558
52, 99, 348, 691
再輸入整數k = 5,則列印:
971, 845, 691, 558, 538
【要求】
如果所有陣列的元素個數小於k,則從大到小列印所有的數
要求時間複雜度為o(klogn)
【基本思路】
本題的解法是利用堆結構和堆排序的過程完成的,具體過程如下:
構建乙個大小為n的大根堆,建堆的過程就是把每乙個陣列的最後乙個值,也就是該陣列的最大值,依次加入到堆裡,這個過程就是建堆的調整過程。
建好堆以後,此時堆頂的元素就是所有陣列中最大的元素,列印堆頂元素。
假設堆頂的元素來自 a 陣列的 i 位置,那麼將堆頂的元素用a[i-1]替換,然後從堆的頭部重新調整堆。如果發現此時 a 陣列已經沒有元素,那麼就將堆頂元素與堆尾元素交換,同時令堆的大小減1,仍然是從堆的頭部重新調整堆。
每次都可得到乙個堆頂元素,列印k個堆頂元素,就是最終的結果。
為了知道每一次的堆頂元素來自哪乙個陣列的哪乙個位置,我們可以定義如下的heap類:
class
heapnode:
def__init__
(self, value, arrnum, index):
self.value = value
self.arrnum = arrnum
self.index = index
【**實現】
def
printtopk
(matrix, k):
defheapinsert
(heap, i):
if i == 0:
return
parent = (i-1) // 2
tmp = heap[i]
while tmp.value > heap[parent].value:
heap[i] = heap[parent]
i = parent
parent = (i-1) // 2
heap[i] = tmp
defheapify
(heap, i, n):
child = 2 * i + 1
tmp = heap[i]
while child < n:
if child < n-1
and heap[child].value < heap[child+1].value:
child += 1
if heap[child].value > tmp.value:
heap[i] = heap[child]
i = child
child = 2 * i + 1
else:
break
heap[i] = tmp
if matrix == none
or len(matrix) == 0:
return
heapsize = len(matrix)
heap = [0
for i in range(heapsize)]
for i in range(len(heap)):
index = len(matrix[i]) - 1
heap[i] = heapnode(matrix[i][index], i, index)
heapinsert(heap,i)
for i in range(k):
if heapsize == 0:
break
print(heap[0].value, end=' ')
if heap[0].index != 0:
heap[0].value = matrix[heap[0].arrnum][heap[0].index-1]
heap[0].index -= 1
else:
heap[0] = heap[-1]
heapsize -= 1
heapify(heap, 0, heapsize)
列印N個陣列整體最大的Top K
問題描述 n個陣列用二維陣列表示 vector data 將所有數按照從大到小的順序進行排序,輸出前k個數,但這樣在面對海量資料時時間複雜度較高,利用堆的思想進行求解,步驟 1 建堆,將每個陣列的最後乙個數加入堆中,建立乙個大小為n的大堆 2 此時堆頂元素為所有資料中的最大的資料,輸出 3 假設堆頂...
列印N個陣列整體最大的TopK
題目 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 971,845,691,558,538 ...
列印N個陣列整體最大的Top K
列印n個陣列整體最大的top k 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 top 5 9...