Heaps

(ヒープ)

Data Structures and Algorithms

5th lecture, October 19, 2017

http://www.sw.it.aoyama.ac.jp/2017/DA/lecture5.html

Martin J. Dürst

AGU

© 2009-17 Martin J. Dürst 青山学院大学

Today's Schedule

 

Summary of Last Lecture

 

Last Week's Homework 1

 

Last Week's Homework 2

 

Last Week's Homework 3

 

Priority Queue

Example from IT:
Queue for process management, ...
Operations:

 

Simple Implementations

Time complexity of each operation
Implementation Array or linked list (ordered) Array or linked list (unordered)
insert O(n) O(1)
getNext/findMax O(1) O(n)

Time complexity for each operation differs for different implementations.

But there is always an operation that needs O(n).

Is it possible to improve this?

 

Ideas for Improving Priority Queue Implementation

 

 

 

 

Tree Structure

 

 

 

Heap

A heap is a binary tree where each parent always has higher priority than its children

⇒ The root always has the highest priority

 

 

 

 

Problem: Balance

 

 

 

Complete Binary Tree

Definition based on tree structure:

 

Heap

A heap is (full definition):

The root always has the highest priority

We need the following operations for implementing a heap:

 

Invariant

 

Implementing a Complete Binary Tree with an Array

 

Restoring Heap Invariants

If the priority at a given node is too high: Use heapify_up

If the priority at a given node is too low: Use heapify_down

Implementation: 5heap.rb

 

Implementing a Priority Queue with a Heap

 

Time Complexity of Heap Operations

Time complexity of each operation
Implementation Heap (implemented as an Array)
insert O(log n)
findMax O(1)
getNext O(log n)

 

Heap Sort

 

How to use irb

irb: Interactive Ruby, a 'command prompt' for Ruby

Example usage:

C:\Algorithms>irb
irb(main):001:0> load './5heap'
=> true
irb(main):002:0> h = Heap.new
=> #<Heap:0x2833d60 @array=[nil], @size=0>
irb(main):003:0> h.insert 3
=> #<Heap:0x2833d60 @array=[nil, 3], @size=1>
irb(main):004:0> h.insert_many [5, 7]
=> #<Heap:0x2833d60 @array=[nil, 7, 3, 5], @size=3>
 ...

 

Other Kinds of Heaps

 

Ideas to Improve Implementation of Priority Queue

 

Conceptual Layers

 

Summary

 

Homework

(for next week, no need to submit, but bring the sorting cards)

  1. Cut the sorting cards, shuffle them, and try to find a fast way to sort them. Play against others (who is fastest?).
    (Example: Two players, one player uses selection sort, one player uses insertion sort, who wins?)
  2. Find five different applications of sorting.
  3. Implement joining two (normal) heaps.
  4. Think about the time complexity of creating a heap:
    heapify_down will be called n/2 times and may take up to O(log n) each time.
    Therefore, one guess for the overall time complexity is O(n log n).
    However, this upper bound can be improved by careful analysis.
  5. Continue to work on the report (manual sorting)

 

Glossary

priority queue
順位キュー、優先順位キュー、優先順位付き待ち行列
complete binary tree
完全二分木
heap
ヒープ
internal node
内部節
restauration
修復
invariant
不変条件
sort
整列、ソート
decreasing (order)
降順
increasing (order)
昇順
join
合併
binomial queue/heap
2項キュー、2 項ヒープ
distribution
分布