python利用heapq實現小頂堆(尋找最大的N個元素),pythonheapq

來源:互聯網
上載者:User

python利用heapq實現小頂堆(尋找最大的N個元素),pythonheapq

尋找最大的N個元素——堆資料結構

給出序列,求出TopK大的元素,使用小頂堆,heapq模組實現

使用heappush()時,從資料來源增加新元素時會保持元素的堆順序。
在一個操作中刪除現有元素並替換為新值,可以使用heapreplace()

import heapq

class BtmkHeap(object):
def __init__(self, k):
self.k = k
self.data = []

def Push(self, elem):
# Reverse elem to convert to max-heap
num1 = elem[0]
num1 = -num1
num2 = elem[1]
# Using heap algorighem
if len(self.data) < self.k:
heapq.heappush(self.data, (num1,num2))
else:
topk_small = self.data[0][0]
if elem[0] > topk_small:
heapq.heapreplace(self.data,(num1,num2))

def BtmK(self):
return sorted([(-x[0],x[1]) for x in self.data])


if __name__ == '__main__':
a = (100,1)
b = (200,2)
c = (300,3)
d = (400,4)
e = (50,5)
btm = BtmkHeap(3)
btm.Push(a)
btm.Push(b)
btm.Push(c)
btm.Push(e)
btm.Push((23,1))
print(btm.BtmK())



結果[(23, 1), (50, 5), (100, 1)]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.