0% found this document useful (0 votes)
89 views24 pages

Daa Unit 1

This document discusses algorithms and their design. It begins by defining an algorithm as a sequence of unambiguous instructions to solve a problem in a finite amount of time. It then covers: 1) The characteristics and steps for writing algorithms 2) Using pseudocode to specify Euclid's algorithm for finding the greatest common divisor (GCD) of two numbers 3) The process of designing algorithms, including understanding the problem, choosing a computational model, and selecting an algorithm design technique.

Uploaded by

Rajinithanu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
89 views24 pages

Daa Unit 1

This document discusses algorithms and their design. It begins by defining an algorithm as a sequence of unambiguous instructions to solve a problem in a finite amount of time. It then covers: 1) The characteristics and steps for writing algorithms 2) Using pseudocode to specify Euclid's algorithm for finding the greatest common divisor (GCD) of two numbers 3) The process of designing algorithms, including understanding the problem, choosing a computational model, and selecting an algorithm design technique.

Uploaded by

Rajinithanu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 24

1151CS119-Design and Analysis of Algorithm

UNIT I INTRODUCTION

1.1 NOTION OF AN ALGORITHM


An algorithm is a sequence of unambiguous instructions for solving a
problem, i.e., for obtaining a required output for any legitimate input in a finite
amount of time.

Problem to be solved

Algorithm

Input Computer Program Output

FIGURE 1.1 The notion of the algorithm.


It is a step by step procedure with the input to solve the problem in a finite
amount of time to obtain the required output.
The notion of the algorithm illustrates some important points:
 The non-ambiguity requirement for each step of an algorithm cannot be
compromised.
 The range of inputs for which an algorithm works has to be specified carefully.
 The same algorithm can be represented in several different ways.
 There may exist several algorithms for solving the same problem.
 Algorithms for the same problem can be based on very different ideas and
can solve the problem with dramatically different speeds.
Characteristics of an algorithm:
Input : Zero / more quantities are externally supplied.
Output : At least one quantity is produced.
Definiteness : Each instruction is clear and unambiguous.
Finiteness : If the instructions of an algorithm is traced then for all cases the

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 1
1151CS119-Design and Analysis of Algorithm
Algorithm must terminate after a finite number of steps.
Efficiency : Every instruction must be very basic and runs in short time.

Steps for writing an algorithm:


1. An algorithm is a procedure. It has two parts; the first part is head and the
second part is
body.
2. The Head section consists of keyword Algorithm and Name of the algorithm
with
parameter list. E.g. Algorithm name1(p1, p2,…,p3)
The head section also has the following:
//Problem Description:
//Input:
//Output:
3. In the body of an algorithm various programming constructs like if, for,
while and some statements like assignments are used.
4. The compound statements may be enclosed with { and } brackets. if, for,
while can be closed by endif, endfor, endwhile respectively. Proper
indention is must for block.
5. Comments are written using // at the beginning.
6. The identifier should begin by a letter and not by digit. It contains alpha
numeric letters after first letter. No need to mention data types.
7. The left arrow “←” used as assignment operator. E.g. v←10
8. Boolean operators (TRUE, FALSE), Logical operators (AND, OR, NOT) and
Relational
operators (<,<=, >, >=,=, ≠, <>) are also used.
9. Input and Output can be done using read and write.
10. Array[], if then else condition, branch and loop can be also used in algorithm.
Example:
The greatest common divisor(GCD) of two nonnegative integers m and n (not-
both-zero), denoted gcd(m, n), is defined as the largest integer that divides both m and n
evenly, i.e., with a remainder of zero.
Euclid’s algorithm is based on applying repeatedly the equality gcd(m, n) = gcd(n, m mod n),

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 2
1151CS119-Design and Analysis of Algorithm
where m mod n is the remainder of the division of m by n, until m mod n is equal to 0.
Since gcd(m,
0) = m, the last value of m is also the greatest common divisor of the
initial m and n. gcd(60, 24) can be computed as follows:gcd(60, 24)
= gcd(24, 12) = gcd(12, 0) = 12.

