Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
aa:lab:08 [2020/11/20 21:51] calin_andrei.bucur |
aa:lab:08 [2020/11/20 22:31] (current) calin_andrei.bucur |
||
---|---|---|---|
Line 5: | Line 5: | ||
Binary Heaps are binary trees with the following properties: | Binary Heaps are binary trees with the following properties: | ||
- | **I.** Any node's $math[n] value is greater then his children's $math[c]. ($math[n.value \geq c.value]) | + | **I.** Any node's $math[n] value is greater then his child's value $math[c]. ($math[n.value \geq c.value]) |
**II.** The tree is almost complete (missing elements are possible only on the last level) | **II.** The tree is almost complete (missing elements are possible only on the last level) | ||
Line 18: | Line 18: | ||
15 9 5 2 3 1 | 15 9 5 2 3 1 | ||
- | This corresponds to a BF traversal of the tree, and it guarantees that the children nodes corresponding to v[i] are v[2i + 1] and v[2i + 2] | + | This corresponds to a BF traversal of the tree, and it guarantees that the children nodes corresponding to **v[i]** are **v[2i + 1]** and **v[2i + 2]** |
---- | ---- | ||
Line 76: | Line 76: | ||
**2.1** Implement a procedure which constructs a heap from an arbitrary array, using the insert operation. | **2.1** Implement a procedure which constructs a heap from an arbitrary array, using the insert operation. | ||
- | **2.2** Implement heapsort using the previous procedure. | + | **2.2** Implement heapsort using the previous procedure. What's the complexity? |
+ | |||
+ | |||
+ | algorithm(v): | ||
+ | build a heap from the array | ||
+ | extract the top and insert it at the end of the array | ||
+ | repeat the previous step until the heap is empty | ||
+ | |||
+ | **2.3** Implement the following heap-creation procedure, due to Robert W. Floyd: | ||
+ | |||
+ | Suppose we have an unsorted array: | ||
+ | |||
+ | n = 10 | ||
+ | 5 3 2 1 4 8 6 7 0 9 | ||
+ | |||
+ | which we treat as a tree, not yet a heap: | ||
+ | |||
+ | 5 | ||
+ | / \ | ||
+ | 2 3 | ||
+ | / \ / \ | ||
+ | 1 9 8 6 | ||
+ | / \ / | ||
+ | 7 0 4 | ||
+ | |||
+ | We start from the last level, which in this case is $math[ceil(log(10)) = 4] | ||
+ | from $math[j = 2^{(4-1)}] (which is 8) to n-1. On the last level, each tree is a heap. | ||
+ | |||
+ | We now move to a previous level. Say the level is i: | ||
+ | |||
+ | from $math[j = 2^{(i-1)}] to $math[2^i-1]: | ||
+ | |||
+ | we send-down each value on this level, just like in the deletion algorithm, by keeping as the current root, | ||
+ | the largest between the two children. The sending down procedure repeats recursively, until we have heaps on level i. Example: | ||
+ | |||
+ | 5 | ||
+ | / \ | ||
+ | 2 3 | ||
+ | / \ / \ | ||
+ | 7 9 8 6 | ||
+ | / \ / | ||
+ | 1 0 4 | ||
+ | |||
+ | |||
+ | we repeat the process on the next level: | ||
+ | |||
+ | 5 | ||
+ | / \ | ||
+ | 9 8 | ||
+ | / \ / \ | ||
+ | 7 4 3 6 | ||
+ | / \ / | ||
+ | 1 0 2 | ||
+ | |||
+ | |||
+ | until we reach the first level: | ||
+ | |||
+ | 9 | ||
+ | / \ | ||
+ | 7 8 | ||
+ | / \ / \ | ||
+ | 5 4 3 6 | ||
+ | / \ / | ||
+ | 1 0 2 | ||
+ | |||
+ | Notice that 5 is sent-down on its respective level. | ||
+ | |||
+ | Analyse the complexity. |