#topk問題的解決思路 #先構造小根堆調整函式def sift(li,low,high): #li是指列表,low是指根節點位置,high是指最後乙個元素位置i=low #最開始跟節點的位置
j=2*i+1 #左邊下一層孩子節點
tmp=li[low] #把堆頂元素存下來
while j<=high: #只要j位置有節點,有數字便可以一直迴圈
if j+1li[j+1]: #右邊孩子有並且右邊更大
j=j+1 #把j指向j+1,右邊孩子大於左邊,指向右邊
ifli[j]
li[i]=li[j]
i=j #往下看一層
j=2*j+1
else: #tmp更大的情況,把tmp放上來
li[i]=tmp #把tmp放到某一級領導的位置上
break
else:
li[i]=tmp #把tmp放在葉子節點上去
def topk(li,k):
#1首先取前k個元素構造k長度的列表,並且構造k長度的小根堆
heap=li[0:k]for i in range((k-2)//2,-1,-1):
sift(heap,i,k-1)
#2遍歷列表中其他的元素,形成最終的k數目的小根堆
for i in range(k,len(li)-1):if li[i]>heap[0]:
heap[0]=li[i]
sift(heap,0,k-1)
#3對於前k的小根堆進行吐數的操作
for i in range(k-1,-1,-1): #i是指當前堆的最後乙個元素heap[0],heap[i]=heap[i],heap[0]
sift(heap,0,i-1) #i-1是新的堆的high
TopK問題詳解
1.基本topk問題描述 從1百萬個數中找出最大 或最小 的5個數 看到這個問題,很多同學的第一反應會是 排序。那麼,選擇哪種排序方法呢,有同學說 快排,將所有數排序後,再選出最大的5個。雖然快排確實能解決這個問題,但是需要對1百萬個數排序,但我們僅僅需要其中的5個。那麼,有更好的方法嗎?還記得我們...
Top K問題詳解
最容易想到的方法是將資料全部排序,然後在排序後的集合中進行查詢,最快的排序演算法的時間複雜度一般為o nlogn 如快速排序。但是在32位的機器上,每個float型別佔4個位元組,1億個浮點數就要占用400mb的儲存空間,對於一些可用記憶體小於400m的計算機而言,很顯然是不能一次將全部資料讀入記憶...
TOPk系列問題
找出陣列中最小 最大 的k個數。以任意順序返回這k個數。1.若該陣列的陣列長度很小,則可運用簡單方法查詢即可。2.若該陣列陣列長度很大,超過了記憶體能儲存的範圍。那麼,顯而易見,傳統的查詢方法已經失去的查詢的能力。a.最大前k個數,建小堆 b.最小前k個數建大堆 示例 建小堆 向下調整演算法 voi...