Euclid’s algorithm for computing gcd(m, n) in simple steps


Step 1 If n = 0, return the value of m as the answer and stop; otherwise, proceed to Step 2.
Step 2 Divide m by n and assign the value of the remainder to r.
Step 3 Assign the value of n to m and the value of r to n. Go to Step 1.

Euclid’s algorithm for computing gcd(m, n) expressed in pseudocode


ALGORITHM Euclid_gcd(m, n)
//Computes gcd(m, n) by Euclid’s algorithm
//Input: Two nonnegative, not-both-zero integers m and n
//Output: Greatest common divisor of m and n
while n ≠ 0 do
r ←m mod n m←n
n←r
return m

1.1 FUNDAMENTALS OF ALGORITHMIC PROBLEM SOLVING


A sequence of steps involved in designing and analyzing an algorithm is shown in
the figure below.

FIGURE 1.2 Algorithm design and analysis process.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 3
1151CS119-Design and Analysis of Algorithm

(i) Understanding the Problem


 This is the first step in designing of algorithm.
 Read the problem’s description carefully to understand the problem statement
completely.
 Ask questions for clarifying the doubts about the problem.
 Identify the problem types and use existing algorithm to find solution.
 Input (instance) to the problem and range of the input get fixed.
(ii) Decision making
The Decision making is done on the following:
(a) Ascertaining the Capabilities of the Computational Device
 In random-access machine (RAM), instructions are executed one after
another (The central assumption is that one operation at a time).
Accordingly, algorithms designed to be executed on such machines are
called sequential algorithms.
 In some newer computers, operations are executed concurrently, i.e., in
parallel. Algorithms that take advantage of this capability are called
parallel algorithms.
 Choice of computational devices like Processor and memory is mainly
based on space and time efficiency
(b) Choosing between Exact and Approximate Problem Solving
 The next principal decision is to choose between solving the problem
exactly or solving it approximately.
 An algorithm used to solve the problem exactly and produce correct result
is called an exact algorithm.
 If the problem is so complex and not able to get exact solution, then we
have to choose an algorithm called an approximation algorithm. i.e.,
produces an approximate answer. E.g., extracting square roots, solving nonlinear
equations, and evaluating definite integrals.
Algorithm Design Techniques
 An algorithm design technique (or “strategy” or “paradigm”) is a general
approach to solving problems algorithmically that is applicable to a variety
of problems from different areas of computing.

Algorithms+ Data Structures =

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 4
1151CS119-Design and Analysis of Algorithm

 Though Algorithms and Data Structures are independent, but they are
combined together to develop program. Hence the choice of proper data
structure is required before designing the algorithm.
 Implementation of algorithm is possible only with the help of Algorithms
and Data Structures
 Algorithmic strategy / technique / paradigm are a general approach by
which many problems can be solved algorithmically. E.g., Brute Force,
Divide and Conquer, Dynamic Programming, Greedy Technique and so on.
(iii) Methods of Specifying an Algorithm
There are three ways to specify an algorithm. They are:
a. Natural language
b. Pseudocode

Algorithm Specification

Natural Language Pseudocode Flowchart

FIGURE 1.3 Algorithm Specifications

Pseudocode and flowchart are the two options that are most widely used nowadays for
specifying algorithms.
a. Natural Language
It is very simple and easy to specify an algorithm using natural language. But many
times specification of algorithm by using natural language is not clear and thereby
we get brief specification.
Step 1: Read the first number, say a.
Step 2: Read the first number, say b.
Step 3: Add the above two numbers and store the result in c.
Step 4: Display the result from c.

Example: An algorithm to perform addition of two numbers.Such a specification creates


difficulty while actually implementing it. Hence many programmers prefer to have
specification of algorithm by means of Pseudocode.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 5
1151CS119-Design and Analysis of Algorithm

b. Pseudocode
 Pseudocode is a mixture of a natural language and programming language
constructs. Pseudocode is usually more precise than natural language.
 For Assignment operation left arrow “←”, for comments two slashes “//”
,if condition, for, while loops are used.

