Algorithm Analysis and Design

Similar documents
PROGRAM EFFICIENCY & COMPLEXITY ANALYSIS

CS 6402 DESIGN AND ANALYSIS OF ALGORITHMS QUESTION BANK

Algorithm Analysis. CENG 707 Data Structures and Algorithms

Choice of C++ as Language

Advanced Algorithms and Data Structures

Scientific Computing. Algorithm Analysis

Plotting run-time graphically. Plotting run-time graphically. CS241 Algorithmics - week 1 review. Prefix Averages - Algorithm #1

Data Structures and Algorithms

Computational biology course IST 2015/2016

Algorithmic Analysis. Go go Big O(h)!

Analysis of Algorithms - Introduction -

Using Templates to Introduce Time Efficiency Analysis in an Algorithms Course

CS/ENGRD 2110 Object-Oriented Programming and Data Structures Spring 2012 Thorsten Joachims. Lecture 10: Asymptotic Complexity and

CS171:Introduction to Computer Science II. Algorithm Analysis. Li Xiong

9/10/2018 Algorithms & Data Structures Analysis of Algorithms. Siyuan Jiang, Sept

UNIT 1 ANALYSIS OF ALGORITHMS

Run Times. Efficiency Issues. Run Times cont d. More on O( ) notation

Analysis of Algorithms Part I: Analyzing a pseudo-code

You should know the first sum above. The rest will be given if you ever need them. However, you should remember that,, and.

Algorithm Analysis. College of Computing & Information Technology King Abdulaziz University. CPCS-204 Data Structures I

Organisation. Assessment

MUHAMMAD FAISAL MIT 4 th Semester Al-Barq Campus (VGJW01) Gujranwala

CSE 143. Complexity Analysis. Program Efficiency. Constant Time Statements. Big Oh notation. Analyzing Loops. Constant Time Statements (2) CSE 143 1

CS583 Lecture 01. Jana Kosecka. some materials here are based on Profs. E. Demaine, D. Luebke A.Shehu, J-M. Lien and Prof. Wang s past lecture notes

Chapter 2: Complexity Analysis

Analysis of Algorithms. Unit 4 - Analysis of well known Algorithms

Sorting & Growth of Functions

Module 1: Asymptotic Time Complexity and Intro to Abstract Data Types

[ 11.2, 11.3, 11.4] Analysis of Algorithms. Complexity of Algorithms. 400 lecture note # Overview

Algorithm Analysis. Spring Semester 2007 Programming and Data Structure 1

Anany Levitin 3RD EDITION. Arup Kumar Bhattacharjee. mmmmm Analysis of Algorithms. Soumen Mukherjee. Introduction to TllG DCSISFI &

COT 5407: Introduction to Algorithms. Giri Narasimhan. ECS 254A; Phone: x3748

Algorithms. Algorithms 1.4 ANALYSIS OF ALGORITHMS

Analysis of Algorithm. Chapter 2

Data Structures and Algorithms. Part 2

Algorithms and Programming

Introduction to Computers & Programming

Algorithmics. Some information. Programming details: Ruby desuka?

Algorithm. Algorithm Analysis. Algorithm. Algorithm. Analyzing Sorting Algorithms (Insertion Sort) Analyzing Algorithms 8/31/2017

Sorting. There exist sorting algorithms which have shown to be more efficient in practice.

DATA STRUCTURES AND ALGORITHMS

Advanced Algorithms and Data Structures

Introduction to Analysis of Algorithms

EE 368. Week 6 (Notes)

Pseudo code of algorithms are to be read by.

Divide and Conquer Algorithms

Algorithm Analysis. (Algorithm Analysis ) Data Structures and Programming Spring / 48

CSE 373 APRIL 3 RD ALGORITHM ANALYSIS

Algorithms and Data Structures, or

DESIGN AND ANALYSIS OF ALGORITHMS

The Running Time of Programs

Algorithm efficiency can be measured in terms of: Time Space Other resources such as processors, network packets, etc.

