关闭

Python -- 堆数据结构 heapq

标签: python数据结构arraysalgorithmlistencoding
18737人阅读 评论(1) 收藏 举报
分类:

import heapq

help(heapq)

heapq 是一个最小堆,堆顶元素 a[0] 永远是最小的. 和 Java 中的优先队列类似.

-------------------------------------------------

Help on module heapq:


NAME
    heapq - Heap queue algorithm (a.k.a. priority queue).


FILE
    /usr/lib64/python2.4/heapq.py


DESCRIPTION
    Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for
    all k, counting elements from 0.  For the sake of comparison,
    non-existing elements are considered to be infinite.  The interesting
    property of a heap is that a[0] is always its smallest element.
    
    Usage:
    
    heap = []            # creates an empty heap
    heappush(heap, item) # pushes a new item on the heap
    item = heappop(heap) # pops the smallest item from the heap
    item = heap[0]       # smallest item on the heap without popping it
    heapify(x)           # transforms list into a heap, in-place, in linear time
    item = heapreplace(heap, item) # pops and returns smallest item, and adds
                                   # new item; the heap size is unchanged
    
    Our API differs from textbook heap algorithms as follows:
    
    - We use 0-based indexing.  This makes the relationship between the
      index for a node and the indexes for its children slightly less
      obvious, but is more suitable since Python uses 0-based indexing.
    
    - Our heappop() method returns the smallest item, not the largest.
    
    These two make it possible to view the heap as a regular Python list
    without surprises: heap[0] is the smallest item, and heap.sort()
    maintains the heap invariant!


FUNCTIONS
    heapify(...)
        Transform list into a heap, in-place, in O(len(heap)) time.
    
    heappop(...)
        Pop the smallest item off the heap, maintaining the heap invariant.
    
    heappush(...)
        Push item onto heap, maintaining the heap invariant.
    
    heapreplace(...)
        Pop and return the current smallest value, and add the new item.
        
        This is more efficient than heappop() followed by heappush(), and can be
        more appropriate when using a fixed-size heap.  Note that the value
        returned may be larger than item!  That constrains reasonable uses of
        this routine unless written as part of a conditional replacement:
        
                if item > heap[0]:
                    item = heapreplace(heap, item)
    
    nlargest(...)
        Find the n largest elements in a dataset.
        
        Equivalent to:  sorted(iterable, reverse=True)[:n]
    
    nsmallest(...)
        Find the n smallest elements in a dataset.
        

        Equivalent to:  sorted(iterable)[:n]

构建元素个数为 K=5 的最小堆代码实例:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Author: kentzhan
#

import heapq
import random

heap = []
heapq.heapify(heap)
for i in range(15):
  item = random.randint(10, 100)
  print "comeing ", item,
  if len(heap) >= 5:
    top_item = heap[0] # smallest in heap
    if top_item < item: # min heap
      top_item = heapq.heappop(heap)
      print "pop", top_item,
      heapq.heappush(heap, item)
      print "push", item,
  else:
    heapq.heappush(heap, item)
    print "push", item,
  pass
  print heap
pass
print heap

print "sort"
heap.sort()

print heap
结果:


0
1

猜你在找
深度学习基础与TensorFlow实践
【在线峰会】前端开发重点难点技术剖析与创新实践
【在线峰会】一天掌握物联网全栈开发之道
【在线峰会】如何高质高效的进行Android技术开发
机器学习40天精英计划
Python数据挖掘与分析速成班
微信小程序开发实战
JFinal极速开发企业实战
备战2017软考 系统集成项目管理工程师 学习套餐
Python大型网络爬虫项目开发实战(全套)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1261258次
    • 积分:12555
    • 等级:
    • 排名:第1014名
    • 原创:222篇
    • 转载:44篇
    • 译文:0篇
    • 评论:158条
    最新评论