陣列與矩陣 列印N個陣列整體最大的TopK

2021-08-08 11:21:34 字數 2254 閱讀 2101

【題目】

有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...