Solving Recurrences
Solving Recurrences
4-0:
for (i=1; i<=n*n; i++) for (j=0; j<i; j++) sum++;
Algorithm Analysis
4-1:
for (i=1; i<=n*n; i++) for (j=0; j<i; j++) sum++;
Algorithm Analysis
4-2:
for (i=1; i<=n*n; i++) for (j=0; j<i; j++) sum++;
Algorithm Analysis
i=1
n2 (n2 + 1) i = 2 n4 + n 2 = 2 (n4 )
4-3:
long power(long x, long n) if (n == 0) return 1; else return x * power(x, n-1);
Recursive Functions
4-4:
Recurrence Relations
T (n) = Time required to solve a problem of size n Recurrence relations are used to determine the running time of recursive programs recurrence relations themselves are recursive T (0) = T (n) = time to solve problem of size 0 Base Case time to solve problem of size n Recursive Case
4-5:
long power(long x, long n) if (n == 0) return 1; else return x * power(x, n-1);
Recurrence Relations
T (0) = c1 T (n) = c2 + T (n 1)
If we knew T (n 1), we could solve T (n). T (n) = T (n 1) + c2 = T (n 2) + c2 + c2 = T (n 2) + 2c2 = T (n 3) + c2 + 2c2 = T (n 3) + 3c2 = T (n 4) + 4c2 T (n 1) = T (n 2) + c2 T (n 2) = T (n 3) + c2 T (n 3) = T (n 4) + c2
If we knew T (n 1), we could solve T (n). T (n) = T (n 1) + c2 = T (n 2) + c2 + c2 = T (n 2) + 2c2 = T (n 3) + c2 + 2c2 = T (n 3) + 3c2 = T (n 4) + 4c2 = ... = T (n k ) + kc2 T (n 1) = T (n 2) + c2 T (n 2) = T (n 3) + c2 T (n 3) = T (n 4) + c2
4-11: T (0) = c1 T (n) = T (n k ) + k c2 If we set k = n, we have: T (n) = T (n n) + nc2 = T (0) + nc2 = c1 + nc2 (n)
for all k
4-12:
4-13:
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(x*x, n/2); else return power(x*x, n/2) * x;
4-16: T (n) = T (n/2) + c3 = T (n/4) + c3 + c3 = T (n/4) + 2c3 = T (n/8) + c3 + 2c3 = T (n/8) + 3c3
4-17:
T (n) = T (n/2) + c3 = T (n/4) + c3 + c3 = T (n/4) + 2c3 = T (n/8) + c3 + 2c3 = T (n/8) + 3c3 = T (n/16) + c3 + 3c3 = T (n/16) + 4c3
4-18:
T (n) = T (n/2) + c3 = T (n/4) + c3 + c3 = T (n/4)2c3 = T (n/8) + c3 + 2c3 = T (n/8)3c3 = T (n/16) + c3 + 3c3 = T (n/16) + 4c3 = T (n/32) + c3 + 4c3 = T (n/32) + 5c3
4-19:
T (n) = T (n/2) + c3 = T (n/4) + c3 + c3 = T (n/4)2c3 = T (n/8) + c3 + 2c3 = T (n/8)3c3 = T (n/16) + c3 + 3c3 = T (n/16) + 4c3 = T (n/32) + c3 + 4c3 = T (n/32) + 5c3 = ... = T (n/2k ) + kc3
We want to get rid of T (n/2k ). We get to a relation we can solve directly when we reach T (1) n/2k = 1 n = 2k lg n = k
We want to get rid of T (n/2k ). We get to a relation we can solve directly when we reach T (1) lg n = k T (n) = = = T (n/2lg n ) + lg nc3 T (1) + c3 lg n c2 + c3 lg n (lg n)
4-22: Power
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(x*x, n/2); else return power(x*x, n/2) * x;
Modications
4-23: Power
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(power(x,2), n/2); else return power(power(x,2), n/2) * x;
Modications
4-24: Power
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(power(x,n/2), 2); else return power(power(x,n/2), 2) * x;
Modications
4-25: Power
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(x,n/2) * power(x,n/2); else return power(x,n/2) * power(x,n/2) * x;
Modications
This version of power does work. What is the recurrence relation that describes its running time?
4-26: Power
long if if if power(long x, long n) (n==0) return 1; (n==1) return x; ((n % 2) == 0) return power(x,n/2) * power(x,n/2); else return power(x,n.2) * power(x,n/2) * x;
Modications
4-27:
T (n) = 2T (n/2) + c3 = 2[2T (n/4) + c3 ]c3 = 4T (n/4) + 3c3 = 4[2T (n/8) + c3 ] + 3c3 = 8T (n/8) + 7c3 = 8[2T (n/16) + c3 ] + 7c3 = 16T (n/16) + 15c3 = 32T (n/32) + 31c3 ... = 2k T (n/2k ) + (2k 1)c3
4-28:
T (0) = c1 T (1) = c2 T (n) = 2k T (n/2k ) + (2k 1)c3 Pick a value for k such that n/2k = 1: n/2k = 1 n = 2k lg n = k T (n) = = = = 2lg n T (n/2lg n ) + (2lg n 1)c3 nT (n/n) + (n 1)c3 nT (1) + (n 1)c3 nc2 + (n 1)c3 (n)