Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
80 views

Analysis of Algorithms: CS 302 - Data Structures Section 2.6

This document discusses algorithm analysis and computational models. It begins by defining an algorithm and algorithm analysis as predicting the resources required by an algorithm like time and memory. It then discusses the computational model used for analysis, which assumes an idealized random access machine that can perform basic operations in constant time. The document provides examples analyzing simple algorithms to determine their time complexity and discusses how complexity is expressed asymptotically for large inputs. It emphasizes that the highest order term determines an algorithm's rate of growth.

Uploaded by

Munawar Ahmed
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
80 views

Analysis of Algorithms: CS 302 - Data Structures Section 2.6

This document discusses algorithm analysis and computational models. It begins by defining an algorithm and algorithm analysis as predicting the resources required by an algorithm like time and memory. It then discusses the computational model used for analysis, which assumes an idealized random access machine that can perform basic operations in constant time. The document provides examples analyzing simple algorithms to determine their time complexity and discusses how complexity is expressed asymptotically for large inputs. It emphasizes that the highest order term determines an algorithm's rate of growth.

Uploaded by

Munawar Ahmed
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 48

Analysis of Algorithms

CS 302 - Data Structures


Section 2.6
What is Algorithm Analysis?
• Algorithm: A clearly specified finite set of
instructions a computer follows to solve a
problem.
• Algorithm analysis:
– Predicting the resources that an algorithm requires.
i.e computational time and memory.
– a process of determining the amount of time,
resource, etc. required when executing an algorithm.
Model of Computation (Assumptions)

•Analysis independent of the variations in


– Machine
– Operating system
– Programming languages
– Compiler etc.
•Low-level details will not be considered
•Our model will be an abstraction of a standard generic
single-processor machine, called a random access machine
or RAM.
Model of Computation (Assumptions)
• A RAM is assumed to be an idealized machine
– Infinitely large random-access memory
– Instructions execute sequentially
• Every instruction is in fact a basic operation on two values in
the machines memory which takes unit time.
• These might be characters or integers.
• Example of basic operations include
– Assigning a value to a variable
– Arithmetic operation (+, - , × , /) on integers
– Performing any comparison e.g. a < b
– Boolean operations
– Accessing an element of an array.
Model of Computation (Assumptions)
• In theoretical analysis, computational complexity
– Estimated in asymptotic sense, (in computer science in
the analysis of algorithms, considering the performance
of algorithms when applied to very large input
datasets).i.e. Estimating for large inputs
• Big O, Omega, Theta etc. notations are used to compute the
complexity
• Asymptotic notations are used because different
implementations of algorithm may differ in efficiency
• Efficiencies of two given algorithm are related
– By a constant multiplicative factor
– Called hidden constant.
Algorithms Analysis and Design
Drawbacks in Model of Computation
First poor assumption
• We assumed that each basic operation takes constant
time, i.e. model allows
– Adding
– Multiplying
– Comparing etc.
two numbers of any length in constant time
• Addition of two numbers takes a unit time!
– Not good because numbers may be arbitrarily
• Addition and multiplication both take unit time!
– Again very bad assumption
Model of Computation not so Bad
Finally what about Our Model?
• But with all these weaknesses, our model is not so bad
because we have to give the
– Comparison not the absolute analysis of any algorithm.
– We have to deal with large inputs not with the small size
• Model seems to work well describing computational
power of modern nonparallel machines

Can we do Exact Measure of Efficiency ?


• Exact, not asymptotic, measure of efficiency can be
sometimes computed but it usually requires certain
assumptions concerning implementation
Algorithms Analysis and Design
A Simple Example
// Input: int A[N], array of N
integers
// Output: Sum of all numbers in
array A

int Sum(int A[], int N) {


int s=0;
for (int i=0; i< N; i++)
s = s + A[i];
return s;
}
How should we analyse this?

Applied Algo Fall-03 8/31


A Simple Example
Analysis of Sum
1.) Describe the size of the input in terms of one ore
more
parameters:
- Input to Sum is an array of N ints, so size is N.

2.) Then, count how many steps are used for an input
of that size:
- A step is an elementary operation such as
+, <, =, A[i]

Applied Algo Fall-03 9/31


A Simple Example

Analysis of Sum (2)


// Input: int A[N], array of N integers
// Output: Sum of all numbers in array A

