46
David Luebke 1 06/21/22 CS 332: Algorithms Review: Insertion Sort, Merge Sort Heaps, Heapsort, and Priority Queues

CS 332: Algorithms

  • Upload
    kirkan

  • View
    23

  • Download
    0

Embed Size (px)

DESCRIPTION

CS 332: Algorithms. Review: Insertion Sort, Merge Sort Heaps, Heapsort, and Priority Queues. Review: Merge Sort. MergeSort(A, left, right) { if (left < right) { mid = floor((left + right) / 2); MergeSort(A, left, mid); MergeSort(A, mid+1, right); Merge(A, left, mid, right); } - PowerPoint PPT Presentation

Citation preview

Page 1: CS 332: Algorithms

David Luebke 1 04/22/23

CS 332: Algorithms

Review: Insertion Sort, Merge SortHeaps, Heapsort, and Priority Queues

Page 2: CS 332: Algorithms

David Luebke 2 04/22/23

Review: Merge Sort

MergeSort(A, left, right) {if (left < right) {mid = floor((left + right) / 2);MergeSort(A, left, mid);MergeSort(A, mid+1, right);Merge(A, left, mid, right);}

}

// Merge() takes two sorted subarrays of A and// merges them into a single sorted subarray of A.// Merge()takes O(n) time, n = length of A

Page 3: CS 332: Algorithms

David Luebke 3 04/22/23

Review: Analysis of Merge Sort

Statement Effort

So T(n) = (1) when n = 1, and 2T(n/2) + (n) when n > 1

Solving this recurrence (how?) gives T(n) = n lg n

MergeSort(A, left, right) { T(n) if (left < right) { (1) mid = floor((left + right) / 2); (1) MergeSort(A, left, mid); T(n/2) MergeSort(A, mid+1, right); T(n/2) Merge(A, left, mid, right); (n) }}

Page 4: CS 332: Algorithms

David Luebke 4 04/22/23

Review: Recurrences

Recurrence: an equation that describes a function in terms of its value on smaller functions

00

)1(0

)(nn

nscns

0)1(00

)(nnsnn

ns

1

22

1

)(ncnT

nc

nT

1

1)(

ncnbnaT

ncnT

Page 5: CS 332: Algorithms

David Luebke 5 04/22/23

Review: Solving Recurrences

Substitution method Iteration method Master method

Page 6: CS 332: Algorithms

David Luebke 6 04/22/23

Review: Substitution Method

Substitution Method: Guess the form of the answer, then use induction

to find the constants and show that solution works Example:

T(n) = 2T(n/2) + (n) T(n) = (n lg n) T(n) = 2T(n/2 + n ???

Page 7: CS 332: Algorithms

David Luebke 7 04/22/23

Review: Substitution Method

Substitution Method: Guess the form of the answer, then use induction

to find the constants and show that solution works Examples:

T(n) = 2T(n/2) + (n) T(n) = (n lg n) T(n) = 2T(n/2) + n T(n) = (n lg n)

We can show that this holds by induction

Page 8: CS 332: Algorithms

David Luebke 8 04/22/23

Substitution Method

Our goal: show that T(n) = 2T(n/2) + n = O(n lg n)

Thus, we need to show that T(n) c n lg n with an appropriate choice of c Inductive hypothesis: assume

T(n/2) c n/2 lg n/2 Substitute back into recurrence to show that

T(n) c n lg n follows, when c 1(show on board)

Page 9: CS 332: Algorithms

David Luebke 9 04/22/23

Review: Iteration Method

Iteration method: Expand the recurrence k times Work some algebra to express as a summation Evaluate the summation

Page 10: CS 332: Algorithms

David Luebke 10 04/22/23

s(n) = c + s(n-1)c + c + s(n-2)2c + s(n-2)2c + c + s(n-3)3c + s(n-3)…kc + s(n-k) = ck + s(n-k)

0)1(00

)(nnscn

nsReview:

Page 11: CS 332: Algorithms

David Luebke 11 04/22/23

So far for n >= k we have s(n) = ck + s(n-k)

What if k = n? s(n) = cn + s(0) = cn

0)1(00

)(nnscn

nsReview:

Page 12: CS 332: Algorithms

David Luebke 12 04/22/23

T(n) = 2T(n/2) + c2(2T(n/2/2) + c) + c22T(n/22) + 2c + c22(2T(n/22/2) + c) + 3c23T(n/23) + 4c + 3c23T(n/23) + 7c23(2T(n/23/2) + c) + 7c24T(n/24) + 15c…2kT(n/2k) + (2k - 1)c

1

22

1)( ncnT

ncnTReview:

Page 13: CS 332: Algorithms

David Luebke 13 04/22/23

So far for n > 2k we have T(n) = 2kT(n/2k) + (2k - 1)c

What if k = lg n? T(n) = 2lg n T(n/2lg n) + (2lg n - 1)c

= n T(n/n) + (n - 1)c= n T(1) + (n-1)c= nc + (n-1)c = (2n - 1)c

1

22

1)( ncnT

ncnTReview:

Page 14: CS 332: Algorithms

David Luebke 14 04/22/23

Review: The Master Theorem

Given: a divide and conquer algorithm An algorithm that divides the problem of size n

into a subproblems, each of size n/b Let the cost of each stage (i.e., the work to divide

the problem + combine solved subproblems) be described by the function f(n)

Then, the Master Theorem gives us a cookbook for the algorithm’s running time:

Page 15: CS 332: Algorithms

David Luebke 15 04/22/23

Review: The Master Theorem

if T(n) = aT(n/b) + f(n) then

10

largefor )()/( AND )(

)(

)(

)(

log)(

log

log

log

log

log

c

nncfbnafnnf

nnf

nOnf

nf

nn

n

nT

a

a

a

a

a

b

b

b

b

b

Page 16: CS 332: Algorithms

David Luebke 16 04/22/23

Sorting Revisited

So far we’ve talked about two algorithms to sort an array of numbers What is the advantage of merge sort? What is the advantage of insertion sort?

Next on the agenda: Heapsort Combines advantages of both previous algorithms

Page 17: CS 332: Algorithms

David Luebke 17 04/22/23

Heaps

A heap can be seen as a complete binary tree:

What makes a binary tree complete? Is the example above complete?

Page 18: CS 332: Algorithms

David Luebke 18 04/22/23

Heaps

In practice, heaps are usually implemented as arrays:

16

14 10

8 7 9 3

2 4 1

16 14 10 8 7 9 3 2 4 1A = =

Page 19: CS 332: Algorithms

David Luebke 19 04/22/23

Heaps

To represent a complete binary tree as an array: The root node is A[1] Node i is A[i] The parent of node i is A[i/2] (note: integer divide) The left child of node i is A[2i] The right child of node i is A[2i + 1]

16

14 10

8 7 9 3

2 4 1

16 14 10 8 7 9 3 2 4 1A = =

Page 20: CS 332: Algorithms

David Luebke 20 04/22/23

Referencing Heap Elements

So…Parent(i) { return i/2; }Left(i) { return 2*i; }right(i) { return 2*i + 1; }

An aside: How would you implement this most efficiently?

Another aside: Really?

Page 21: CS 332: Algorithms

David Luebke 21 04/22/23

The Heap Property

Heaps also satisfy the heap property:A[Parent(i)] A[i] for all nodes i > 1 In other words, the value of a node is at most the value

of its parent Where is the largest element in a heap stored?

Definitions: The height of a node in the tree = the number of edges

on the longest downward path to a leaf The height of a tree = the height of its root

Page 22: CS 332: Algorithms

David Luebke 22 04/22/23

Heap Height

What is the height of an n-element heap? Why?

This is nice: basic heap operations take at most time proportional to the height of the heap

Page 23: CS 332: Algorithms

David Luebke 23 04/22/23

Heap Operations: Heapify()

Heapify(): maintain the heap property Given: a node i in the heap with children l and r Given: two subtrees rooted at l and r, assumed to be

heaps Problem: The subtree rooted at i may violate the heap

property (How?) Action: let the value of the parent node “float down” so

subtree at i satisfies the heap property What do you suppose will be the basic operation between i, l,

and r?

Page 24: CS 332: Algorithms

David Luebke 24 04/22/23

Heap Operations: Heapify()

Heapify(A, i){

l = Left(i); r = Right(i);if (l <= heap_size(A) && A[l] > A[i]) largest = l;elselargest = i;if (r <= heap_size(A) && A[r] > A[largest])largest = r;if (largest != i) Swap(A, i, largest);Heapify(A, largest);

}

Page 25: CS 332: Algorithms

David Luebke 25 04/22/23

Heapify() Example

16

4 10

14 7 9 3

2 8 1

16 4 10 14 7 9 3 2 8 1A =

Page 26: CS 332: Algorithms

David Luebke 26 04/22/23

Heapify() Example

16

4 10

14 7 9 3

2 8 1

16 10 14 7 9 3 2 8 1A = 4

Page 27: CS 332: Algorithms

David Luebke 27 04/22/23

Heapify() Example

16

4 10

14 7 9 3

2 8 1

16 10 7 9 3 2 8 1A = 4 14

Page 28: CS 332: Algorithms

David Luebke 28 04/22/23

Heapify() Example

16

14 10

4 7 9 3

2 8 1

16 14 10 4 7 9 3 2 8 1A =

Page 29: CS 332: Algorithms

David Luebke 29 04/22/23

Heapify() Example

16

14 10

4 7 9 3

2 8 1

16 14 10 7 9 3 2 8 1A = 4

Page 30: CS 332: Algorithms

David Luebke 30 04/22/23

Heapify() Example

16

14 10

4 7 9 3

2 8 1

16 14 10 7 9 3 2 1A = 4 8

Page 31: CS 332: Algorithms

David Luebke 31 04/22/23

Heapify() Example

16

14 10

8 7 9 3

2 4 1

16 14 10 8 7 9 3 2 4 1A =

Page 32: CS 332: Algorithms

David Luebke 32 04/22/23

Heapify() Example

16

14 10

8 7 9 3

2 4 1

16 14 10 8 7 9 3 2 1A = 4

Page 33: CS 332: Algorithms

David Luebke 33 04/22/23

Heapify() Example

16

14 10

8 7 9 3

2 4 1

16 14 10 8 7 9 3 2 4 1A =

Page 34: CS 332: Algorithms

David Luebke 34 04/22/23

Analyzing Heapify(): Informal

Aside from the recursive call, what is the running time of Heapify()?

How many times can Heapify() recursively call itself?

What is the worst-case running time of Heapify() on a heap of size n?

Page 35: CS 332: Algorithms

David Luebke 35 04/22/23

Analyzing Heapify(): Formal

Fixing up relationships between i, l, and r takes (1) time

If the heap at i has n elements, how many elements can the subtrees at l or r have? Draw it

Answer: 2n/3 (worst case: bottom row 1/2 full) So time taken by Heapify() is given by

T(n) T(2n/3) + (1)

Page 36: CS 332: Algorithms

David Luebke 36 04/22/23

Analyzing Heapify(): Formal

So we have T(n) T(2n/3) + (1)

By case 2 of the Master Theorem,T(n) = O(lg n)

Thus, Heapify() takes linear time

Page 37: CS 332: Algorithms

David Luebke 37 04/22/23

Heap Operations: BuildHeap()

We can build a heap in a bottom-up manner by running Heapify() on successive subarrays Fact: for array of length n, all elements in range

A[n/2 + 1 .. n] are heaps (Why?) So:

Walk backwards through the array from n/2 to 1, calling Heapify() on each node.

Order of processing guarantees that the children of node i are heaps when i is processed

Page 38: CS 332: Algorithms

David Luebke 38 04/22/23

BuildHeap()

// given an unsorted array A, make A a heapBuildHeap(A){heap_size(A) = length(A);for (i = length[A]/2 downto 1)

Heapify(A, i);}

Page 39: CS 332: Algorithms

David Luebke 39 04/22/23

BuildHeap() Example

Work through exampleA = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7}

