Heap as array: Difference between revisions

From Algowiki
Jump to navigation Jump to search
mNo edit summary
No edit summary
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[Category:Videos]]
{{#ev:youtube|https://www.youtube.com/watch?v=j-r4YOPFp7E|500|right||frame}}
[[Category:Data Structures]]
[[Category:Data Structures]]
==General information==
==General information==
Line 11: Line 13:
## a component named <math>ID</math>, which is a [[Numbers#natural numbers|natural number]] and ranges from <math>1,...,N_\text{max}</math>.
## a component named <math>ID</math>, which is a [[Numbers#natural numbers|natural number]] and ranges from <math>1,...,N_\text{max}</math>.
# There is an array <math>TheHeap</math> with index range <math>1,...,N_\text{max}</math> and component type heap item. The '''currently stored items''' are <math>TheHeap[1],...,TheHeap[N]</math>.
# There is an array <math>TheHeap</math> with index range <math>1,...,N_\text{max}</math> and component type heap item. The '''currently stored items''' are <math>TheHeap[1],...,TheHeap[N]</math>.
# There is an array <math>Positions</math> with index range <math>1,...,N_\text{max}</math> and integral components from <math>\{1,...,N_\text{max}\}</math>.
# There is an [[Index handler|index handler]] <math>IH</math> with maximum size <math>N_\text{max}</math> and value type <math>\{1,\ldots,N_\text{max}\}</math>. For each used index <math>i\in\{1,...,N_\text{max}\}</math>, the associated value is the position of one of the <math>N</math> heap items in <math>TheHeap</math>. As long as this heap item is stored, <math>i</math> is permanently associated with this heap item (and can hence be used to locate and access this heap item at any time). The correspondence between the heap items and these numbers <math>i</math> is one-to-one.
# There is an [[ordered sequence]] <math>Unused</math> of [[Numbers#natural numbers|natural numbers]], which has length <math>N_\text{max}-N</math> and stores pairwise different numbers from <math>\{1,...,N_\text{max}\}</math>.
# For each <math>i\in\{1,...,N_\text{max}\}</math> not in <math>Unused</math>:
## <math>Positions[i]</math> is the position of one of the <math>N</math> heap items in <math>TheHeap</math>. As long as this heap item is stored, <math>i</math> is permanently associated with this heap item (and can hence be used to locate and access this heap item at any time). The correspondence between the heap items and these numbers <math>i</math> is one-to-one.
## <math>TheHeap[Positions[i]].ID=i</math>.
# '''Heap property:''' For each <math>i\in\{2,...,N\}</math>, it is <math>TheHeap[i].key\ge TheHeap[\lfloor i/2 \rfloor ].key.</math>.
# '''Heap property:''' For each <math>i\in\{2,...,N\}</math>, it is <math>TheHeap[i].key\ge TheHeap[\lfloor i/2 \rfloor ].key.</math>.
In summary, <math>Positions</math> stores the positions of all heap items, <math>Unused</math> stores all currently unused indexes of <math>Positions</math>, and the ID of each heap item refers back to its corresponding index in <math>Positions</math>.
The heap property may be viewed as follows: Imagine a [[Directed Tree|binary tree]] of <math>N</math> nodes such that each height level except for the last one is full, and the last one is filled from left to right. The nodes have pairwise different indexes from <math>\{ 1,...,N \}</math>:
 
The heap property may be viewed as follows: Imagine a [[binary tree]] of <math>N</math> nodes such that each height level except for the last one is full, and the last one is filled from left to right. The nodes have pairwise different indexes from <math>\{ 1,...,N \}</math>:
# The root is indexed <math>1</math>.
# The root is indexed <math>1</math>.
# For a node with <math>i</math>, the left child (if existing) has index <math>2*i</math>, and the right child (if existing) has index <math>2*i+1</math>.
# For a node with <math>i</math>, the left child (if existing) has index <math>2*i</math>, and the right child (if existing) has index <math>2*i+1</math>.

Latest revision as of 23:12, 19 June 2015

General information

Abstract Data Structure: Bounded priority queue

Implementation Invariant:

  1. For each object of "Heap as array", there is
    1. a specific maximum number of items NmaxN, which is constant throughout the object's lifetime.
    2. a current number of items NN0, which is dynamically changing, but it is NNmax at any time.
  2. There is an internal type heap item with two components:
    1. a component named key of type K
    2. a component named ID, which is a natural number and ranges from 1,...,Nmax.
  3. There is an array TheHeap with index range 1,...,Nmax and component type heap item. The currently stored items are TheHeap[1],...,TheHeap[N].
  4. There is an index handler IH with maximum size Nmax and value type {1,,Nmax}. For each used index i{1,...,Nmax}, the associated value is the position of one of the N heap items in TheHeap. As long as this heap item is stored, i is permanently associated with this heap item (and can hence be used to locate and access this heap item at any time). The correspondence between the heap items and these numbers i is one-to-one.
  5. Heap property: For each i{2,...,N}, it is TheHeap[i].keyTheHeap[i/2].key..

The heap property may be viewed as follows: Imagine a binary tree of N nodes such that each height level except for the last one is full, and the last one is filled from left to right. The nodes have pairwise different indexes from {1,...,N}:

  1. The root is indexed 1.
  2. For a node with i, the left child (if existing) has index 2i, and the right child (if existing) has index 2i+1.

Now associate the node with index i with the key TheHeap[i].key. Then the heap property says that the key of a node is not larger than the keys of its children. In this case, we say that i fulfills the heap property.

In particular, the minimum key is associated with the root.

Remark

The implementations of the methods Bounded priority queue: number and Bounded priority queue: find minimum are trivial and, hence, left out here.

References