Download ANALYSIS OF ALGORITHMS

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Knapsack problem wikipedia , lookup

Corecursion wikipedia , lookup

Sieve of Eratosthenes wikipedia , lookup

Theoretical computer science wikipedia , lookup

Computational complexity theory wikipedia , lookup

Gene expression programming wikipedia , lookup

Pattern recognition wikipedia , lookup

Probabilistic context-free grammar wikipedia , lookup

Smith–Waterman algorithm wikipedia , lookup

Sorting algorithm wikipedia , lookup

Multiplication algorithm wikipedia , lookup

Simplex algorithm wikipedia , lookup

Quicksort wikipedia , lookup

Genetic algorithm wikipedia , lookup

K-nearest neighbors algorithm wikipedia , lookup

Binary search algorithm wikipedia , lookup

Fisher–Yates shuffle wikipedia , lookup

Fast Fourier transform wikipedia , lookup

Dijkstra's algorithm wikipedia , lookup

Expectation–maximization algorithm wikipedia , lookup

Stemming wikipedia , lookup

Planted motif search wikipedia , lookup

Algorithm characterizations wikipedia , lookup

Algorithm wikipedia , lookup

Factorization of polynomials over finite fields wikipedia , lookup

Time complexity wikipedia , lookup

Transcript
ANALYSIS OF ALGORITHMS
Data Structures
Algorithms
Definition
A step by step procedure for performing
some task in a finite amount of time
Analysis
Methodology for analyzing a “good”
algorithm (i.e. Archimedes)
Look at Running Time
How are algorithms described ?
PSEUDO-CODE
representation of an algorithm
combines
natural language
familiar programming language structures
facilitates the high-level analysis of an
algorithm
Pseudo-Code Conventions
Expressions
Algorithm Structures
Control Structures
Expressions
Standard math symbols
+
-
*
/
()
Relational operators
Boolean operators
and
or
not
Assignment operator
Array indexing A[i]
,=
Algorithm Structure
Algorithm heading
Algorithm name(param1, param2,...):
Input : input elements
Output : output elements
Statements
call
return statement
control structures
object.method(arguments)
return value
Control Structures
decision structures

if ... then ... [else ...]
while loops

while ... do
repeat loops

repeat ... until ...
for loop

for ... do
General Rules
communicate high level ideas and not
implementation details (programming
language specifics)
clear and informative
Example - Problem
Problem : Write pseudo-code for an
algorithm that will determine the
maximum element from a list (array)
Example - Algorithm
Algorithm arrayMax(A,n):
Input: An array A storing n integers.
Output: The maximum element in A.
currentMax
A[0]
for i
1 to n - 1 do
if currentMax < A[i] then
currentMax
A[i]
return currentMax
Analysis of Algorithms
Running time
depends on input size n
number of primitive operations performed
Primitive operation
unit of operation that can be identified in the
pseudo-code
Primitive Operations-Types
Assigning a value to a variable
Calling a method/procedure
Performing an arithmetic operation
Comparing two numbers
Returning from a method/procedure
Primitive Operations Some General Rules
for Loops
Nested for Loops
Conditional Statements
for Loops
The running time of a for loop is at most
the running time of the statements inside
the for loop (including tests) times the
number of iterations.
Example
for i
0 to n - 1 do
A[i]
0
Nested for Loops
Analyze these inside out. The total
running time of a statement inside a
group of nested for loops is the running
time of the statement multiplied by the
product of the sizes of all the for loops.
Example
for i
0 to n - 1 do
for j
0 to n - 1 do
k++
Conditional Statements
if (cond) then
S1
else
S2
The running time of an if-else statement is
never more than the running time of the
test plus the larger of the running times
of S1 and S2.
Primitive Operations Example
Count the number of primitive
operations in this program :
i=0
a=0
for i = 1 to n do
print i
a=a+i
return i
Primitive Operations Example
Estimate : 3n + 3
Linear Time
- (i.e. 6n + 2, 3n+5, n+1,etc.)
Primitive Operations Example 2
Count the number of primitive
operations in this program :
i=0
a=0
for i = 1 to n do
print i
for a = 1 to n do
print a
return i
Primitive Operations Example2
Estimate : n2 + n + 3
Polynomial (Quadratic) Time
Example 3 - Class
Algorithm sum(int n):
Input: Integer n
Output: Sum of the cubes of 1 to n
partial_sum
0
for i
1 to n do
partial_sum
partial_sum + i*i*i
return (partial_sum)
Primitive Operations Considerations
Arbitrariness of measurement
Worst-case versus average-case (difficult
to be exact : range)
Implicit operations
loop control actions
array access
Analysis of Algorithms
take-out the effect of constant factors
(i.e. 2n vs 3n : same level)
this can be attributed to differences in
hardware and software environments
compare algorithms across types (linear
vs polynomial vs exponential)
look at growth rates
Asymptotic Notation
Goal:
To simplify analysis by getting rid of
irrelevant information
The “Big-Oh” Notation
Given functions f(n) and g(n), f(n) is O
(g(n)) if f(n) <= c g(n) for n>= n0 where c
and n0 are constants
Big-Oh Notation
Rule : Drop lower order terms and
constant factors
5n + 2 is O (n)
4n3log n + 6n3 + 1 is O (n3logn)
Big-Oh Notation - Relatives
Big Omega (reverse)
Big Theta (both ways, same level)
General Rule : Use the most descriptive
notation to describe the algorithm
Practical Significance of
Big-Oh Notation
Example
for i
0 to n-1 do
A[i]
0
Running time is
2n, if we count assignments & array accesses
3n, if we include implicit loop assignments
4n, if we include implicit loop comparisons
Regardless, running time is O (n)
Algorithms - Common
Classifications
Typical functions that classify algorithms
constant
logarithmic
linear
quadratic
exponential
O (1)
O (log n)
O (n)
O (n2)
O (an), n > 1
Linear Search vs Binary
Search
Linear Search
Binary Search
O (n)
O (log n)
Example : to search for a number from
1024 entries using the binary search
algorithm will only take 10 steps
O(log n) Algorithm
Steps
Range (n)
Power of 2
0
1
20
1
2
21
2
4
22
3
8
23
4
16
24
5
32
25
6
64
26
7
128
27
O(log n) Algorithm
Binary Search
Algorithm bin_search(int a[], int x, int n)
Input: Array a, search target x,
array size n
Output: Position of x in the array (if found)
`
{
low
0; high
n-1
while (low <= high) do
mid
(low + high)/2
if(a[mid] < x) then
low
mid + 1
else
if (a[mid] > x) then
high
mid - 1
else
return (mid)
return (NOT_FOUND)
}
Prefix Average Problem
Given an array X storing n numbers, we
want to compute an array A such that
A[1] is the average of elements X[0] …
X[I] for I = 0 … n-1.
algorithm A = O (n2)
algorithm B = O (n)