ALGORITHM Sum(a,b)
//Problem Description: This algorithm performs addition of two numbers
//Input: Two integers a and b
//Output: Addition of two integers
c←a+b
return c
This specification is more useful for implementation of any language.

c. Flowchart
In the earlier days of computing, the dominant method for specifying algorithms was a
flowchart, this representation technique has proved to be inconvenient.
Flowchart is a graphical representation of an algorithm. It is a a method of expressing an
algorithm by a collection of connected geometric shapes containing descriptions of the
algorithm’s steps.

FIGURE 1.4 Flowchart symbols and Example for two integer addition.
(iv) Proving an Algorithm’s Correctness

 Once an algorithm has been specified then its correctness must be proved.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 6
1151CS119-Design and Analysis of Algorithm

 An algorithm must yields a required result for every legitimate input in a


finite amount of time.
For example, the correctness of Euclid’s algorithm for computing the greatest common
divisor stems from the correctness of the equality gcd(m, n) = gcd(n, m mod n).
 A common technique for proving correctness is to use mathematical induction
because an
algorithm’s iterations provide a natural sequence of steps needed for such proofs.
 The notion of correctness for approximation algorithms is less
straightforward than it is for exact algorithms. The error produced by the
algorithm should not exceed a predefined limit.

(v) Analyzing an Algorithm


 For an algorithm the most important is efficiency. In fact, there are two
kinds of algorithm efficiency. They are:
 Time efficiency, indicating how fast the algorithm runs, and
 Space efficiency, indicating how much extra memory it uses.
 The efficiency of an algorithm is determined by measuring both time
efficiency and space efficiency.
 So factors to analyze an algorithm are:
 Time efficiency of an algorithm
 Space efficiency of an algorithm
 Simplicity of an algorithm
 Generality of an algorithm

(vi) Coding an Algorithm


 The coding / implementation of an algorithm is done by a suitable programming
language like C, C++, JAVA.
 The transition from an algorithm to a program can be done either incorrectly or
very inefficiently. Implementing an algorithm correctly is necessary. The
Algorithm power should not reduced by inefficient implementation.
 Standard tricks like computing a loop’s invariant (an expression that does not
change its value) outside the loop, collecting common subexpressions, replacing
expensive operations by cheap ones, selection of programming language and so

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 7
1151CS119-Design and Analysis of Algorithm
on should be known to the programmer.
 Typically, such improvements can speed up a program only by a constant factor,
whereas a better algorithm can make a difference in running time by orders of
magnitude. But once an algorithm is selected, a 10–50% speedup may be worth
an effort.
 It is very essential to write an optimized code (efficient code) to reduce the
burden of compiler.

1.2 IMPORTANT PROBLEM TYPES


The most important problem types are:
 Sorting
 Searching
 String processing
 Graph problems
 Combinatorial problems
 Geometric problems
 Numerical problems

(i) Sorting
 The sorting problem is to rearrange the items of a given list in nondecreasing
(ascending) order.
 Sorting can be done on numbers, characters, strings or records.
 To sort student records in alphabetical order of names or by student number or by
student grade-point average. Such a specially chosen piece of information is called
a key.
 An algorithm is said to be in-place if it does not require extra memory, E.g., Quick
sort.
 A sorting algorithm is called stable if it preserves the relative order of any two
equal elements in its input.
(ii) Searching
 The searching problem deals with finding a given value, called a search key, in a
given set.
 E.g., Ordinary Linear search and fast binary search.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 8
1151CS119-Design and Analysis of Algorithm
(iii) String processing
 A string is a sequence of characters from an alphabet.
 Strings comprise letters, numbers, and special characters; bit strings, which
comprise zeros and ones; and gene sequences, which can be modeled by strings of
characters from the four- character alphabet {A, C, G, T}. It is very useful in
bioinformatics.
 Searching for a given word in a text is called string matching
(iv) Graph problems
 A graph is a collection of points called vertices, some of which are connected by
line segments called edges.
 Some of the graph problems are graph traversal, shortest path algorithm,
topological sort, traveling salesman problem and the graph-coloring problem and
so on.
(v) Combinatorial problems
 These are problems that ask, explicitly or implicitly, to find a combinatorial object