6/12/2013. Introduction to Algorithms (2 nd edition) Overview. The Sorting Problem. Chapter 2: Getting Started. by Cormen, Leiserson, Rivest & Stein

Assignment 1 (concept): Solutions

Introduction to the Analysis of Algorithms. Algorithm

Measuring algorithm efficiency

Outline and Reading. Analysis of Algorithms 1

Lesson 12: Recursion, Complexity, Searching and Sorting. Modifications By Mr. Dave Clausen Updated for Java 1_5

Algorithms and Data Structures

4.1 Real-world Measurement Versus Mathematical Models

Lecture Notes for Chapter 2: Getting Started

Computer Science Approach to problem solving

Lecture 1. Introduction / Insertion Sort / Merge Sort

(Refer Slide Time: 1:27)

Analysis of Algorithms

How do we compare algorithms meaningfully? (i.e.) the same algorithm will 1) run at different speeds 2) require different amounts of space

Ph.D. Comprehensive Examination Design and Analysis of Algorithms

CLASS: II YEAR / IV SEMESTER CSE CS 6402-DESIGN AND ANALYSIS OF ALGORITHM UNIT I INTRODUCTION

Lecture 2: Algorithm Analysis

The divide and conquer strategy has three basic parts. For a given problem of size n,

O(n): printing a list of n items to the screen, looking at each item once.

Algorithm Efficiency & Sorting. Algorithm efficiency Big-O notation Searching algorithms Sorting algorithms

Unit 1 Chapter 4 ITERATIVE ALGORITHM DESIGN ISSUES

CSE373: Data Structure & Algorithms Lecture 21: More Comparison Sorting. Aaron Bauer Winter 2014

SEARCHING, SORTING, AND ASYMPTOTIC COMPLEXITY

Data Structures and Algorithms Chapter 2

Asymptotic Analysis of Algorithms

Computer Science 210 Data Structures Siena College Fall Topic Notes: Complexity and Asymptotic Analysis

COE428 Lecture Notes Week 1 (Week of January 9, 2017)

Data Structures Lecture 3 Order Notation and Recursion

SEARCHING, SORTING, AND ASYMPTOTIC COMPLEXITY. Lecture 11 CS2110 Spring 2016

Algorithms and Data Structures

Analysis of Algorithms. CS 1037a Topic 13

CS2 Algorithms and Data Structures Note 1

INTRODUCTION. Analysis: Determination of time and space requirements of the algorithm

CSCE 321/3201 Analysis and Design of Algorithms. Prof. Amr Goneid. Fall 2016

Design and Analysis of Computer Algorithm Lecture 1. Assoc. Prof.Pradondet Nilagupta Department of Computer Engineering

L.J. Institute of Engineering & Technology Semester: VIII (2016)

CSCI 104 Runtime Complexity. Mark Redekopp David Kempe Sandra Batista

Analysis of Algorithms

Introduction to Algorithms

ENGI 4892: Data Structures Assignment 2 SOLUTIONS

DESIGN AND ANALYSIS OF ALGORITHMS. Unit 1 Chapter 4 ITERATIVE ALGORITHM DESIGN ISSUES

CSE373: Data Structures and Algorithms Lecture 4: Asymptotic Analysis. Aaron Bauer Winter 2014

For searching and sorting algorithms, this is particularly dependent on the number of data elements.

Chapter 6 INTRODUCTION TO DATA STRUCTURES AND ALGORITHMS

Chapter 4. Divide-and-Conquer. Copyright 2007 Pearson Addison-Wesley. All rights reserved.

DESIGN AND ANALYSIS OF ALGORITHMS

Greedy Algorithms 1 {K(S) K(S) C} For large values of d, brute force search is not feasible because there are 2 d {1,..., d}.

LECTURE NOTES OF ALGORITHMS: DESIGN TECHNIQUES AND ANALYSIS

Transcription:

Algorithm Analysis and Design Dr. Truong Tuan Anh Faculty of Computer Science and Engineering Ho Chi Minh City University of Technology VNU- Ho Chi Minh City 1

