37
Analysis Tools

Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Embed Size (px)

DESCRIPTION

What is an Algorithm? An algorithm is a finite set of instructions that specify a sequence of operations to be carried out in order to solve a specific problem or class of problems.

Citation preview

Page 1: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Analysis Tools

Page 2: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Acknowledgement

Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Page 3: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

What is an Algorithm?

An algorithm is a finite set of instructions that specify a sequence of operations to be carried out in order to solve a specific problem or class of problems.

Page 4: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Algorithm Properties

An algorithm must possess the following properties:– Finiteness: Algorithm must complete after a finite number of

instructions have been executed. – Absence of ambiguity: Each step must be clearly defined,

having only one interpretation.– Definition of sequence: Each step must have a unique defined

preceding & succeeding step. The first step (start step) & last step (halt step) must be clearly noted.

– Input/output: There must be a specified number of input values, and one or more result values.

– Feasibility: It must be possible to perform each instruction.

Page 5: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Analyzing an Algorithm

In order to learn more about an algorithm, we can analyze it. That is, draw conclusions about how the implementation of that algorithm will perform in general. This can be done in various ways.

– determine the running time of a program as a function of its inputs; – determine the total or maximum memory space needed for program data; – determine the total size of the program code; – determine whether the program correctly computes the desired result; – determine the complexity of the program--e.g., how easy is it to read,

understand, and modify; and, – determine the robustness of the program--e.g., how well does it deal

with unexpected or erroneous inputs?

Page 6: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Analyzing an Algorithm

Different ways of analyzing the algorithm with render different results. An algorithm that runs fast is not necessarily robust or correct. An algorithm that has very little lines of code does not necessarily use less resources.So, how can we measure the efficiency of an algorithm?

Page 7: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Design Considerations

Given a particular problem, there are typically a number of different algorithms that will solve that problem. A designer must make a rational choice among those algorithms:

– To design an algorithm that is easy to understand, implement, and debug (software engineering).

– To design an algorithm that makes efficient use of the available computational resources (data structures and algorithm analysis)

Page 8: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Example

Gauss summationsum N(N+1)/2

Gauss Summation: http://www.cut-the-knot.org/Curriculum/Algebra/GaussSummation.shtml

Easy to understand, but slow.

More efficient, but need to be as smart as 10-year-old Gauss.

Replaced by

Page 9: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Algorithm Analysis in CSCI 3333

But, how do we measure the efficiency of an algorithm? Note that the number of operations to be performed and the space required will depend on the number of input values that must be processed.

Page 10: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Benchmarking algorithms

It is tempting to measure the efficiency of an algorithm by producing an implementation and then performing benchmarking analysis by running the program on input data of varying sizes and measuring the “wall clock” time for execution. However, there are many factors that affect the running time of a program. Among these are the algorithm itself, the input data, and the computer system used to run the program. The performance of a computer is determined by

– the hardware: processor used (type and speed), memory available (cache and RAM), and disk available;

– the programming language in which the algorithm is specified; – the language compiler/interpreter used; – the computer operating system software.

Page 11: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Asymptotic Analysis

Therefore, the goal is to have a way of describing the inherent complexity of a program, independent of machine/compiler considerations. This means not describing the complexity by the absolute time or storage needed.

Instead, focus should be concentrated on a "proportionality" approach, expressing the complexity in terms of its relationship to some known function and the way the program scales as the input gets larger. This type of analysis is known as asymptotic analysis.

Page 12: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Asymptotic Analysis

There is no generally accepted set of rules for algorithm analysis. In some cases, an exact count of operations is desired; in other cases, a general approximation is sufficient.

Therefore, we strive to setup a set of rules to determine how operations are to be counted.

Page 13: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Analysis Rules

To do asymptotic analysis, start by counting the primitive operations in an algorithm and adding them up.

Assume that primitive operations will take a constant amount of time, such as:

– Assigning a value to a variable– Calling a function– Performing an arithmetic operation– Comparing two numbers– Indexing into an array– Returning from a function– Following a pointer reference

Page 14: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Example of Counting Primitive Operations

Inspect the pseudocode to count the primitive operations as a function of the input size (n)

Algorithm arrayMax(A,n):currentMax A[0]

for i 1 to n – 1 do

if currentMax < A[i] then currentMax A[i]

return currentMax

CountArray indexing + Assignment 2