such as a permutation, a combination, or a subset that satisfies certain constraints.
 A desired combinatorial object may also be required to have some additional
property such s a maximum value or a minimum cost.
 In practical, the combinatorial problems are the most difficult problems in
computing.
 The traveling salesman problem and the graph coloring problem are examples
of combinatorial problems.
(vi) Geometric problems
 Geometric algorithms deal with geometric objects such as points, lines, and
polygons.
 Geometric algorithms are used in computer graphics, robotics, and tomography.
 The closest-pair problem and the convex-hull problem are comes under this
category.
(vii) Numerical problems
 Numerical problems are problems that involve mathematical equations,
systems of equations, computing definite integrals, evaluating functions, and
so on.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 9
1151CS119-Design and Analysis of Algorithm

 The majority of such mathematical problems can be solved only approximately.

1.3 FUNDAMENTALS OF THE ANALYSIS OF ALGORITHM EFFICIENCY


The efficiency of an algorithm can be in terms of time and space. The
algorithm efficiency can be analyzed by the following ways.
a. Analysis Framework.
b. Asymptotic Notations and its properties.
c. Mathematical analysis for Recursive algorithms.
d. Mathematical analysis for Non-recursive algorithms.

1.4 Analysis Framework


There are two kinds of efficiencies to analyze the efficiency of any algorithm. They are:
 Time efficiency, indicating how fast the algorithm runs, and
 Space efficiency, indicating how much extra memory it
uses. The algorithm analysis framework consists of the following:
 Measuring an Input’s Size
 Units for Measuring Running Time
 Orders of Growth
 Worst-Case, Best-Case, and Average-Case Efficiencies

(i) Measuring an Input’s Size


 An algorithm’s efficiency is defined as a function of some parameter n indicating
the algorithm’s input size. In most cases, selecting such a parameter is quite
straightforward. For example, it will be the size of the list for problems of sorting,
searching.
 For the problem of evaluating a polynomial p(x) = anxn + . . . + a0 of degree n, the
size of the parameter will be the polynomial’s degree or the number of its
coefficients, which is larger by 1 than its degree.
 In computing the product of two n × n matrices, the choice of a parameter
indicating an input size does matter.
 Consider a spell-checking algorithm. If the algorithm examines individual
characters of its input, then the size is measured by the number of characters.
 In measuring input size for algorithms solving problems such as checking

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 10
1151CS119-Design and Analysis of Algorithm
primality of a positive integer n. the input is just one number.
 The input size by the number b of bits in the n’s binary representation is b=(log2 n)
+1.

(ii) Units for Measuring Running Time


Some standard unit of time measurement such as a second, or millisecond, and so
on can be used to measure the running time of a program after implementing the
algorithm.
Drawbacks
 Dependence on the speed of a particular computer.
 Dependence on the quality of a program implementing the
algorithm.
 The compiler used in generating the machine code.
 The difficulty of clocking the actual running time of the
program. So, we need metric to measure an algorithm’s efficiency that does not depend on
these extraneous factors.
One possible approach is to count the number of times each of the algorithm’s operations
is executed. This approach is excessively difficult.
The most important operation (+, -, *, /) of the algorithm, called the basic operation.
Computing the number of times the basic operation is executed is easy. The total running time
is determined by the basic operation count.

(iii) Orders of Growth


 A difference in running times on small inputs is not what really
distinguishes efficient algorithms from inefficient ones.
 For example, the greatest common divisor of two small numbers, it is not
immediately clear how much more efficient Euclid’s algorithm is compared
to the other algorithms, the difference in algorithm efficiencies becomes
clear for larger numbers only.
 For large values of n, it is the function’s order of growth that counts just like the
Table 1.1, which contains values of a few functions particularly important for analysis of
algorithms.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 11
1151CS119-Design and Analysis of Algorithm

TABLE 1.1 Values (approximate) of several functions important for analysis of


algorithms