References [1] Cormen, T. H., Leiserson, C. E, and Rivest, R. L., Introduction to Algorithms, The MIT Press, 2009. [2] Levitin, A., Introduction to the Design and Analysis of Algorithms, 3 rd Edition, Pearson, 2012. [3] Sedgewick, R., Algorithms in C++, Addison- Wesley, 1998. [4] Weiss, M.A., Data Structures and Algorithm Analysis in C, TheBenjamin/Cummings Publishing, 1993. 2

Course Outline 1. Basic concepts on algorithm analysis and design 2. Divide-and-conquer 3. Decrease-and-conquer 4. Transform-and-conquer 5. Dynamic programming and greedy algorithm 6. Backtracking algorithms 7. NP-completeness 8. Approximation algorithms 3

Course outcomes 1. Able to analyze the complexity of the algorithms (recursive or iterative) and estimate the efficiency of the algorithms. 2. Improve the ability to design algorithms in different areas. 3. Able to discuss on NP-completeness 4

Contacts Class Email: anhtt@hcmut.edu.vn Slides: Sakai Website: www4.hcmut.edu.vn/~anhtt/ 5

Outline 1. Recursion and recurrence relations 2. Analysis of algorithms 3. Analysis of iterative algorithms 4. Analysis of recursive algorithms 5. Algorithm design strategies 6. Brute-force algorithm design 6

1. Recursion Recurrence relation Example 1: Factorial function N! = N.(N-1)! if N 1 0! = 1 The definition for a recursive function which contains some integer parameters is called a recurrence relation. function factorial (N: integer): integer; begin if N = 0 then factorial: = 1 else factorial: = N*factorial (N-1); end; 7

Recurrence relation Example 2: Fibonacci number Recurrence relation: F N = F N-1 + F N-2 for N 2 F 0 = F 1 = 1 1, 1, 2, 3, 5, 8, 13, 21, function fibonacci (N: integer): integer; begin if N <= 1 then fibonacci: = 1 else fibonacci: = fibonacci(n-1) + fibonacci(n-2); end; 8

Fibonacci numbers Recursive tree computed There exist several redundant computations when using recursive function to compute Fibonacci numbers. 9

By contrast, it is very easy to compute Fibonacci numbers by using an array in a non-recursive algorithm. procedure fibonacci; const max = 25; var i: integer; F: array [0..max] of integer; begin F[0]: = 1; F[1]: = 1; for i: = 2 to max do F[i]: = F[i-1] + F[i-2] end; A non-recursive (iterative) algorithm often works more efficiently than a recursive algorithm. It is easier to debug an iterative algorithm than a recursive algorithm. By using stack, we can convert a recursive algorithm to an equivalent iterative algorithm. 10

2. Analysis of algorithms For most problems, many different algorithms are available. How one to choose the best algorithm? How to compare the algorithms which can solve the same problem? Analysis of an algorithm: estimate the resources used by that algorithm. Resources: Memory space Computational time Computational time is the most important resource. 11

Two ways of analysis The computational time of an algorithm is a function of N, the amount of data to be processed. We are interested in: The average case: the amount of time an algorithm might be expected to take on typical input data. The worst case: the amount of time an algorithm would take on the worst possible input data. 12

Framework of complexity analysis Step 1: Characterize the data which is to be used as input to the algorithm and to decide what type of analysis is appropriate. Normally, we concentrate on - proving that the running time is always less than some upper bound, or - trying to derive the average running time for a random input. Step 2: identify abstract operation upon which the algorithm is based. Example: comparison is the abstract operation in sorting algorithm. The number of abstract operations depends on a few quantities. Step 3: Proceed to the mathematical analysis to find averageand worst-case values for each of the fundamental quantities. 13

The two cases of analysis It is not difficult to find an upper bound on the running time of an algorithm. But the average case normally requires a sophisticated mathematical analysis. In principle, the performance of an algorithm often can be analyzed to an extremely precise level of detail. But we are always interested in estimating in order to suppress detail. In short, we look for rough estimates for the running time of our algorithm for purposes of classification of complexity. 14

