Top Banner
BİM213 Data Structures And Algorithms WEEK 1 Algorithm Analysis Types of Complexities
31

BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

May 08, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

BİM213Data Structures And Algorithms

WEEK 1

Algorithm Analysis

Types of Complexities

Page 2: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Complexity Analysis (Part I)

Data Structure ,Algorithm and Complexity Definitions

Motivations for Complexity Analysis.

Example of Basic Operations

Average, Best, and Worst Cases.

Simple Complexity Analysis Examples.

Page 3: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Definitions

• Data Structure: is the way in which the data of the program are stored.

• Algorithm: is a well defined sequence of computational steps to solve a problem. It is often accepts a set of values as input & produces a set of values as output.

• Algorithm Analysis: is the number of steps or instructions and memory locations needed to perform a certain problem for any input of a particular size

Page 4: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Motivations for Complexity Analysis

• There are often many different algorithms which can be used to solve the same problem. Thus, it makes sense to develop techniques that allow us to:

o compare different algorithms with respect to their “efficiency”

o choose the most efficient algorithm for the problem

• The efficiency of any algorithmic solution to a problem is a measure of the:

o Time efficiency: the time it takes to execute.

o Space efficiency: the space (primary or secondary memory) it uses.

• We will focus on an algorithm’s efficiency with respect to time.

Page 5: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Machine independence

• The evaluation of efficiency should be as machine independent as possible.

• It is not useful to measure how fast the algorithm runs as this depends on which particular computer, OS, programming language, compiler, and kind of inputs are used in testing

• Instead, o we count the number of basic operations the algorithm performs.

o we calculate how this number depends on the size of the input.

• A basic operation is an operation which takes a constant amount of time to execute.

• Hence, the efficiency of an algorithm is the number of basic operations it performs. This number is a function of the input size n.

Page 6: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Example of Basic Operations:

• Arithmetic operations: *, /, %, +, -

• Assignment statements of simple data types.

• Reading of primitive types

• writing of a primitive types

• Simple conditional tests: if (x < 12) ...

• method call (Note: the execution time of the method itself may depend on the value of parameter and it may not be constant)

• a method's return statement

• Memory Access

• We consider an operation such as ++ , += , and *= as consisting of two basic operations.

• Note: To simplify complexity analysis we will not consider memory access (fetch or store) operations.

Page 7: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Best, Average, and Worst case complexities

• We are usually interested in the worst case complexity: what are the most operations that might be performed for a given problem size. We will not discuss the other cases -- best and average case.

• Best case depends on the input

• Average case is difficult to compute

• So we usually focus on worst case analysis• Easier to compute• Usually close to the actual running time• Crucial to real-time systems (e.g. air-traffic control)

Page 8: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Best, Average, and Worst case complexities

• Example: Linear Search Complexity

• Best Case : Item found at the beginning: One comparison

• Worst Case : Item found at the end: n comparisons

• Average Case :Item may be found at index 0, or 1, or 2, . . . or n - 1• Average number of comparisons is: (1 + 2 + . . . + n) / n = (n+1) / 2

• Worst and Average complexities of common sorting algorithms

Method Worst Case Average Case

Selection sort N2 n2

Inserstion sort n2 n2

Merge sort n log n n log n

Quick sort n2 n log n

Page 9: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis: Loops

•We start by considering how to count operations in for-loops. • We use integer division throughout.

•First of all, we should know the number of iterations of the loop; say it is x. • Then the loop condition is executed x + 1 times.

• Each of the statements in the loop body is executed x times.

• The loop-index update statement is executed x times.

Page 10: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis: Loops

• In the following for-loop:

The number of iterations is: (n – k ) / m

• The initialization statement, i = k, is executed one time.

• The end condition, i < n, is executed (n – k ) / m + 1 times.

• The update statement, i = i + m, is executed (n – k ) / m times.

• Each of statement1 and statement2 is executed (n – k ) / m times.

for i in range(k,n,m):

statement1

statement2

Page 11: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis : Loops

• In the following for-loop:

• The number of iterations is: (n – k) / m + 1

• The initialization statement, i = k, is executed one time.

• The end condition, i <(n+1), is executed (n – k) / m + 1 + 1 times.

• The update statement, i = i + m, is executed (n – k) / m + 1 times.

• Each of statement1 and statement2 is executed (n – k) / m + 1 times.

for i in range(k,n+1,m):

statement1

statement2

Page 12: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis: Loop Example

• Find the exact number of basic operations in the following program fragment:

• There are 3 assignments outside the loop => 3 operations.

• The for loop actually comprises

• an assignment (i = 0) => 1 operation

• a test (i < n) => n + 1 operations

• an increment by 1 => n operations

• the loop body that has three assignments, two multiplications, and an addition => 6 n operations

Thus the total number of basic operations is 6 * n + n + (n + 1) +1+ 3 = 8n + 5

x, y = 2.5, 3.0

a=[]

