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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python heap_python topN max heap,使用heapq还是自己实现?

發布時間:2025/4/5 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python heap_python topN max heap,使用heapq还是自己实现? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

heapq的唯一問題是它沒有提供像stdlib中其他所有功能一樣的關鍵功能. (如果你好奇為什么,Raymond Hettinger在

this email中解釋過.他是對的,heapq無法提供與其他排序函數相同的接口 – 但原因不會影響你的用例,其中key只是lambda x: – X.)

通常的解決方法是decorate-heap-undecorate.也就是說,將值的修改版本放入按密鑰排序的堆中.通常,這意味著以下之一:

>存儲密鑰(x)而不是x,然后訪問unkey(值)而不是值(假設密鑰是可逆的).

>存儲(key(x),x)而不是x,然后訪問值[1]. (這可以打破穩定性,但無論如何,heapq都不會保證穩定性.)

>編寫一個實現自定義__le__方法的包裝類,然后存儲Wrapper(x)而不是x并訪問value.value而不是value.

在您的情況下,關鍵功能是可逆的.所以,只需存儲-x和access -value.這和裝飾一樣微不足道.

盡管如此,無論它有多簡單,你都應該寫一個包裝器,否則你會在某些時候搞砸它.例如,您可以編寫一個maxheap來包裝heapq中的minheap,如下所示:

import heapq

def heapify(x):

for i in range(len(x)):

x[i] = -x[i]

heapq.heapify(x)

def heappush(heap, item):

heapq.heappush(heap, -item)

def heappop(heap):

return -heapq.heappop(heap)

……等等您需要的任何其他功能.這可能有點痛苦,但是比從頭開始實施整個事情要少得多.

當你在它時,你可能想要將堆包裝在面向對象的API中,這樣你就可以執行heap.push(x)而不是heapq.heappush(heap,x)等.

import heapq

class MaxHeap(object):

def __init__(self, x):

self.heap = [-e for e in x]

heapq.heapify(self.heap)

def push(self, value):

heapq.heappush(self.heap, -value)

def pop(self):

return -heapq.heappop(self.heap)

如果您快速瀏覽一下ActiveState的配方或PyPI上的模塊,您會發現其他人已經為您完成了大部分工作.

或者,您可以將heapq源(它是純Python)復制并粘貼為maxheapq.py,然后將cmp_lt函數替換為相反的cmp_lt函數. (當然,如果你正在這樣做,那么修改cmp_lt以獲取一個關鍵參數,并且修改所有其他函數以傳遞密鑰時,可能同樣容易,當然也更清楚一些.它將不再普遍適用,因為它不能通常保證只調用一次密鑰.)

如果你真的想要危險地生活(你不應該),你甚至可以將其打包:

import heapq

def cmp_gt(x, y):

return y < x if hasattr(y, '__lt__') else not (x <= y)

heapq.cmp_lt = cmp_gt

但是你不想在實際代碼中這樣做.

總結

以上是生活随笔為你收集整理的python heap_python topN max heap,使用heapq还是自己实现?的全部內容,希望文章能夠幫你解決所遇到的問題。

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