Module - 04 (Algorithm Analysis)
Module - 04 (Algorithm Analysis)
Introduction
Data structures
Methods of organizing data
What is Algorithm?
a clearly specified set of simple instructions on the data to be
followed to solve a problem
Takes a set of values, as input and
produces a value, or set of values, as output
May be specified
InEnglish
As a computer program
As a pseudo-code
Introduction
Why need algorithm analysis ?
writing a working program is not good enough
The program may be inefficient!
If the program is run on a large data set, then the
running time becomes an issue
Analysis of Algorithms / Slide 4
Algorithm 2:
(1) Read the first k elements into an array and sort
them in decreasing order
(2) Each remaining element is read one by one
Ifsmaller than the kth element, then it is ignored
Otherwise, it is placed in its correct spot in the array,
bumping one element out of the array.
(3) The element in the kth position is returned as
the answer.
Analysis of Algorithms / Slide 6
Algorithm Analysis
We only analyze correct algorithms
An algorithm is correct
If, for every input instance, it halts with the correct output
Incorrect algorithms
Might not halt at all on some input instances
Might halt with other than the desired answer
Analyzing an algorithm
Predicting the resources that the algorithm requires
Resources include
Memory
Communication bandwidth
Computational time (usually most important)
Analysis of Algorithms / Slide 8
Different approaches
Empirical: run an implemented system on
real-world data. Notion of benchmarks.
Simulational: run an implemented system on
simulated data.
Analytical: use theoretic-model data with a
theoretical model system. We do this in 171!
Analysis of Algorithms / Slide 10
Example
N
Calculate ∑i 3
i =1
1
1
2 2N+2
3 4N
4 1
Running-time of algorithms
Bounds are for the algorithms, rather than programs
programs are just implementations of an algorithm, and
almost always the details of the program do not affect the
bounds
Growth Rate
Growth rates …
Doubling the input size
f(N) = c ⇒ f(2N) = f(N) = c
f(N) = log N ⇒ f(2N) = f(N) + log 2
f(N) = N ⇒ f(2N) = 2 f(N)
f(N) = N2 ⇒ f(2N) = 4 f(N)
f(N) = N3 ⇒ f(2N) = 8 f(N)
f(N) = 2N ⇒ f(2N) = f2(N)
Advantages of algorithm analysis
To eliminate bad algorithms early
pinpoints the bottlenecks, which are worth coding
carefully
Analysis of Algorithms / Slide 16
Asymptotic notations
f(N) = O(g(N))
There are positive constants c and n0 such that
f(N) ≤ c g(N) when N ≥ n0
Big-Oh: example
Let f(N) = 2N2. Then
f(N) = O(N4)
f(N) = O(N3)
f(N) = O(N2) (best answer, asymptotically tight)
∑
N
i =1
i ≤ N ⋅ N = O( N 2 )
∑i =1
N 2 2 3
i ≤ N ⋅ N = O ( N )
log N + N = O(N)
logk N = O(N) for any constant k
N = O(2N), but 2N is not O(N)
210N is not O(2N)
Analysis of Algorithms / Slide 22
Math Review
a
x = b iff log x b = a
log ab = log a + log b
log m b
log a b =
log m a
b
log a = b log a
a logn = n loga
b b b
log a = (log a ) ≠ log a
d log e x 1
=
dx x
Analysis of Algorithms / Slide 23
lower bound
f(N) = Ω(g(N))
There are positive constants c and n0 such that
f(N) ≥ c g(N) when N ≥ n0
Big-Omega: examples
Let f(N) = 2N2. Then
f(N) = Ω(N)
f(N) = Ω(N2) (best answer)
Analysis of Algorithms / Slide 26
tight bound
the growth rate of f(N) is the same as the growth rate of g(N)
Analysis of Algorithms / Slide 27
Some rules
General Rules
Loops
at most the running time of the statements inside the for-loop
(including tests) times the number of iterations.
O(N)
Nested loops
Consecutive statements
These just add
O(N) + O(N2) = O(N2)
Conditional: If S1 else S2
never more than the running time of the test plus the larger of
the running times of S1 and S2.
O(1)
Analysis of Algorithms / Slide 31
Linear search:
while (low<=higt) {
int mid=(low+high)/2;
if (a[mid]<x)
low=mid+1;
else if (x<a[mid])
high=mid-1;
else return mid;
}
return -1
}
Analysis of Algorithms / Slide 35
while (low<=higt) {
int mid=(low+high)/2;
if (a[mid]<x)
low=mid+1;
else if (x<a[mid])
high=mid-1;
else return mid;
}
return -1 n=high-low
} n_i+1 <= n_i / 2
i.e. n_i <= (N-1)/2^{i-1}
N stops at 1 or below
there are at most 1+k iterations, where k is the smallest such
that (N-1)/2^{k-1} <= 1
so k is at most 2+log(N-1)
O(log N)
Analysis of Algorithms / Slide 36
O(1)
if (low>high) return -1;
else int mid=(low+high)/2;
if (x=a[mid]) return mid; O(1)
else if(a[mid]<x)
bsearch(a,mid+1,high,x); T(N/2)
else bsearch(a,low,mid-1);
T (1) = 1
N
T (N ) =T ( ) + 1
2
Analysis of Algorithms / Slide 37
T ( N ) = k = log N
Thus, the running time is O(log N)
Analysis of Algorithms / Slide 38
Another Example
Maximum Subsequence Sum Problem
Given (possibly negative) integers A1, A2, ....,
j
An, find the maximum value of ∑ Ak
k =i
Algorithm 1: Simple
Exhaustively tries all possibilities (brute force)
N
N-i, at most N
j-i+1, at most N
O(N3)
Analysis of Algorithms / Slide 41
Algorithm 2: improved
// Given an array from left to right
int maxSubSum(const int* a[], const int size) {
int maxSum = 0;
return maxSum;
}
O(N^2)
Analysis of Algorithms / Slide 42
Algorithm 3: Divide-and-conquer
Divide-and-conquer
split the problem into two roughly equal subproblems, which
are then solved recursively
patch together the two solutions of the subproblems to arrive
at a solution for the whole problem
Recurrence equation
T (1) = 1
N
T (N ) = 2T ( ) + N
2
2 T(N/2): two subproblems, each of size N/2
N: for “patching” two solutions to find solution to
whole problem
Analysis of Algorithms / Slide 46
N
T (N ) = 2T ( )+ N
2
N
= 4T ( ) + 2N
4
N
= 8 T ( ) + 3N
8
=
N
= 2 k T ( k ) + kN
2
With 2k = N (or asymptotically), k=log N, we have