for i in range(0,n,1):

a.append(x * y)

x = 2.5 * x

y = y + a[i]

Page 13: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis: Examples

• Suppose n is a multiple of 2. Determine the number of basic operations performed by of the method myMethod():

• Solution: The number of iterations of the loop:i=1while i<n:

sum = sum + i + helper(i)i*=2

is log2n (A Proof will be given later)Hence the number of basic operations is:1 + 1 + (1 + log2n) + log2n[2 + 4 + 1 + 1 + (n + 1) + n[2 + 2] + 1] + 1= 3 + log2n + log2n[10 + 5n] + 1= 5 n log2n + 11 log2n + 4

def myMethod(n):

sum = 0

i=1

while i<n:

sum = sum + i + helper(i)

i*=2

return sum

def helper(n):

sum = 0

for i in range(1,n+1,1):

sum = sum + i

return sum

Page 14: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Simple Complexity Analysis: Loops With Logarithmic Iterations

In the following while loop: (with <)

◦ The number of iterations is: (Logm (n / k) )

In the following while loop: (with <=)

◦ The number of iterations is: (Logm (n / k) + 1)

i=k

while(i<n):

statement1

statement2

i*=m

i=k

while(i<=n):

statement1

statement2

i*=m

Page 15: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Complexity Analysis (Part II)

• Asymptotic Complexity

• Big-O (asymptotic) Notation

• Big-O Computation Rules

• Proving Big-O Complexity

• How to determine complexity of code structures

154.

Page 16: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Asymptotic Complexity

• Finding the exact complexity, f(n) = number of basic operations, of an algorithm is difficult.

• We approximate f(n) by a function g(n) in a way that does not substantially change the magnitude of f(n). --the function g(n)is sufficiently close to f(n) for large values of the input size n.

• This "approximate" measure of efficiency is called asymptotic complexity.

• Thus the asymptotic complexity measure does not give the exact number of operations of an algorithm, but it shows how that number grows with the size of the input.

• This gives us a measure that will work for different operating systems, compilers and CPUs.

164.

Page 17: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Big-O (asymptotic) Notation A big-O Analysis: is a technique for estimating the time and space

requirements of an algorithm in terms of order of magnitude.

The most commonly used notation for specifying asymptotic complexity is the big-O notation.

The Big-O notation, O(g(n)), is used to give an upper bound (worst-case) on a positive runtime function f(n) where n is the input size.

Definition of Big-O: Consider a function f(n) that is non-negative n 0. We say that “f(n) is

Big-O of g(n)” i.e., f(n) = O(g(n)), if n0 0 and a constant c > 0 such that f(n) cg(n), n n0

174.

Page 18: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Big-O (asymptotic) Notation

Implication of the definition:

• For all sufficiently large n, c *g(n) is an upper bound of f(n)

Note: By the definition of Big-O:

f(n) = 3n + 4 is O(n)

it is also O(n2),

it is also O(n3),

. . .

it is also O(nn)

• However when Big-O notation is used, the function g in the relationship f(n) is O(g(n)) is CHOOSEN TO BE AS SMALL AS POSSIBLE. • We call such a function g a tight asymptotic bound of f(n)

184.

Page 19: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Big-O (asymptotic) NotationSome Big-O complexity classes in order of magnitude from smallest to highest:

O(1) Constant

O(log(n)) Logarithmic

O(n) Linear

O(n log(n)) n log n

O(nx) {e.g., O(n2), O(n3), etc} Polynomial

O(an) {e.g., O(1.6n), O(2n), etc} Exponential

O(n!) Factorial

O(nn)

194.

Page 20: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Examples of Algorithms and their big-O complexity

Big-O Notation Examples of Algorithms

O(1) Push, Pop, Enqueue (if there is a tail reference),

Dequeue, Accessing an array element

O(log(n)) Binary search

O(n) Linear search

O(n log(n)) Heap sort, Quick sort (average), Merge sort

O(n2) Selection sort, Insertion sort, Bubble sort

O(n3) Matrix multiplication

O(2n) Towers of Hanoi

204.

Page 21: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Warnings about O-Notation • Big-O notation cannot compare algorithms in the same complexity

class.

• Big-O notation only gives sensible comparisons of algorithms in different complexity classes when n is large .

• Consider two algorithms for same task: Linear: f(n) = 1000 nQuadratic: f'(n) = n2/1000

The quadratic one is faster for n < 1000000.

214.

Page 22: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Rules for using big-O

• For large values of input n , the constants and terms with lower degree of n are ignored.

1.Multiplicative Constants Rule: Ignoring constant factors. O(c f(n)) = O(f(n)), where c is a constant; Example:

O(20 n3) = O(n3)

2. Addition Rule: Ignoring smaller terms.If O(f(n)) < O(h(n)) then O(f(n) + h(n)) = O(h(n)).Example:

O(n2 log n + n3) = O(n3)O(2000 n3 + 2n ! + n800 + 10n + 27n log n + 5) = O(n !)

