2
Master Divide andConquer
Recurrence
If T(n)=aT(n/b)+cnk
for n>b then
if a>bk
then T(n) is
if a<bk
then T(n) is (nk
)
if a=bk
then T(n) is (nk
log n)
Works even if it is n/b instead of n/b.
)
( log a
b
n
3.
3
Multiplying Matrices
n3
multiplications,n3
-n2
additions
44
43
42
41
34
33
32
31
24
23
22
21
14
13
12
11
44
43
42
41
34
33
32
31
24
23
22
21
14
13
12
11
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
44
44
34
43
24
42
14
41
42
44
32
43
22
42
12
41
41
44
31
43
21
42
11
41
44
34
34
33
24
32
14
31
42
34
32
33
22
32
12
31
41
34
31
33
21
32
11
31
44
24
34
23
24
22
14
21
42
24
32
23
22
22
12
21
41
24
31
23
21
22
11
21
44
14
34
13
24
12
14
11
42
14
32
13
22
12
12
11
41
14
31
13
21
12
11
11
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
b
a
8
Strassen’s algorithm
Strassen’salgorithm
Multiply 2x2 matrices using 7 instead of 8 multiplications
(and lots more than 4 additions)
T(n)=7 T(n/2)+cn2
7>22
so T(n) is (n ) which is O(n2.81
)
Fastest algorithms theoretically use O(n2.376
) time
not practical but Strassen’s is practical provided
calculations are exact and we stop recursion when
matrix has size about 100 (maybe 10)
log27
13
Total Cost
Geometricseries
ratio a/bk
d+1=logbn +1 terms
first term cnk
, last term cad
If a/bk
=1, all terms are equal T(n) is (nk
log n)
If a/bk
<1, first term is largest T(n) is (nk
)
If a/bk
>1, last term is largest T(n) is
(ad
)=(a ) =(n )
(To see this take logb of both sides)
logbn logba
15
Partition - twofinger algorithm
Partition(X,left,right)
choose a random element to be a pivot and
pull it out of the array, say at left end
maintain two fingers starting at
each end of the array slide them towards
each other until you get a pair of elements
where right finger has a smaller element and left
finger has a bigger one (when compared to
pivot)swap them and repeat until fingers meet
put the pivot element where they meet
16.
16
Partition - twofinger algorithm
Partition(X,left,right)
swap X[left],X[random(left,right)] pivot
X[left]; L left; R right while L<R
do while (X[L]
pivot & L right) do L L+1
while (X[R] > pivot & R left) do
R R-1
if L>R then swap X[L],X[R] swap
X[left],X[R] return R
17.
17
In practice
oftenchoose pivot in fixed way as
middle element for small arrays
median of 1st, middle, and last for larger arrays
median of 3 medians of 3 (9 elements in all) for largest
arrays
four finger algorithm is better
also maintain two groups at each end of elements equal
to the pivot
• swap them all into middle at the end of Partition
equal elements are bad cases for two fingers
18.
18
Quicksort Analysis
Partitiondoes n-1 comparisons on a list of
length n
pivot is compared to each other element
If pivot is ith
largest then two subproblems
are of size i-1 and n-i
Pivot is equally likely to be any one of 1st
through nth
largest
n
1
i
i)
T(n
1)
T(i
n
1
1
n
T(n)