Python heapq使用詳解及執行個體代碼,pythonheapq

來源:互聯網
上載者:User

Python heapq使用詳解及執行個體代碼,pythonheapq

 Python heapq 詳解

Python有一個內建的模組,heapq標準的封裝了最小堆的演算法實現。下面看兩個不錯的應用。

小頂堆(求TopK大)

話說需求是這樣的: 定長的序列,求出TopK大的資料。

import heapqimport randomclass TopkHeap(object):  def __init__(self, k):    self.k = k    self.data = []  def Push(self, elem):    if len(self.data) < self.k:      heapq.heappush(self.data, elem)    else:      topk_small = self.data[0]      if elem > topk_small:        heapq.heapreplace(self.data, elem)  def TopK(self):    return [x for x in reversed([heapq.heappop(self.data) for x in xrange(len(self.data))])]if __name__ == "__main__":  print "Hello"  list_rand = random.sample(xrange(1000000), 100)  th = TopkHeap(3)  for i in list_rand:    th.Push(i)  print th.TopK()  print sorted(list_rand, reverse=True)[0:3]

大頂堆(求BtmK小)

這次的需求變得更加的困難了:給出N長的序列,求出BtmK小的元素,即使用大頂堆。

演算法實現的核心思路是:將push(e)改為push(-e)、pop(e)改為-pop(e)。

class BtmkHeap(object):  def __init__(self, k):    self.k = k    self.data = []  def Push(self, elem):    # Reverse elem to convert to max-heap    elem = -elem    # Using heap algorighem    if len(self.data) < self.k:      heapq.heappush(self.data, elem)    else:      topk_small = self.data[0]      if elem > topk_small:        heapq.heapreplace(self.data, elem)  def BtmK(self):    return sorted([-x for x in self.data])

 感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.