n log2n n n log2n n2 n3 2n n!
√n
1 1 0 1 0 1 1 2 1
2 1.4 1 2 2 4 4 4 2
4 2 2 4 8 16 64 16 24
8 2.8 3 8 2.4•101 64 5.1•102 2.6•102 4.0•104
10 3.2 3.3 10 3.3•101 102 103 103 3.6•106
16 4 4 16 6.4•101 2.6•102 4.1•103 6.5•104 2.1•1013
102 10 6.6 102 6.6•102 104 106 1.3•1030 9.3•10157
103 31 10 103 1.0•104 106 109
104 102 13 104 1.3•105 108 Very big
1012
2
105 3.2•10 17 105 1.7•106 computation
1010 1015
106 103 20 106 2.0•107 1012 1018

(i) Worst-Case, Best-Case, and Average- Case Efficiencies


Consider Sequential Search algorithm some search key K

ALGORITHM SequentialSearch(A[0..n -1], K)


//Searches for a given value in a given array by sequential search
//Input: An array A[0..n - 1] and a search key K
//Output: The index of the first element in A that matches K or -1 if there are no
// matching elements
i ←0
while i < n and A[i] ≠ K do
i ←i + 1 if i < n return i else return -1

Clearly, the running time of this algorithm can be quite different for the same list size n.
In the worst case, there is no matching of elements or the first matching

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 12
1151CS119-Design and Analysis of Algorithm
element can found at last on the list. In the best case, there is matching of elements
at first on the list.

Worst-case efficiency
 The worst-case efficiency of an algorithm is its efficiency for the worst case input
of size n.
 The algorithm runs the longest among all possible inputs of that size.

 For the input of size n, the running time is Cworst(n) = n.

Best case efficiency


 The best-case efficiency of an algorithm is its efficiency for the best case input of
size n.
 The algorithm runs the fastest among all possible inputs of that size n.
 In sequential search, If we search a first element in list of size n. (i.e. first
element equal to a search key), then the running time is Cbest(n) = 1

Average case efficiency


 The Average case efficiency lies between best case and worst case.
 To analyze the algorithm’s average case efficiency, we must make some
assumptions about possible inputs of size n.
 The standard assumptions are that
o The probability of a successful search is equal to p (0 ≤ p ≤ 1) and
o The probability of the first match occurring in the ith position of the
list is the same for every i.

Yet another type of efficiency is called amortized efficiency. It applies not to a single run of an
algorithm but rather to a sequence of operations performed on the same data structure.

1.5 ASYMPTOTIC NOTATIONS AND ITS PROPERTIES


Asymptotic notation is a notation, which is used to take meaningful statement
about the efficiency of a program.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 13
1151CS119-Design and Analysis of Algorithm
The efficiency analysis framework concentrates on the order of growth of an
algorithm’s basic operation count as the principal indicator of the algorithm’s efficiency.
To compare and rank such orders of growth, computer scientists use three
notations, they
 O - Big oh notation
 Ω - Big omega notation
 Θ - Big theta notation

Example 1:

where g(n) = n2.

(i) O - Big oh notation


A function t(n) is said to be in O(g(n)), denoted
is bounded above by some constant multiple of g(n) for all large n, i.e., if there exist some
positive constant c and some nonnegative integer n0 such that

Where t(n) and g(n) are nonnegative functions defined on the set of natural numbers. O =
Asymptotic upper bound = Useful for worst case analysis = Loose bound.

FIGURE 1.5 Big-oh notation:

Example 2: Prove the assertions 100n + 5 ∈ 0(n2).


Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 14
Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 15
1151CS119-Design and Analysis of Algorithm
Proof: 100n + 5 ≤ 100n + n (for all n ≥ 5)
= 101n

≤ 101n2 (therefore n ≤ n2)


Since, the definition gives us a lot of freedom in choosing specific values for constants c and
n0. We have c=101 and n0=5

Example 3: Prove the assertions 100n + 5 ∈ 0(n).


Proof: 100n + 5 ≤ 100n + 5n (for all n ≥ 1)
= 105n
i.e., 100n + 5 ≤ 105n
i.e., t(n) ≤ cg(n)
Therefore 100n + 5 ∈ 0(n) with c=105 and n0=1

