CSE 312, Autumn 2012, W.L.Ruzzo 8. Average-Case Analysis of Algorithms + Randomized Algorithms 1
insertion sort Array A[1] … A[n] Sorted for i = 2 … n-1 { T = A[i] j j = i-1 “compare” i Unsorted while j >= 0 && T < A[j] { A[j+1] = A[j] “swap” A[j] = T j = j-1 or } A[j+1] = T 2
insertion sort Run Time Worst Case: O(n 2 ) ( ~n 2 swaps; #compares = #swaps + n - 1) “Average Case” ? What’s an “average” input? One idea (and about the only one that is analytically tractable): assume all n! permutations of input are equally likely. 3
permutations & inversions A permutation π = ( π 1 , π 2 , ..., π n ) of 1, ..., n is simply a list of the numbers between 1 and n, in some order. (i,j) is an inversion in π if i < j but π i > π j G. Cramer, 1750 E.g., (1,5) (4,5) π = ( 3 5 1 4 2 ) has six inversions: (1,3), (1,5), (2,3), (2,4), (2,5), and (4,5) Min possible: 0: π = ( 1 2 3 4 5 ) Max possible: n choose 2: π = ( 5 4 3 2 1 ) Obviously, the goal of sorting is to remove inversions 4
inversions & insertion sort Swapping an adjacent pair of positions that are out-of- order decreases the number of inversions by exactly 1 . So..., number of swaps performed by insertion sort is exactly the number of inversions present in the input. Counting them: a. worst case: n choose 2 b. average case: 5
counting inversions There is a 1-1 correspondence between permutations having inversion (i,j) versus not : So: Thus, the expected number of swaps in insertion sort is versus in worst-case. I.e., The average run time of insertion sort (assuming random input) is about half the worst case time. 6
average-case analysis of quicksort Quicksort also does swaps, but non adjacent ones. Recall method: Array A[1..n] 1. “pivot” = A[1] 2. “Partition” ( O(n) compares/swaps ) so that: {A[1], ..., A[i-1]} < {A[i] == pivot} < {A[i+1], ..., A[n]} 3. recursively sort {A[1], ..., A[i-1]} & {A[i+1], ..., A[n]} 7
quicksort run-time Worst case: already sorted (among others) – T(n) = n + T(n-1) ⇒ = n + (n-1) + (n-2) + ... + 1 = n(n+1)/2 Best case: pivot is always median ⇒ ~n log 2 n Average case: ? Below. Will turn out to be ~40% slower than best Why? Random pivots are “near the middle on average” 8
average-case analysis Assume input is a random permutation of 1, ..., n, i.e., that all n! permutations are equally likely Then 1 st pivot A[1] is uniformly random in 1, ..., n Important subtlety: pivots at all recursive levels will be random, too, (unless you do something funky in the partition phase) 9
number of comparisons Let C N be the average number of comparisons made by quicksort when called on an array of size N . Then: C 0 = C 1 = 0 (a list of length ≤ 1 is already sorted) In the general case, there are N-1 comparisons: the pivot vs every other element (a detail: plus 2 more for handling the “pointers cross” test to end the loop) . The pivot ends up in some position 1 ≤ k ≤ N , leaving two subproblems of size k-1 and N-k. 1/ N because all values 1 ≤ k ≤ N for pivot are equally likely. (Analysis from Sedgewick, Algorithms in C, 3rd ed., 1998, p311-312; Knuth TAOCP v3, 1 st ed 1973, p120.) 10
Rearrange; every C i is there twice Multiply by N; subtract same for N-1 Rearrange 11
div by N(N+1) substitute 12
Notes So, average run time, averaging over randomly ordered inputs, = Θ ( n log n). A worst case input is still worst case: n 2 every time (Is real data random?) Is it possible to improve the worst case? 13
another idea: randomize the algorithm Algorithm as before, except pivot is a randomly selected element of A[1]...A[n] (at top level; A[i]..A[j] for subproblem i..j) Analysis is the same, but conclusion is different: On any fixed input, average run time is n log n, averaged over repeated (random) runs of the algorithm . There are no longer any “bad inputs”, just “bad (random) choices.” Fortunately, such choices are improbable! 14
summary Average Case Analysis (of a deterministic alg): 1. for algorithm A, choose a sample space S and probability distribution P from which inputs are drawn 2. for x ∈ S, let T(x) be the time taken by A on input x 3. calculate, as a function of the “size,” n, of inputs, Σ x ∈ S T(x)•P(x) which is the expected or average run time of A For sorting, distrib is usually “all n! permutations equiprobable” Insertion sort: E[time] ∝ E[inversions] = = Θ (n 2 ), about half the worst case Quicksort: E[time] = Θ (n log n) vs Θ (n 2 ) in worst case; fun with recurrences, sums & integrals 15
summary Randomized Algorithms (with non-random input): 1.for a randomized algorithm A, input x is fixed, just as usual, from some space I of possible inputs, but the algorithm may draw (and use) random samples y = (y 1 , y 2 , ... ) from a given sample space S and probability distribution P 2.for any x ∈ I and any y ∈ S , let T(x,y) be the time taken by A on input x when y is sampled from S 3.calculate, as a function of the “size,” n, of inputs, max x ∈ I Σ y ∈ S T(x,y)•P(y) which is the expected or average run time of A on a worst- case input Randomized Quicksort: choosing pivots at random, E[time] = Θ (n log n) for any input. (For every input, there are some rare random choice sequences causing n 2 time.) 16
critique Worst-case analysis is much more common than average-case analysis because: it’s often easier to get meaningful average case results, a reasonable probability model for “typical inputs” is critical, but may be unavailable, or difficult to analyze as with insertion sort, the results are often similar But in some important examples, such as quicksort, average-case is sharply better Randomized algorithms are very important in many areas; sometimes easier to argue that bad stuff is rare than to deterministically circumvent it. (Fascinating open problem: is this intrinsic?) 17
Recommend
More recommend