3. Multiplication Rule: O(f(n) * h(n)) = O(f(n)) * O(h(n))Example:

O((n3 + 2n 2 + 3n log n + 7)(8n 2 + 5n + 2)) = O(n 5)

224.

Page 23: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Proving Big-O Complexity

To prove that f(n) is O(g(n)) we find any pair of values n0 and c that satisfy:

f(n) ≤ c * g(n) for n n0

Note: The pair (n0, c) is not unique. If such a pair exists then there is an infinite number of such pairs.

Example: Prove that f(n) = 3n2 + 5 is O(n2)

We try to find some values of n and c by solving the following inequality:

3n2 + 5 cn2 OR 3 + 5/n2 c

(By putting different values for n, we get corresponding values for c)

n0 1 2 3 4

c 8 4.25 3.55 3.3125 3

234.

Page 24: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

Proving Big-O Complexity

Example:

Prove that f(n) = 3n2 + 4n log n + 10 is O(n2) by finding appropriate values for c and n0

We try to find some values of n and c by solving the following inequality

3n2 + 4n log n + 10 cn2

OR 3 + 4 log n / n+ 10/n2 c

( We used Log of base 2, but another base can be used as well)

n0 1 2 3 4

c 13 7.5 6.22 5.62 3

244.

Page 25: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

Loops: for, while, and do-while:

Complexity is determined by the number of iterations in the loop times the complexity of the body of the loop.

Examples:

254.

O(n)

O(n2)

O(log n)

sum=m

for i in range(0,n,1):

sum = sum - i

sum=m

for i in range(0,n*n,1):

sum = sum + i

i=1;

while i < n:

sum = sum + i

i*=2

Page 26: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

Nested Loops: Complexity of inner loop * complexity of outer loop.

Examples:

264.

O(n2)

O(n log n)

sum = 0

for i in range(0,n,1):

for j in range (0,n,1):

sum += i * j

i = 1

while(i <= n):

j = 1

while(j <= n):

statements of constant complexity

j*=2

i+=1

Page 27: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

Sequence of statements: Use Addition rule

O(s1; s2; s3; … sk) = O(s1) + O(s2) + O(s3) + … + O(sk)

= O(max(s1, s2, s3, . . . , sk))

Example:

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

274.

for j in range(0,n*n,1):

sum +=j

for k in range(0,n,1):

sum-=1

print('sum is now',sum)

Page 28: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

if-elif: Take the complexity of the most expensive case

284.

o(n)

o(n2)

Overall Complexity: O(n2)

n=int(input('Enter a positive integer:'))

X=[]

Y=[]

key=input('Enter a or b:')

sum=0

for i in range(n):

X.append(i)

for i in range(n):

Y.append(X)

if key=='a':

for i in range(len(X)):

sum += X[i]

elif key=='b':

for i in range(len(Y)):

for j in range(len(Y[0])):

sum += Y[i][j]

print(sum)

Page 29: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

if-elif-else Statement: Take the complexity of the most expensive case :

294.

O(n2)

O(n3)

O(1)

Overall

complexity

O(n3)

key=input('Enter x or +:')

n=int(input('Enter a positive integer:'))

A=[]

B=[]

C=[]

row=[]

for i in range(n):

row.append(0)

for i in range(n):

A.append(row)

B.append(row)

C.append(row)

#Some manipulation on values of Matrix A and B

if key == '+':

for i in range(n):

for j in range(n):

C[i][j] = A[i][j] + B[i][j]

elif key == 'x':

C = matrixMult(A, B)

else:

print("Error! Enter '+' or 'x'!")

Page 30: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

• Sometimes if-else statements must carefully be checked:

O(if-else) = O(Condition)+ Max[O(if), O(else)]

304.

O(1)

O(1)

O(if-else) = O(Condition) = O(n)

O(n)

n=int(input("Enter the length of the array:"))

integers = []

for i in range(n):

integers.append(i)

if hasPrimes(integers) == true:

integers[0] = 20

else:

integers[0] = -20

def hasPrimes(inparr):

for i in range(len(inparr)):

..........

..........

Page 31: BİM213 Data Structures And Algorithmsendustri.eskisehir.edu.tr/mfidan/BİM213/icerik/bim213_week1_2019.… · Definitions •Data Structure: is the way in which the data of the program

How to determine complexity of code structures

• Note: Sometimes a loop may cause the if-else rule not to be applicable. Consider the following loop:

The else-branch has more basic operations; therefore one may conclude that the loop is O(n). However the if-branch dominates. For example if n is 60, then the sequence of n is: 60, 30, 15, 14, 7, 6, 3, 2, 1, and 0. Hence the loop is logarithmic and its complexity is O(log n)

314.

n=int(input("Enter an integer:"))

while n > 0:

if (n % 2) == 0:

print(n)

n /= 2

else:

print(n)

print(n)

n -=1