Classification of Algorithm complexity Most algorithms have a primary parameter, N, the number of data items to be processed. Examples: Size of the array to be sorted or searched. The number of nodes in a graph. All of the algorithms have running time proportional to the following functions 1. If the basic operation in the algorithm is executed once or a few times. its running time is constant. 2. lgn (logarithmic) log 2 N lgn The algorithm gets slightly slower as N grows. 15

3. N (linear) 4. NlgN 5. N 2 (quadratic) in a double nested loop 6. N 3 (cubic) in a triple nested loop 7. 2 N Few algorithms with exponential running time. Some of algorithms may have running time proportional to N 3/2, N 1/2, (lgn) 2 16

17

Computational Complexity Now, we focus on studying the worst-case performance. We ignore constant factors in order to determine the functional dependence of the running time on the number of inputs. Example: One can say that the running time of mergesort is proportional to NlgN. The first step is to make the notion of proportional to mathematically precise. The mathematical artifact for making this notion precise is called the O-notation. 18

Definition: A function f(n) is said to be O(g(n)) if there exists constants c and n 0 such that f(n) is less than cg(n) for all n > n 0. 19

O Notation The O notation is a useful way to state upper bounds on running time which are independent of both inputs and implementation details. We try to provide both an upper bound and lower bound on the worst-case running time. Providing lower-bound is a difficult matter. 20

Average-case analysis For this kind of analysis, we have to - characterize the inputs to the algorithm - calculate the average number of times each instruction is executed, - calculate the average running time of the algorithm. But - Average-case analysis requires detailed mathematical arguments. - It s difficult to characterize the input data encountered in practice. 21

Approximate and Asymptotic results Often, the results of a mathematical analysis are not exact but are approximate: the result might be an expression consisting of a sequence of decreasing terms. We are most concerned with the leading term of a mathematical expression. Example: The average running time of the algorithm is: a 0 NlgN + a 1 N + a 2 But we can rewrite as: a 0 NlgN + O(N) For large N, we may not need to find the values of a 1 or a 2. 22

Approximate and Asymptotic results (cont.) The O notation provides us with a way to get an approximate answer for large N. Therefore, we can ignore some quantities represented by the O-notation when there is a well-specified leading (larger) term in the expression. Example: If the expression is N(N-1)/2, we can refer to it as about N 2 /2. 23

3. Analysis of an iterative algorithm Example 1 Given the algorithm that finds the largest element in an array. procedure MAX(A, n, max) /* Set max to the maximum of A(1:n) */ begin integer i, n; max := A[1]; for i:= 2 to n do if A[i] > max then max := A[i] end Let denote C(n) the complexity of the algorithm when comparison (A[i]> max) is considered as basic operation. Let determine C(n) in the worst-case analysis. 24

Analysis of an iterative algorithm (cont.) If the basic operation of the MAX procedure is comparison. The number of times the comparison is executed is also the number of the body of the loop is executed: (n-1). So, the computational complexity of the algorithm is O(n). This also the complexity of the two cases: worst-case and average-case. Note: If the basic operation is assignment (max := A[i])? then O(n) is the complexity of the worst-case. 25

Analysis of an iterative algorithm (cont.) Example: Given the algorithm that checks whether all the elements in the array of n element is distinct. function UniqueElements(A, n) begin for i:= 1 to n 1 do for j:= i + 1 to n do if A[i] = A[j] return false return true end The worst-cases? the array with no equal elements or the array in which the two last elements are the only pair of equal elements. For such inputs, one comparison is made for each repetition of the innermost loop. 26

i = 1 i = 2 j runs from 2 to n n 1 comparisons j runs from 3 to n n 2 comparisons.. i = n -2 j runs from n-1 to n 2 comparisons i = n -1 j runs from n to n 1 comparison So, the total number of comparisons is: 1 + 2 + 3 + + (n-2) + (n-1) = n(n-1)/2 The complexity of the algorithm in the worst-case is O(n 2 ). 27

