Analysis of Algorithms
Subject Code: CO201 Course Title: Data Structures
Text Books:
1. Horowitz and Sahni, “Fundamentals of Data structures”, Galgotia
publications,1983
2. Tannenbaum, “Data Structures”, PHI, 2007( Fifth Impression)
3. An introduction to data structures and application by Jean Paul
Tremblay & Pal G. Sorenson (McGraw Hill).
Reference Books:
2.R.L. Kruse, B.P. Leary, C.L. Tondo, “Data structure and program
design in C”, PHI, 2009( Fourth Impression)
Course Objective (CO):
•To study different kinds of data structures with
their respective applications.
Prerequisites for this course
•Fundamentals of Programming
Analysis of Algorithms
• An algorithm is a finite set of precise instructions
for performing a computation or for solving a
problem.
• What is the goal of analysis of algorithms?
– To compare algorithms mainly in terms of running
time but also in terms of other factors (e.g., memory
requirements, programmer's effort etc.)
• What do we mean by running time analysis?
– Determine how running time increases as the size
of the problem increases.
Time Complexity
• Every problem has a size as an integer value,
which is measured by the quantity of input data.
For example size of a graph can be number of
edges and size of sort can be number of
elements in the list to be sorted.
• Time required for an algorithm is called the time
complexity of the algorithm and is represented
as a function of the size of a problem.
Time space tradeoff
• It is really quite important, even now, to
have efficiency in both space and time.
• Of course, the type of compromise made
depends on the situation, but generally, for most
programmers, time is of the essence, while for
locations in which memory is scarce, of course,
space is the issue.
• Maybe someday we'll be able to find algorithms
that are extremely efficient in both speed and
memory, bridges in the Space-Time
continuum.
Input Size
• Time and space complexity
– This is generally a function of the input size
• E.g., sorting, multiplication
– How we characterize input size depends:
• Sorting: number of input items
• Multiplication: total number of bits
• Graph algorithms: number of nodes & edges
• Etc
Empirical Study
• Write a program implementing the algorithm
• Run program with inputs of varying size and
composition
• Use a function, like the built-in clock(),
System.currentTimeMillis() function, to get an
accurate measure of the actual running time in
NSec/Size
• Plot the results and find the complexity pattern
• Good for embedded/small devices or where the
product is to be manufactured in millions of units
Difficulties in empirical study
• Necessary to implement the algorithm, which
may be difficult
• Results may not be indicative of the running time
on other inputs not included in the experiment.
• Same HW and SW environments must be used
to compare
• Even in same environments results vary based
on processor load, sharing of resources, no of
background processes, status of primary and
secondary memory at time of running program,
compiler, network architecture, programming
language and processor architecture
Micro Analysis
• To count each and every operation of the
program.
• It is detailed, takes more time, complex
• Average lines of codes are 3 to 5 million
lines
• Those operations which are not dependent upon
the size or number of the input will take
constant time and will not participate in the
growth of the time or space function, So they
need not be part of our analysis
Linear Search Example
Macro Analysis
• Deals with selective instructions which are
dominant and costliest. Selection of right
instructions is very important
• Comparisons and Swapping are basic
operations in sorting algorithms
• Arithmetic operations are basic operations in
math algorithms
• Comparisons are basic operations in searching
algorithms
• Multiplication and Addition are basic operations
in matrix multiplication algorithms
How do we compare algorithms?
• We need to define a number of objective
measures.
(1) Compare execution times?
Not good: times are specific to a particular
computer !!
(2) Count the number of statements
executed?
Not good: number of statements vary with
the programming language as well as the
style of the individual programmer.
Ideal Solution
• Express running time as a function of the
input size n (i.e., f(n)).
• Compare different functions corresponding
to running times.
• Such an analysis is independent of
machine time, programming style, etc.
Types of Analysis
• Worst case
– Provides an upper bound on running time
– An absolute guarantee that the algorithm would not run longer,
no matter what the inputs are
• Best case
– Provides a lower bound on running time
– Input is the one for which the algorithm runs the fastest
Lower Bound Running Time Upper Bound
• Average case
– Provides a prediction about the running time
– Assumes that the input is random
Asymptotic Analysis
• Asymptotic analysis means studying the behavior of the
function when n approaches to infinity or very large
• Problems size will keep on increasing so asymptotic
analysis is very important. It has limiting behavior. We
are concerned with large input size.
• To compare two algorithms with running times f(n) and
g(n), we need a rough measure that characterizes how
fast each function grows.
• Hint: use rate of growth
• Compare functions in the limit, that is, asymptotically!
(i.e., for large values of n)
Rate of Growth
• Consider the example of buying elephants and
goldfish:
Cost: cost_of_elephants + cost_of_goldfish
Cost ~ cost_of_elephants (approximation)
• The low order terms in a function are relatively
insignificant for large n
n4 + 100n2 + 10n + 50 n4
~
i.e., we say that n4 + 100n2 + 10n + 50 and n4
have the same rate of growth
Asymptotic Notation
• O notation: asymptotic “less than”:
– f(n)=O(g(n)) implies: f(n) “≤” g(n)
• notation: asymptotic “greater than”:
– f(n)= (g(n)) implies: f(n) “≥” g(n)
• notation: asymptotic “equality”:
– f(n)= (g(n)) implies: f(n) “=” g(n)
Asymptotic growth rate
• O(g(n)): class of functions f(n) that grow no faster
than g(n)
• Θ (g(n)): class of functions f(n) that grow at same
rate as g(n)
• Ω(g(n)): class of functions f(n) that grow at least as
fast as g(n)
Big-O Notation
• We say fA(n)=30n+8 is order n, or O
(n) It is, at most, roughly proportional to n.
• fB(n)=n2+1 is order n2, or O(n2). It is, at most,
roughly proportional to n2.
• In general, any O(n2) function is
faster- growing than any O(n) function.
Visualizing Orders of Growth
• On a graph, as
you go to the
right, a faster
growing
Value of function
function fA(n)=30n+8
eventually
becomes
larger... fB(n)=n2+1
Increasing n
More Examples …
• n4 + 100n2 + 10n + 50 is O(n4)
• 10n3 + 2n2 is O(n3)
• n3 - n2 is O(n3)
• constants
– 10 is O(1)
– 1273 is O(1)
Example
Algorithm 1 Algorithm 2
Cost Cost
arr[0] = 0; c1 for(i=0; i<N; i++) c2
arr[1] = 0; c1 arr[i] = 0; c1
arr[2] = 0; c1
...
arr[N-1] = 0; c1
c1+c1+...+c1 = c1 x N (N+1) x c2 + N x c1 =
(c2 + c1) x N + c2
• Both algorithms are of the same order: O(N)
Example (cont’d)
Algorithm 3 Cost
sum = 0; c1
for(i=0; i<N; i++) c2
for(j=0; j<N; j++) c2
sum += arr[i][j]; c3
c1 + c2 x (N+1) + c2 x N x (N+1) + c3 x N2 = O(N2)
Asymptotic notations
• O-
notation
No Uniqueness
• There is no unique set of values for n0 and c in proving the
asymptotic bounds
• Prove that 100n + 5 = O(n2)
– 100n + 5 ≤ 100n + n = 101n ≤ 101n2
for all n ≥ 5
n0 = 5 and c = 101 is a solution
– 100n + 5 ≤ 100n + 5n = 105n ≤ 105n2
for all n ≥ 1
n0 = 1 and c = 105 is also a solution
Must find SOME constants c and n0 that satisfy
the asymptotic notation relation
Asymptotic notations (cont.)
• -
notation
(g(n)) is the set of functions
with larger or same order of
growth as g(n)
Examples
– 5n2 = (n)
c, n0 such that: 0 cn 5n2 cn 5n2 c = 1 and n0 = 1
– 100n + 5 ≠ (n2)
c, n0 such that: 0 cn2 100n + 5
100n + 5 100n + 5n ( n 1) = 105n
cn2 105n n(cn – 105) 0
Since n is positive cn – 105 0
n 105/c
contradiction: n cannot be smaller
Asymptotic notations (cont.)
• -
notation
(g(n)) is the set of functions
with the same order of growth
as g(n)
Examples
– n2/2 –n/2 = (n2)
c2= ½ , c1= 1/14 and n0
=7
– n ≠ (n2): c1 n2 ≤ n ≤ c2 n2
only holds for: n ≤ 1/c1
Relations Between , O,
Common Complexity terms
S.NO Big O Notation Name
1. O(1) Constant Space Complexity
2. O(log n) Logarithmic Space Complexity
3. O(n) Linear Space complexity
4. O(n log n) Linearithmic Space Complexity
5. O(n^2) Quadratic Space Complexity
6. O(n^3) Cubic Space Complexity
7. O(n^y) Polynomial Space Complexity
8. O(2^n) Exponential Space Complexity
9. O(n!) Factorial Space Complexity
Practice 1
What is time complexity for following?
1. Carry n items from one room to another room.
2. Locating patient record in Doctor Office
3. Store manager gives gifts to first 10 customers standing in the
queue.
Practice 2
A( )
{ int a=0;
for(int i=1; i<=m; i++)
{--}
for(int j=1; j<=n; j++)
{--}
}
Practice 3
A( )
{ int a=0;
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{--}
}
Practice 4
A( )
{ int a=0;
for(int i=1; i<=n; i=i*2)
{--}
}