###### Python -- 堆数据结构 heapq

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]

#!/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

#### 【Python】第二周Python基础（下）

1970年01月01日 08:00

#### Python 技巧（二） 最小堆实现以及维护一个大小为100的最小堆

2017-03-02 23:43:10

#### 【算法——Python实现】最大堆和最小堆

2017-10-20 16:37:36

#### python 算法实现 - 最小堆

2015-04-09 18:07:59

#### 最小堆 构建、插入、删除的过程图解

2016-05-21 00:47:02

#### 二叉堆 最小堆 Python 实现

2014年03月01日 3KB 下载

#### 浅析Python heapq模块 堆数据结构

2016-07-08 01:42:05

#### Python利用heapq实现一个优先级队列

2017-04-02 10:43:05

#### Python heapq模块

2014-12-02 11:16:23

#### Python 妙用heapq

2016-10-04 16:26:43

## 不良信息举报

Python -- 堆数据结构 heapq