Analysis of an iterative algorithm (cont.) Example 3 (String matching): Finding all occurrences of a pattern in a text. The text is an array T[1..n] of length n and the pattern is an array P[1..m] of length m. We say that pattern P occurs with the shift s in text T (that is, P occurs beginning at position s+1 in text T) if 1 s n m and T[s+1..s+m] = P[1..m]. 28

The naïve algorithm finds all valid shifts using a loop that checks the condition P[1..m] = T[s+1..s+m] for each of the n m + 1 possible values of s. procedure NAIVE-STRING-MATCHING(T,P); Begin n: = T ; m: = P ; for s:= 0 to n m do if P[1..m] = T[s+1,..,s+m] then print Pattern occurs with shift s; end 29

procedure NAIVE-STRING-MATCHING(T,P); begin n: = T ; m: = P ; for s:= 0 to n m do begin exit:= false; k:=1; while k m and not exit do if P[k] T[s+k] then exit := true else k:= k+1; if not exit then print Pattern occurs with shift s; end end 30

Procedure NAIVE STRING MATCHING has two nested loops: - outer loop repeats n m + 1 times. - inner loop repeats at most m times. Therefore, the complexity of the algorithm in the worst-case is: O((n m + 1)m). 31

4. Analysis of recursive algorithms: Recurrence relations There is a basic method to analyze recursive algorithms. The nature of a recursive algorithm dictates that its running time for input of size N will depend on its running time for smaller inputs. This translates to a mathematical formula called a recurrence relation. To derive the computational complexity of a recursive algorithm, we solve its recurrence relation by using the substitution method. 32

Analysis of recursive algorithm by substitution method Formula 1: Given a recursive program that loops through the input to eliminate one item. Its recurrence relation is as follows: C N = C N-1 + N N 2 We can derive its complexity using the substitution method: C 1 = 1 C N = C N-1 + N = C N-2 + (N 1) + N = C N-3 + (N 2) + (N 1) + N... = C 1 + 2 + + (N 2) + (N 1) + N = 1 + 2 + + (N 1) + N =N(N+1)/2 = N 2 /2 33

Example 2 Formula 2: Given a recursive program that halves the input in one step. Its recurrence relation is as follows: C N = C N/2 + 1 N 2 C 1 = 1 We can derive its complexity using the substitution method. Assume that N = 2 n C(2 n ) = C(2 n-1 ) + 1 = C(2 n-2 )+ 1 + 1 = C(2 n-3 )+ 3... = C(2 0 ) + n = C 1 + n = n +1 C N = n +1 = lgn +1 C N lgn 34

Example 3 Formula 3. Given a recursive program that has to make a linear pass through the input, after it is split into two halves. Its recurrence relation is as follows: C N = 2C N/2 + N for N 2 C 1 = 0 We can derive its complexity using the substitution method. Assume N = 2 n C(2 n ) = 2C(2 n-1 ) + 2 n C(2 n )/2 n = C(2 n-1 )/ 2 n-1 + 1 = C(2 n-2 )/ 2 n-2 + 1 +1.. = n C(2 n ) = n.2 n C N = NlgN C N NlgN 35

Example 4 Formula 4. Given a recursive program that halves the input into two halves with one step. Its recurrence relation is as follows: C(N) = 2C(N/2) + 1 for N 2 C(1) = 0 Complexity analysis: Assume N = 2 n. C(2 n ) = 2C(2 n-1 ) + 1 C(2 n )/ 2 n = 2C(2 n-1 )/ 2 n + 1/2 n = C(2 n-1 )/ 2 n-1 + 1/2 n = [C(2 n-2 )/ 2 n-2 + 1/2 n-1 ]+ 1/2 n... = C(2 n-i )/ 2 n -i + 1/2 n i +1 + + 1/2 n 36