Initializing i 1Verifying i<n nArray indexing + Comparing 2(n-1)Array indexing + Assignment 2(n-1)worstIncrementing the counter 2(n-1)Returning 1

Best case: 2+1+n+4(n–1)+1 = 5n Worst case: 2+1+n+6(n–1)+1 = 7n-2

Page 15: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Best, Worst, or Average Case Analysis

An algorithm may run faster on some input data than on others.Best case – the data is distributed so that the

algorithm runs fastestWorst case – the data distribution causes the

slowest running timeAverage case – very difficult to calculate

For our purposes, will concentrate on analyzing algorithms by identifying the running time for the worst case data.

Page 16: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Estimating the Running Time

The actual running time depends on the speed of the primitive operations—some of them are faster than others– Let t = speed of the slowest primitive operation

= worst case scenario

– Let f(n) = the worst-case running time of arrayMaxf(n) = t (7n – 2)

Page 17: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rate of a Linear Loop

Growth rate of arrayMax is linear. Changing the hardware alters the value of t, so that arrayMax will run faster on a faster computer. However, growth rate is still linear.

0

100

200

300

400

500

600

0 2 4 6 8n

f(n)

Slow PC10(7n-2)

Fast PC5(7n-2)

Fastest PC1(7n-2)

Page 18: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rate of a Linear Loop

What about the following loop?for (i=0; i<n; i+=2 ) do something

Here, the number of iterations is half of n. However, higher the factor, higher the number of loops. So, although f(n) = n/2, if you were to plot the loop, you would still get a straight line. Therefore, this is still a linear growth rate.

Page 19: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rate of a Logarithmic Loop

What about the following segments?

for (i=1; i<n; i*=2 ) for (i=n; i>=1; i/=2 ) do something do something

When n=1000, the loop will iterate only 10 times. It can be seen that the number of iterations is a function of the multiplier or divisor. This kind of function is said to have logarithmic growth, where f(n) = log n

Page 20: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rate of a Linear Logarithmic Loop

What about the following segments?for (i=1; i<n; i++ )

for (j=1; j<n; j*=2 ) do something

Here, the outer loop has a linear growth, and the inner loop has a logarithmic growth. Therefore:

f(n) = n log n

Page 21: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rates ofCommon Classes of Functions

Input size n

Running timef(n)

Quadratically

Exponentially

Logarithmically

Linearly

Constant

Page 22: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Is This Really Necessary?

Is it really important to find out the exact number of primitive operations performed by an algorithm? Will the calculations change if we miss out one primitive operation?

In general, each step of pseudo-code or statement corresponds to a small number of primitive operations that does not depend on the input size. Thus, it is possible to perform a simplified analysis that estimates the number of primitive operations, by looking at the “big picture”.

Page 23: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

What exactly is Big-O?

Big-O expresses an upper bound on the growth rate of a function, for sufficiently large values of n.

Upper bound is not the worst case. What is being bounded is not the running time (which can be determined by a given value of n), but rather the growth rate for the running time (which can only be determined over the range of values for n).

Page 24: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Big-Oh Notation

Definition:Let f(n) and g(n) be functions mapping nonnegative integers to real numbers.

Then, f(n) is O(g(n)) ( f(n) is big-oh of g(n) ) if there is a real constant c>0 and an integer constant n01, such that f(n) cg(n) for every integer nn0

By the definition above, demonstrating that a function f is big-O of a function g requires that we find specific constants C and N for which the inequality holds (and show that the inequality does, in fact, hold).

Page 25: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Big-O Theorems

For all the following theorems, assume that f(n) is a function of n and that K is an arbitrary constant.– Theorem1: K is O(1)– Theorem 2: A polynomial is O(the term containing the highest power

of n)f(n) = 7n4 + 3n2 + 5n + 1000 is O(7n4)

– Theorem 3: K*f(n) is O(f(n)) [that is, constant coefficients can be dropped]

g(n) = 7n4 is O(n4)

– Theorem 4: If f(n) is O(g(n)) and g(n) is O(h(n)) the f(n) is O(h(n)). [transitivity]

Page 26: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Big-O Theorems

Theorem 6: In general, f(n) is big-O of the dominant term of f(n), where “dominant” may usually be determined from Theorem 5.

f(n) = 7n2+3nlog(n)+5n+1000 is O(n2)g(n) = 7n4+3n+106 is O(3n)h(n) = 7n(n+log(n)) is O(n2)

