| unsigned int fib(unsigned int n)
{ (1) if (n <= 1) (2) return 1 else (3) return ( fib(n-1) + fib(n-2) ); } |
T(0) = T(1)
= 1 since line(1) takes constant time.
when n>2 work
consists of line 1 + line 3 (2 units time)
function calls:
T(n-1) units for first call; T(n-2) units for second call
Example
2: Analyze the code fragment
| (1)
sum = 0;
(2) for (j=1; j<=n; j++) (3) for (i=1; i<=j; i++) (4) sum++; (5) for (k=1; k<=n; k++) (6) A[k] = k-1; |
| (1)
sum1 = 0;
for (i=1; i<=n; i++) for (j=1; j<=n; j++) |
| (2)
sum2 = 0;
for (i=1; i<=n; i++) for (j=1; j<=i; j++) sum2++; |
| sum=0;
for (k=1; k<=n; k*=2) for (j=1; j<=n; j++) sum++ |
ALGORITHM : 1
Line 1 is O(1); Loop line 2 is size n; Loop line 3 could be small or could
be size n as well (worst case); Loop line 5 is size n;
Lines 7 to 10 take O(n2)
Total Running time is O(n3). More precisely, Q(n3)
ALGORITHM : 2
Third for-loop removed.
Running time is O(n2)
ALGORITHM
: 3
T(n/2) for each call => 2T(n/2) time
T(1) = 1
T(2) = 4 =
21 . 2
T(4) = 12
= 22 . 3
T(8) = 32
= 23 . 4
T(16) = 80
= 24 . 5
...
T(2k) = 2k
(k+1)
Now, if n=2k,
T(n) = n(k+1) (substitution)
if n = 2k
, then log n = k
=> T(n) = n(log n + 1) = n log n + n = O(n log n)
| int binary search(input_type a[], input_type
x, unsigned int n)
{ int low, mid, high; 1 low = 0; high = n-1; 2 while (low <= high) { 3 mid = (low + high) / 2; 4 if (a[mid] > x) 5 low = mid + 1; else 6 if (a[mid] < x) 7 high = mid - 1; 8 else return mid; } /* found */ 9 return NOT_FOUND; } |
This clearly
takes at most log n steps, or Q(log
n) search time
e.g. gcd(24,36) = 12
if program P actually runs in 106 n milliseconds, and program Q runs in n2 milliseconds, and if we always have n < 106, then, other factors being equal, we should use program Q.
|
|
|
|
|
|
|
| 0 | 1 | 0 | 1 | 1 | 2 |
| 1 | 2 | 2 | 4 | 8 | 4 |
| 2 | 4 | 8 | 16 | 64 | 16 |
| 3 | 8 | 24 | 64 | 512 | 256 |
| 4 | 16 | 64 | 256 | 4096 | 65,536 |
| 5 | 32 | 160 | 1024 | 32,768 | 4,294,967,296 |