# heapq

A *priority queue* is a data structure that supports two operations:
add element and extract the minimum of all elements among previously added.

One of the most common implementations of a priority queue is a *binary heap*.
It's a complete binary tree with the following property:
the key stored in each node is equal to or less than (≤) the keys in the node's children.
The minimum of all elements is a root of such tree.

```
1
3 7
5 4 9 8
15 16 17 18 19
```

In a binary heap, both inserting and extraction operations' complexity is *O(log n)*.

The common way of storing a complete binary tree in memory is an array, where children of `x[i]`

are `x[2*i+1]`

and `x[2*i+2]`

:

```
[1, 3, 7, 5, 4, 9, 8, 15, 16, 17, 18, 19]
```

Python doesn't provide a binary heap as a class,
but it does provide a number of functions that treat `list`

like a binary heap.
They are placed in the heapq module.

```
In [1]: from heapq import *
In [2]: heap = [3,2,1]
In [3]: heapify(heap)
In [4]: heap
Out[4]: [1, 2, 3]
In [5]: heappush(heap, 0)
In [6]: heap
Out[6]: [0, 1, 3, 2]
In [7]: heappop(heap)
Out[7]: 0
In [8]: heap
Out[8]: [1, 2, 3]
```

More advanced example live