Jump to content

Heap (data structure): Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
No edit summary
Psyphen (talk | contribs)
mNo edit summary
Line 1: Line 1:
{{About|heap data structures|"the heap" as a pool of dynamically-allocated memory|dynamic memory allocation|other uses|heap}}
{{About|heap data structures|"the heap" as a pool of dynamically-allocated memory|dynamic memory allocation|other uses|heap}}
[[Image:Max-heap.png|thumb|right|240px|Example of a full binary max heap]]
[[Image:Max-heap.png|thumb|right|240px|Example of a full binary max-heap]]


In [[computer science]], a '''heap''' is a specialized [[tree data structure|tree]]-based [[data structure]] that satisfies the ''heap property:'' if ''B'' is a [[child node]] of ''A'', then key(''A'') ≥ key(''B''). Also the tree data structure must be a complete tree for satisfying the heap property. This implies that an element with the greatest key is always in the root node, and so such a heap is sometimes called a ''max-heap''. (Alternatively, if the comparison is reversed, the smallest element is always in the root node, which results in a ''min-heap''.) The several variants of heaps are the prototypical most efficient implementations of the [[abstract data type]] [[priority queue]]s. Priority queues are useful in many applications. In particular, heaps are crucial in several efficient [[graph theory|graph]] [[algorithm]]s.
In [[computer science]], a '''heap''' is a specialized [[tree data structure|tree]]-based [[data structure]] that satisfies the ''heap property:'' if ''B'' is a [[child node]] of ''A'', then key(''A'') ≥ key(''B''). Also the tree data structure must be a complete tree for satisfying the heap property. This implies that an element with the greatest key is always in the root node, and so such a heap is sometimes called a ''max-heap''. (Alternatively, if the comparison is reversed, the smallest element is always in the root node, which results in a ''min-heap''.) The several variants of heaps are the prototypical most efficient implementations of the [[abstract data type]] [[priority queue]]s. Priority queues are useful in many applications. In particular, heaps are crucial in several efficient [[graph theory|graph]] [[algorithm]]s.

Revision as of 07:33, 15 December 2009

Example of a full binary max-heap

In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if B is a child node of A, then key(A) ≥ key(B). Also the tree data structure must be a complete tree for satisfying the heap property. This implies that an element with the greatest key is always in the root node, and so such a heap is sometimes called a max-heap. (Alternatively, if the comparison is reversed, the smallest element is always in the root node, which results in a min-heap.) The several variants of heaps are the prototypical most efficient implementations of the abstract data type priority queues. Priority queues are useful in many applications. In particular, heaps are crucial in several efficient graph algorithms.

The operations commonly performed with a heap are

  • delete-max or delete-min: removing the root node of a max- or min-heap, respectively
  • increase-key or decrease-key: updating a key within a max- or min-heap, respectively
  • insert: adding a new key to the heap
  • merge: joining two heaps to form a valid new heap containing all the elements of both.

Heaps are used in the sorting algorithm heapsort.

Variants

Comparison of theoretic bounds for variants

The following time complexities[1] are worst-case time for binary and binomial heaps and amortized time complexity for Fibonacci heap. O(f) gives asymptotic upper bound and Θ(f) is asymptotically tight bound (see Big O notation). Function names assume a min-heap.

Operation Binary Binomial Fibonacci
findMin Θ(1) Θ(log n) or Θ(1) Θ(1)
deleteMin Θ(log n) Θ(log n) O(log n)
insert Θ(log n) O(log n) Θ(1)
decreaseKey Θ(log n) Θ(log n) Θ(1)
merge Θ(n) O(log n) Θ(1)

For pairing heaps the insert and merge operations are conjectured [citation needed] to be O(1) amortized complexity but this has not yet been proven. decreaseKey is not O(1) amortized complexity.[2][3]

Heap applications

The heap data structure has many applications.

Interestingly, full and almost full binary heaps may be represented in a very space-efficient way using an array alone. The first (or last) element will contain the root. The next two elements of the array contain its children. The next four contain the four children of the two child nodes, etc. Thus the children of the node at position n would be at positions 2n and 2n+1 in a one-based array, or 2n+1 and 2n+2 in a zero-based array. This allows moving up or down the tree by doing simple index computations. Balancing a heap is done by swapping elements which are out of order. As we can build a heap from an array without requiring extra memory (for the nodes, for example), heapsort can be used to sort an array in-place.

One more advantage of heaps over trees in some applications is that construction of heaps can be done in linear time using Tarjan's algorithm.

Heap implementations

  • The C++ Standard Template Library provides the make_heap, push_heap and pop_heap algorithms for binary heaps, which operate on arbitrary random access iterators. It treats the iterators as a reference to an array, and uses the array-to-heap conversion detailed above.
  • The Java 2 platform (since version 1.5) provides the binary heap implementation with class java.util.PriorityQueue<E> in Java Collections Framework.
  • Python has a heapq module that implements a priority queue using heap.
  • PHP has both maxheap (SplMaxHeap) and minheap (SplMinHeap) as of version 5.3 in the Standard PHP Library.
  • Perl has implementations of binary, binomial, and Fibonacci heaps in the Heap distribution available on CPAN

See also

References

  1. ^ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Introduction to algorithms. MIT Press / McGraw-Hill.
  2. ^ "CiteSeerX — Pairing Heaps are Sub-optimal". Citeseer.ist.psu.edu. Retrieved 2009-09-23.
  3. ^ "On the efficiency of pairing heaps and related data structures". Portal.acm.org. 2003-07-31. doi:10.1007/BF01840439. Retrieved 2009-09-23.