At last, when i = n -1, we obtain: C(2 n )/2 n = C(2)/2 + ¼ + 1/8 + + 1/2 n = ½+ ¼+.+1/2 n C(2 n ) = 1 + 2 + 2 2 + + 2 n-1 = 2 n -1 C(N) N Some recurrence relations that seem similar may bring out different classes of complexity. 37

Steps of average-case analysis For average-case analysis of an algorithm A, we have to do the following steps: 1. Determine the sampling space which represents the possible cases of input data (of size n). Assume that the sampling space is S = { I 1, I 2,, I k } 2. Determine a probability distribution p in S which represents the likelihood that each case of the input data may occur. 3. Calculate the total number of basic operations that the algorithm A executes to deal with a case of input data in the sample space. Let v(i k ) denote the total number of basic operations executed by the algorithm A when input data belong to the case I k. 38

Average-case analysis (cont.) 4. Calculate the average of the total number of basic operations by using the following formula: C avg (n) = v(i 1 ).p(i 1 ) + v(i 2 ).p(i 2 ) + +v(i k ).p(i k ). Example: Given an array A with n element, let find the location where the given value X occurs in array A. begin i := 1; while i <= n and X <> A[i] do i := i+1; end 39

Example: Sequential Search In the case that X is available in the array, assume that the probability of the first match occurring in the i-th position of the array is the same for every i and that probability is p = 1/n. The number of comparisons to find X at the 1-th position is 1 The number of comparisons to find X at the 2 nd position is 2 The number of comparisons to find X at the n-th position is n Therefore, the total number of comparisons in the average is: C(n) = 1.(1/n) + 2.(1/n) + + n.(1/n) = (1 + 2 + + n).(1/n) = (1+2+ +n)/n = (n(n+1)/2).(1/n) = (n+1)/2. 40

Some useful formulas for the analysis of algorithms There exists some useful summation formulas for the analysis of algorithms. Arithmetic series S 1 = 1 + 2 + 3 + + n S 1 = n(n+1)/2 n 2 /2 S 2 = 1 + 2 2 + 3 2 + + n 2 S 2 = n(n+1)(2n+1)/6 n 3 /3 Geometric series S = 1 + a + a 2 + a 3 + + a n S = (a n+1-1)/(a-1) If 0< a < 1, then S 1/(1-a) when n, S approaches 1/(1-a). 41

Some useful formulas (cont.) Harmonic sum H n = 1 + ½ + 1/3 + ¼ + +1/n H n = log e n + γ γ 0.577215665 called Euler constant. Another sequence that is very useful when analysing the operations on a binary tree: 1 + 2 + 4 + + 2 m-1 = 2 m -1 42

5. Algorithm Design Strategy An Algorithm Design Strategy is a general approach to solve problems algorithmically that is applicable to a variety of problems from different areas of computing Learning these strategies is very important for the following reasons: They provide guidance for designing algorithms for new problems. Algorithms are the cornerstone of computer science. Algorithm design strategies make it possible to classify and study algorithms. 43

Algorithm Design Strategy (cont.) Divide-and-conquer is a typical example of an algorithm design strategy. There exists many other well-known algorithm design strategies. The set of algorithm design strategies constitute a collection of tools which help us in our studies and building new algorithms. The algorithm design strategy that will be studied right now is the brute-force strategy. 44

The brute-force approach Brute-force is a straightforward approach to solve a problem, usually directly based on the problem statement and definitions of the concepts involved. Just do it would be another way to describe the prescription of the brute-force approach. The brute-force strategy is the one that is easiest to understand and easiest to implement. Sequential search is an example of brute-force strategy. Selection sort, NAÏVE-STRING-MATCHER are some other examples of brute-force strategy. 45

Even though brute-force is not a source of clever or efficient algorithms, it should not be overlooked due to the following reasons: Brute-force is applicable to a very wide variety of problems. For some important problems, the brute-force approach yields reasonable algorithms of some practical values. Clever and efficient algorithms are often more difficult to understand and more difficult to implement than brute-force algorithms. Brute-force algorithms can be used as a yardstick with which to judge more efficient algorithms for solving a problem. 46