Theorem 7: For any base b, logb(n) is O(log(n)).

Page 27: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Examples

In general, in Big-Oh analysis, we focus on the “big picture,” that is, the operations that affect the running time the most – the loops

Simplify the count:1. Drop all lower-order terms

7n – 2 7n2. Eliminate constants

7n n3. Remaining term is the Big-Oh

7n – 2 is O(n)

Page 28: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

More Examples

Example: f(n) = 5n3 – 2n2 + 11. Drop all lower order terms

5n3 – 2n2 + 1 5n3

2. Eliminate the constants5n3 n3

3. The remaining term is the Big-Ohf(n) is O(n3)

Page 29: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Determining Complexities in General

1. We can drop the constants2. sum rule: for a sequential loops add their Big-Oh values

statement 1; statement 2; ... statement k; total time = time(statement 1) + time(statement 2) + ... +

time(statement k)• if-then-else statements: the worst-case time is the slowest of the

two possibilitiesif (cond) {

sequence of statements 1 } else {

sequence of statements 2 } Total time = max(time(sequence 1), time(sequence 2))

Page 30: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Determining Complexities in General

4. for loops: The loop executes N times, so the sequence of statements also executes N times. Since we assume the statements are O(1),

total time = N * O(1) = O(N)

5. Nested for loops: multiply their Big-Oh valuesfor (i = 0; i < N; i++) { for (j = 0; j < M; j++) {

sequence of statements } } total time = O(N) * O(M) = O(N*M)

6. In a polynomial, the term with the highest degree establishes the Big-Oh

Page 31: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Growth Rate Examples

Efficiency Example

ConstantO(1) Accessing an element of an array

LogarithmicO(log n) Binary search

LinearO(n)

Pushing a collection of elements onto a stack

QuadraticO(n2) Bubble sort

ExponentialO(2n) Towers of Hanoi (Goodrich, 198)

Page 32: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Why Does Growth Rate Matter?

nConstant

O(1)Logarithmic

O(logn)LinearO(n)

QuadraticO(n2)

10 0.4 nsec 1.33 nsec 4.0 nsec 40.0 nsec

1,000 0.4 nsec 3.99 nsec 0.4 sec 0.4 msec

100,000 0.4 nsec 6.64 nsec 0.04 msec 4.0 sec

10,000,000 0.4 nsec 9.30 nsec 0.004 sec 1.11 hr

Assuming that it takes 0.4 nsec to process one element

Page 33: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Finding the Big-Oh

for( int i=0; i<n; ++i ) { for(int j=0; j<n; ++j) { myArray[i][j] = 0; }}

sum = 0;

for( int i=0; i<n; ++i ) { for(int j=0; j<i; ++j) { sum++; }}

Page 34: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Example that shows why the Big-Oh is so important.

Write a program segment so that, given an array X, compute array A such that, each number A[i] is the average of the numbers in X from X[0] to X[i]

1 3 5 7 9

1 2 3 4 5

X

A

X[0] + X[1] + X[2] = 9

9 / 3 = 3

Page 35: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Solution #1 – Quadratic time

Algorithm prefixAverages1…for i 0 to n-1 do a 0 for j 0 to i do a a + X[j] A[i] a/(i+1)…

Two nested loops

Inner loop – loopsthrough X, adding the numbers from element 0 through element i

Outer loop – loopsthrough A, calculatingthe averages and putting the resultinto A[i]

Page 36: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

Algorithm prefixAverages2…s 0for i 0 to n-1 do s s + X[i] A[i] s/(i+1)…

Only one loop

Solution #2 - Linear Time

Sum – keeps track of thesum of the numbers in Xso that we don’t have to loop through X every time

Loop – loopsthrough A, addingto the sum, calculatingthe averages, and putting the resultinto A[i]

Page 37: Analysis Tools. Acknowledgement Ms. Krishani Abeysekera Dr. Bun Yue Mr. Charles Moen Dr. Wei Ding Dr. Michael Goodrich

1. Both algorithms correctly solved the problem– Lesson – There may be more than one way to write your

program.

2. One of the algorithms was significantly faster– Lesson – The algorithm that we choose can have a big

influence on the program’s speed.

Evaluate the solution that you pick, and ask whether it is the most efficient way to do it.

Lessons Learned