(ii) Ω - Big omega notation


A function t(n) is said to be in Ω(g(n)), denoted t(n) ∈ Ω(g(n)), if t(n) is
bounded below by some positive constant multiple of g(n) for all large n, i.e., if
there exist some positive constant c and some nonnegative integer n0 such that
t (n) ≥ cg(n) for all n ≥ n0.
Where t(n) and g(n) are nonnegative functions defined on the set of
natural numbers.
Ω = Asymptotic lower bound = Useful for best case analysis = Loose bound

FIGURE 1.6 Big-omega notation: t (n) ∈ Ω (g(n)).

Example 4: Prove the assertions n3+10n2+4n+2 ∈ Ω (n2).


Proof: n3+10n2+4n+2 ≥ n2 (for all n ≥ 0)

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 16
1151CS119-Design and Analysis of Algorithm
i.e., by definition t(n) ≥ cg(n), where c=1 and n0=0
(iii) Θ - Big theta notation
A function t(n) is said to be in Θ(g(n)), denoted t(n) ∈ Θ(g(n)), if t(n) is bounded
both above and below by some positive constant multiples of g(n) for all large n, i.e., if
there exist some positive constants c1 and c2 and some nonnegative integer n0 such that
c2g(n) ≤ t (n) ≤ c1g(n) for all n ≥ n0.
Where t(n) and g(n) are nonnegative functions defined on the set of natural
numbers.

Θ = Asymptotic tight bound = Useful for average case analysis


FIGURE 1.7 Big-theta notation: t (n) ∈ Θ(g(n)).
Useful Property Involving the Asymptotic Notations
The following property, in particular, is useful in analyzing algorithms that
comprise two consecutively executed parts.

THEOREM: If t1(n) ∈ O(g1(n)) and t2(n) ∈ O(g2(n)), then t1(n) + t2(n) ∈


O(max{g1(n), g2(n)}). (The analogous assertions are true for the Ω and Θ notations
as well.)

PROOF: The proof extends to orders of growth the following simple fact about four
arbitrary real numbers a1, b1, a2, b2: if a1 ≤ b1 and a2 ≤ b2, then a1 + a2 ≤ 2 max{b1, b2}.
Since t1(n) ∈ O(g1(n)), there exist some positive constant c1 and some
nonnegative integer n1 such that
t1(n) ≤ c1g1(n) for all n ≥ n1.
Similarly, since t2(n) ∈ O(g2(n)),
t2(n) ≤ c2g2(n) for all n ≥ n2.
Let us denote c3 = max{c1, c2} and consider n ≥ max{n1, n2} so

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 17
1151CS119-Design and Analysis of Algorithm
that we can use both inequalities. Adding them yields the following:
t1(n) + t2(n) ≤ c1g1(n) + c2g2(n)
≤ c3g1(n) + c3g2(n)
= c3[g1(n) + g2(n)]
≤ c32 max{g1(n), g2(n)}.
Hence, t1(n) + t2(n) ∈ O(max{g1(n), g2(n)}), with the constants c and n 0
required by the definition O being 2c3 = 2 max{c1, c2} and max{n1, n2},
respectively.
The property implies that the algorithm’s overall efficiency will be determined by
the part with a higher order of growth, i.e., its least efficient part.

therefore t1(n) ∈ O(g1(n)) and t2(n) ∈ O(g2(n)), then t1(n) + t2(n) ∈ O(max{g1(n), g2(n)}).

Basic rules of sum manipulation


Summation formulas

1.7 MATHEMATICAL ANALYSIS FOR RECURSIVE


