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

2021-09-25 15:17:21 字數 2239 閱讀 1896

題目:

有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個堆頂元素,就是最終的結果。

class heap:

def __init__(self,value,arrnum,index):

self.value = value

self.arrnum = arrnum

self.index = index

def printtopk(matrix,k):

if matrix == none or len(matrix) == 0:

return none

heapsize = len(matrix)

heap = [0 for i in range(heapsize)]

for i in range(len(heap)):

heap[i] = heap(matrix[i][index],i,len(heap[i])-1)

heapinsert(heap,i)

print("tok " + str(k) + " : ")

for i in range(k):

if heapsize == 0:

break

print(heap[0].value + " ")

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)

def heapinsert(heap,index):

while parent!=0:

parent = int((index-1)/2)

if heap[index].value > heap[parent].value:

swap(heap,index,parent)

index = parent

else:

break

def heapify(heap,index,heapsize):

left = 2 * index +1

right = 2 * index + 2

largest = index

while left < heapsize:

if heap[left].value > heap[largest].value:

largest = left

if right < heapsize and heap[right].value > heap[largest].value:

largest = right

if largest != index:

swap(heap,largest,index)

else:

break

index = largest

left = 2 * index + 1

right = 2 * index + 2

def swap(heap,index1,index2):

tmp = heap[index1]

heap[index1] = heap[index2]

heap[index2] = tmp

列印N個陣列整體最大的Top K

問題描述 n個陣列用二維陣列表示 vector data 將所有數按照從大到小的順序進行排序,輸出前k個數,但這樣在面對海量資料時時間複雜度較高,利用堆的思想進行求解,步驟 1 建堆,將每個陣列的最後乙個數加入堆中,建立乙個大小為n的大堆 2 此時堆頂元素為所有資料中的最大的資料,輸出 3 假設堆頂...

列印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...

陣列與矩陣 列印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 ...