4

1 3

2 16 9 10

14 8 7

Page 40: CS 332: Algorithms

David Luebke 40 04/22/23

Analyzing BuildHeap()

Each call to Heapify() takes O(lg n) time There are O(n) such calls (specifically, n/2) Thus the running time is O(n lg n)

Is this a correct asymptotic upper bound? Is this an asymptotically tight bound?

A tighter bound is O(n) How can this be? Is there a flaw in the above

reasoning?

Page 41: CS 332: Algorithms

David Luebke 41 04/22/23

Analyzing BuildHeap(): Tight

To Heapify() a subtree takes O(h) time where h is the height of the subtree h = O(lg m), m = # nodes in subtree The height of most subtrees is small

Fact: an n-element heap has at most n/2h+1 nodes of height h

CLR 7.3 uses this fact to prove that BuildHeap() takes O(n) time

Page 42: CS 332: Algorithms

David Luebke 42 04/22/23

Heapsort

Given BuildHeap(), an in-place sorting algorithm is easily constructed: Maximum element is at A[1] Discard by swapping with element at A[n]

Decrement heap_size[A] A[n] now contains correct value

Restore heap property at A[1] by calling Heapify()

Repeat, always swapping A[1] for A[heap_size(A)]

Page 43: CS 332: Algorithms

David Luebke 43 04/22/23

Heapsort

Heapsort(A){BuildHeap(A);for (i = length(A) downto 2){Swap(A[1], A[i]);heap_size(A) -= 1;Heapify(A, 1);}

}

Page 44: CS 332: Algorithms

David Luebke 44 04/22/23

Analyzing Heapsort

The call to BuildHeap() takes O(n) time Each of the n - 1 calls to Heapify() takes

O(lg n) time Thus the total time taken by HeapSort()

= O(n) + (n - 1) O(lg n)= O(n) + O(n lg n)= O(n lg n)

Page 45: CS 332: Algorithms

David Luebke 45 04/22/23

Priority Queues

Heapsort is a nice algorithm, but in practice Quicksort (coming up) usually wins

But the heap data structure is incredibly useful for implementing priority queues A data structure for maintaining a set S of elements,

each with an associated value or key Supports the operations Insert(), Maximum(),

and ExtractMax() What might a priority queue be useful for?

Page 46: CS 332: Algorithms

David Luebke 46 04/22/23

Priority Queue Operations

Insert(S, x) inserts the element x into set S Maximum(S) returns the element of S with

the maximum key ExtractMax(S) removes and returns the

element of S with the maximum key How could we implement these operations

using a heap?