topk問題(python版本)

2022-09-16 09:57:12 字數 1450 閱讀 9830

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