int Sum(int A[], int N {


int s=0; 1

for (int i=0; i< N; i++)


2 3 4
s = s + A[i];
5
6 7 1,2,8: Once
return s; 3,4,5,6,7: Once per each iteration
}
8 of for loop, N iteration
Total: 5N + 3
The complexity function of the
algorithm is : f(N) = 5N +3

Applied Algo Fall-03 10/31


Analysis: A Simple Example

How 5N+3 Grows


Estimated running time for different values of N:

N = 10 => 53 steps
N = 100 => 503 steps
N = 1,000 => 5003 steps
N = 1,000,000 => 5,000,003 steps

As N grows, the number of steps grow in linear proportion to


N for this Sum function.

Applied Algo Fall-03 11/31


Summary : Computational Model
• Analysis will be performed with respect to this
computational model for comparison of algorithms
• We will give asymptotic analysis not detailed
comparison i.e. for large inputs
• We will use generic uniprocessor random-access
machine (RAM) in analysis
– All memory equally expensive to access
– No concurrent operations
– All reasonable instructions take unit time, except, of
course, function calls
Analysis of Algorithms
What is the goal?
• Analyze time requirements - predict how
running time increases as the size of the
problem increases:

time = f(size)
Why is it useful?
• To compare different algorithms.
Defining “problem size”
• Typically, it is straightforward to identify the size of
a problem, e.g.:
– size of array

– size of stack, queue, list etc.

– vertices and edges in a graph

• But not always …


Time Analysis
• Provides upper and lower bounds of running time.

Lower Bound  Running Time Upper Bound

• Different types of analysis:


- Worst case
- Best case
- Average case
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.

Lower Bound  Running Time  Upper Bound


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 an estimate of “average” running time.


• Assumes that the input is random.
• Useful when best/worst cases do not happen very
often (i.e., few input cases lead to best/worst cases).

Lower Bound  Running Time Upper Bound


Example: Searching
• Problem of searching an ordered list.
– Given a list L of n elements that are sorted into
a definite order (e.g., numeric, alphabetical),
– And given a particular element x,
– Determine whether x appears in the list, and if
so, return its index (i.e., position) in the list.
Linear Search
procedure linear search
(x: integer, a1, a2, …, an: distinct integers)
i := 1
while (i  n  x  ai) NOT EFFICIENT!
i := i + 1
if i  n then location := i
else location := 0
return location
How do we analyze an algorithm?

• Need to define objective measures.

(1) Compare execution times?


Not good: times are specific to a particular machine.

(2) Count the number of statements?


Not good: number of statements varies with
programming language and programming style.
Example
Algorithm 1 Algorithm 2
 
arr[0] = 0; for(i=0; i<N; i++)
arr[1] = 0; arr[i] = 0;
arr[2] = 0;
...
arr[N-1] = 0;
How do we analyze an algorithm?
(cont.)
(3) Express running time t as a function of
problem size n (i.e., t=f(n) ).

- Given two algorithms having running times f(n)


and g(n), find which functions grows faster.

- Such an analysis is independent of machine


time, programming style, etc.
How do we find f(n)?
(1) Associate a "cost" with each statement.
(2) Find total number of times each statement is executed.
(3) Add up the costs.

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
How do we find f(n)? (cont.)

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 N x N
Comparing algorithms
• Given two algorithms having running times
f(n) and g(n), how do we decide which one
is faster?

•Compare “rates of growth” of f(n) and g(n)


Understanding Rate of Growth

• Consider the example of buying elephants and


goldfish:

Cost: (cost_of_elephants) + (cost_of_goldfish)

Approximation:

Cost ~ cost_of_elephants
Understanding Rate of Growth
(cont’d)

• The low order terms of a function are relatively


insignificant for large n

n4 + 100n2 + 10n + 50

Approximation:

n4

• Highest order term determines rate of growth!


Example
• Suppose you are designing a website to process
user data (e.g., financial records).
• Suppose program A takes fA(n)=30n+8
microseconds to process any n records, while
program B takes fB(n)=n2+1 microseconds to
process the n records.
• Which program would you choose, knowing
you’ll want to support millions of users?

Compare rates of growth:


30n+8 ~ n and n2+1 ~ n2
Visualizing Orders of Growth
• On a graph, as
you go to the

Value of function 
fA(n)=30n+8
right, a faster
growing
function
fB(n)=n2+1
eventually
becomes
larger... Increasing n 
Rate of Growth ≡Asymptotic Analysis

• Using rate of growth as a measure to compare


different functions implies comparing them
asymptotically (i.e., as n   )

• If f(x) is faster growing than g(x), then f(x)


always eventually becomes larger than g(x) in
the limit (i.e., for large enough values of x).
Asymptotic Notation

• O notation: asymptotic “less than”:

f(n)=O(g(n)) implies: f(n) “≤” c g(n) in the limit*


c is a constant

(used in worst-case analysis)

*
formal definition in CS477/677
Asymptotic Notation

  notation: asymptotic “greater than”:


f(n)=  (g(n)) implies: f(n) “≥” c g(n) in the limit*
c is a constant

(used in best-case analysis)

*
formal definition in CS477/677
Asymptotic Notation

  notation: asymptotic “equality”:


f(n)=  (g(n)) implies: f(n) “=” c g(n) in the limit*
c is a constant

(provides a tight bound of running time)


(best and worst cases are same)

*
formal definition in CS477/677
Big-O Notation - Examples

fA(n)=30n+8 is O(n)

fB(n)=n2+1 is O(n2)

10n3 + 2n2 is O(n3)

n3 - n2 is O(n3)

1273 is O(1)
More on big-O
O(g(n)) is a set of functions f(n)
f(n) ϵ O(g(n)) if “f(n)≤cg(n)”
Big-O Notation - Examples

fA(n)=30n+8 is O(n) or O(n2)

fB(n)=n2+1 is O(n2) or O(n4)


But it is important to
10n3 + 2n2 is O(n3) or O(n4) use as “tight” bounds
as possible!

n3 - n2 is O(n3) or O(n5)

1273 is O(1) or O(n)


Common orders of magnitude
Algorithm speed vs function growth
• An O(n ) algorithm will be slower than an O(n)
2

algorithm (for large n).


• But an O(n2) function will grow faster than an
O(n) function. Value of function 

fA(n)=30n+8

fB(n)=n2+1

Increasing n 
Estimating running time
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

O(N)
Estimate running time (cont.)
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
O(Nx N2)x (N+1) + c3 x N x N
Running time of various statements
while-loop for-loop
Examples
i = 0;
while (i<N) {
X=X+Y; // O(1)
result = mystery(X); // O(N), just an example...
i++; // O(1)
}
• The body of the while loop: O(N)
• Loop is executed: N times
N x O(N) = O(N2)
Examples (cont.’d)
if (i<j)
O(N)
for ( i=0; i<N; i++ )
X = X+i;
else O(1)
X=0;

Max ( O(N), O(1) ) = O (N)


Examples (cont.’d)
Examples (cont.’d)
Examples (cont.’d)
• Analyze the complexity of the following
code segments:

You might also like