題目:
有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 ...