ALGORITHMS General Plan for Analyzing the Time
Efficiency of Recursive Algorithms
1. Decide on a parameter (or parameters) indicating an input’s size.
2. Identify the algorithm’s basic operation.
3. Check whether the number of times the basic operation is executed can vary
on different inputs of the same size; if it can, the worst-case, average-case,
and best-case efficiencies must be investigated separately.
4. Set up a recurrence relation, with an appropriate initial condition, for the
number of times the basic operation is executed.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 18
1151CS119-Design and Analysis of Algorithm
5. Solve the recurrence or, at least, ascertain the order of growth of its solution.
EXAMPLE 1: Compute the factorial function F(n) = n! for an arbitrary
nonnegative integer n. Since n!= 1•........• (n − 1) • n = (n − 1)! • n, for n ≥ 1 and
0!= 1 by definition, we can compute F(n) = F(n − 1) • n with the following
recursive algorithm.
ALGORITHM F(n)
//Computes n! recursively
//Input: A nonnegative integer n
//Output: The value of n!
if n = 0 return 1
else return F(n − 1) * n
Algorithm analysis
 For simplicity, we consider n itself as an indicator of this algorithm’s input size.
i.e. 1.
 The basic operation of the algorithm is multiplication, whose number of
executions we denote M(n). Since the function F(n) is computed according
to the formula F(n) = F(n −1)•n for n > 0.
 The number of multiplications M(n) needed to compute it must satisfy the equality

M(n) = M(n-1) + 1 for n > 0


To compute To multiply
F(n-1) F(n-1) by n

M(n − 1) multiplications are spent to compute F(n − 1), and one more
multiplication is needed to multiply the result by n.
Recurrence relations
The last equation defines the sequence M(n) that we need to find. This
equation defines M(n) not explicitly, i.e., as a function of n, but implicitly as a
function of its value at another point, namely n − 1. Such equations are called
recurrence relations or recurrences.
Solve the recurrence relation M(n) = M(n − 1) + 1, i.e., to find an explicit
formula for
M(n) in terms of n only.
To determine a solution uniquely, we need an initial condition that tells us

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 19
1151CS119-Design and Analysis of Algorithm
the value with which the sequence starts. We can obtain this value by inspecting the
condition that makes the algorithm stop its recursive calls:
if n = 0 return 1.
This tells us two things. First, since the calls stop when n = 0, the smallest
value of n for which this algorithm is executed and hence M(n) defined is 0.
Second, by inspecting the pseudocode’s exiting line, we can see that when n = 0,
the algorithm performs no multiplications.

Thus, the recurrence relation and initial condition for the algorithm’s number of
multiplications
M(n):
M(n) = M(n −1) + 1 for n >
0, M(0) = 0 for n = 0.

Method of backward substitutions


M(n) = M(n − 1) + 1 substitute M(n − 1) = M(n − 2) + 1
= [M(n − 2) + 1]+ 1
= M(n − 2) + 2 substitute M(n − 2) = M(n − 3) + 1
= [M(n − 3) + 1]+ 2
= M(n − 3) + 3

= M(n − i) + i

= M(n − n) + n
= n.
Therefore M(n)=n
EXAMPLE 2:

Consider educational workhorse of recursive algorithms: the Tower of Hanoi puzzle. We have n disks
of different sizes that can slide onto any of three pegs. Consider A (source), B (auxiliary), and C
(Destination). Initially, all the disks are on the first peg in order of size, the largest on the bottom and
the smallest on top. The goal is to move all the disks to the third peg, using the second one as an
auxiliary.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 20
1151CS119-Design and Analysis of Algorithm

FIGURE 1.8 Recursive solution to the Tower of Hanoi puzzle.

ALGORITHM TOH(n, A, C, B)
//Move disks from source to destination recursively
//Input: n disks and 3 pegs A, B, and C
//Output: Disks moved to destination as in the source order.
if n=1
Move disk from A to C
else
Move top n-1 disks from A to B
using C TOH(n - 1, A, B, C)

Move top n-1 disks from B to C


2iM(n −- i)
using A=TOH(n
i−1 −2 i i
1, +B,2 C, +A)2i + . . . + 2 + 1= 2 M(n − i) + 2 − 1.

Since the initial condition is specified for n = 1, which is achieved
for i = n − 1, M(n) = 2n−1M(n − (n − 1)) + 2n−1 – 1 = 2n−1M(1) + 2n−1

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 21
1151CS119-Design and Analysis of Algorithm
− 1= 2n−1 + 2n−1 − 1= 2n − 1.
Thus, we have an exponential time algorithm

