一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Python heapq使用详解及实例代码

时间:2017-03-07 编辑:简简单单 来源:一聚教程网

Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。

小顶堆(求TopK大)

话说需求是这样的: 定长的序列,求出TopK大的数据。

 代码如下复制代码

importheapq

importrandom

 

classTopkHeap(object):

  def__init__(self, k):

    self.k=k

    self.data=[]

 

  defPush(self, elem):

    iflen(self.data)

      heapq.heappush(self.data, elem)

    else:

      topk_small=self.data[0]

      ifelem > topk_small:

        heapq.heapreplace(self.data, elem)

 

  defTopK(self):

    return[xforxinreversed([heapq.heappop(self.data)forxinxrange(len(self.data))])]

 

if__name__=="__main__":

  print"Hello"

  list_rand=random.sample(xrange(1000000),100)

  th=TopkHeap(3)

  foriinlist_rand:

    th.Push(i)

  printth.TopK()

  printsorted(list_rand, reverse=True)[0:3]

大顶堆(求BtmK小)

这次的需求变得更加的困难了:给出N长的序列,求出BtmK小的元素,即使用大顶堆。

算法实现的核心思路是:将push(e)改为push(-e)、pop(e)改为-pop(e)

 代码如下复制代码

classBtmkHeap(object):

  def__init__(self, k):

    self.k=k

    self.data=[]

 

  defPush(self, elem):

    # Reverse elem to convert to max-heap

    elem=-elem

    # Using heap algorighem

    iflen(self.data)

      heapq.heappush(self.data, elem)

    else:

      topk_small=self.data[0]

      ifelem > topk_small:

        heapq.heapreplace(self.data, elem)

 

  defBtmK(self):

    returnsorted([-xforxinself.data])

热门栏目