日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)

發布時間:2023/12/13 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python使用heapq實現小頂堆(TopK大)、大頂堆(BtmK小) | 四號程序員

Python使用heapq實現小頂堆(TopK大)、大頂堆(BtmK小)

4 Replies

需1求:給出N長的序列,求出TopK大的元素,使用小頂堆,heapq模塊實現。

view sourceprint?

01 import heapq
02 import random
03
04 class TopkHeap(object):
05 def __init__(self, k):
06 self.k = k
07 self.data = []
08
09 def Push(self, elem):
10 if len(self.data) < self.k:
11 heapq.heappush(self.data, elem)
12 else:
13 topk_small = self.data[0]
14 if elem > topk_small:
15 heapq.heapreplace(self.data, elem)
16
17 def TopK(self):
18 return [x for x in reversed([heapq.heappop(self.data) for x in xrange(len(self.data))])]
19
20 if __name__ == "__main__":
21 print "Hello"
22 list_rand = random.sample(xrange(1000000), 100)
23 th = TopkHeap(3)
24 for i in list_rand:
25 th.Push(i)
26 print th.TopK()
27 print sorted(list_rand, reverse=True)[0:3]

上面的用heapq就能輕松搞定。

變態的需求來了:給出N長的序列,求出BtmK小的元素,即使用大頂堆。

heapq在實現的時候,沒有給出一個類似Java的Compartor函數接口或比較函數,開發者給出了原因見這里:http://code.activestate.com/lists/python-list/162387/

于是,人們想出了一些很NB的思路,見:http://stackoverflow.com/questions/14189540/python-topn-max-heap-use-heapq-or-self-implement

我來概括一種最簡單的:

將push(e)改為push(-e)、pop(e)改為-pop(e)。

也就是說,在存入堆、從堆中取出的時候,都用相反數,而其他邏輯與TopK完全相同,看代碼:

view sourceprint?

01 class BtmkHeap(object):
02 def __init__(self, k):
03 self.k = k
04 self.data = []
05
06 def Push(self, elem):
07 # Reverse elem to convert to max-heap
08 elem = -elem
09 # Using heap algorighem
10 if len(self.data) < self.k:
11 heapq.heappush(self.data, elem)
12 else:
13 topk_small = self.data[0]
14 if elem > topk_small:
15 heapq.heapreplace(self.data, elem)
16
17 def BtmK(self):
18 return sorted([-x for x in self.data])

經過測試,是完全沒有問題的,這思路太Trick了……

總結

以上是生活随笔為你收集整理的Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。