EXAMPLE 3: An investigation of a recursive version of the algorithm which finds


the number of binary digits in the binary representation of a positive decimal
integer.
ALGORITHM BinRec(n)
//Input: A positive decimal integer n
//Output: The number of binary digits in n’s binary representation
if n = 1 return 1
else return BinRec(⎝n/2])+ 1

Algorithm analysis
The number of additions made in computing BinRec(⎝n/2]) is A(⎝n/2]),
plus one more addition is made by the algorithm to increase the returned value by
1. This leads to the recurrence A(n) = A(⎝n/2]) + 1 for n > 1.

then, the initial condition is A(1) = 0.


The standard approach to solving such a recurrence is to solve it
only for n = 2k A(2k) = A(2k−1) + 1 for k > 0,
A(20) = 0.
backward substitutions
A(2k) = A(2k−1) + 1 substitute A(2k−1) = A(2k−2) + 1
= [A(2k−2) + 1]+ 1= A(2k−2) + 2 substitute A(2k−2) = A(2k−3) + 1
= [A(2k−3) + 1]+ 2 = A(2k−3) + 3 ...
...
= A(2k−i) + i
...
= A(2k−k) + k.
Thus, we end up with A(2k) = A(1) + k = k, or, after returning to the original
variable n = 2k and hence k = log2 n,
A(n) = log2 n ϵ Θ (log2 n).

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 22
1151CS119-Design and Analysis of Algorithm
1.8 MATHEMATICAL ANALYSIS FOR NON-RECURSIVE
ALGORITHMS General Plan for Analyzing the Time
Efficiency of Nonrecursive Algorithms
1. Decide on a parameter (or parameters) indicating an input’s size.
2. Identify the algorithm’s basic operation (in the innermost loop).
3. Check whether the number of times the basic operation is executed depends
only on the size of an input. If it also depends on some additional property,
the worst-case, average-case, and, if necessary, best-case efficiencies have to
be investigated separately.
4. Set up a sum expressing the number of times the algorithm’s basic operation is
executed.
5. Using standard formulas and rules of sum manipulation either find a closed
form formula for the count or at the least, establish its order of growth.
Algorithm analysis
 The measure of an input’s size here is the number of elements in the array, i.e., n.
 There are two operations in the for loop’s body:
o The comparison A[i]> maxval and
o The assignment maxval←A[i].

 The comparison operation is considered as the algorithm’s basic operation,


because the comparison is executed on each repetition of the loop and not
the assignment.
 The number of comparisons will be the same for all arrays of size n;
therefore, there is no need to distinguish among the worst, average, and best
cases here.
 Let C(n) denotes the number of times this comparison is executed. The
algorithm makes one comparison on each execution of the loop, which is
repeated for each value of the loop’s variable i within the bounds 1 and n −
1, inclusive. Therefore, the sum for C(n) is calculated as follows:

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 23
1151CS119-Design and Analysis of Algorithm
EXAMPLE 2: Consider the element uniqueness problem: check whether all the
Elements in a given array of n elements are distinct.
ALGORITHM UniqueElements(A[0..n − 1])
//Determines whether all the elements in a given array are distinct
//Input: An array A[0..n − 1]
//Output: Returns “true” if all the elements in A are distinct and “false” otherwise
for i ←0 to n − 2 do
for j ←i + 1 to n − 1 do
if A[i]= A[j ] return false
return true

Algorithm analysis
 The natural measure of the input’s size here is again n (the number of elements in
the array).
 Since the innermost loop contains a single operation (the comparison of two
elements), we
should consider it as the algorithm’s basic operation.
 The number of element comparisons depends not only on n but also on
whether there are equal elements in the array and, if there are, which array
positions they occupy. We will limit our investigation to the worst case
only.
 One comparison is made for each repetition of the innermost loop, i.e., for
each value of the loop variable j between its limits i + 1 and n − 1; this is
repeated for each value of the outer loop, i.e., for each value of the loop
variable i between its limits 0 and n − 2.

Department of CSE , Vel Tech Rangarajan Dr.Sagunthala R&D Institute of Science and Technology. Page 24

You might also like