0% found this document useful (0 votes)
77 views39 pages

Intro To Algorithm Analysis

This document provides an overview of the ITA5002 module on problem solving with data structures and algorithms. It discusses key topics that will be covered in the module, including algorithm analysis frameworks, asymptotic notations for analyzing time complexity, different types of algorithms like divide-and-conquer and dynamic programming, and analyzing the space and time complexity of algorithms.

Uploaded by

Arun S
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
Download as ppt, pdf, or txt
0% found this document useful (0 votes)
77 views39 pages

Intro To Algorithm Analysis

This document provides an overview of the ITA5002 module on problem solving with data structures and algorithms. It discusses key topics that will be covered in the module, including algorithm analysis frameworks, asymptotic notations for analyzing time complexity, different types of algorithms like divide-and-conquer and dynamic programming, and analyzing the space and time complexity of algorithms.

Uploaded by

Arun S
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1/ 39

ITA5002 – Problem Solving with Data

Structures and Algorithms

Module 1: Introduction to algorithm


analysis

1
Module 1: Introduction to Algorithm
Analysis

 The Problem-solving Aspect


 Analysis framework
 Asymptotic notations
 Growth rate of functions
 Complexity analysis
 Mathematical analysis of recursive and non-recursive
algorithms.

2
Data Structures

 Data Structure is a way to store and organize data in


memory, efficiently i.e array in C language.
 It is also used for processing, retrieving, and storing data
 A data structure is a specialized format for organizing,
processing, retrieving and storing data.
 Static data structure: the size is allocated at the compile
time. The maximum size is fixed.
 Dynamic data structure: the size is allocated at the run
time. The maximum size is flexible.

3
Data Structures

4
Data Structures

 Linear Data Structure: Elements are arranged in linear


dimension. (ordered sequence)
 Example: lists, stack, queue, etc.
 Non-Linear Data Structure: Elements are arranged in
one-many, many-one and many-many dimensions.
 Example: tree, graph, table, etc.

5
Algorithm

 An algorithm is a clearly specified set of simple


instructions to be followed to solve a problem.
 It is finite sequence of instructions used to solve a
particular problem or to perform a computation.
 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.

6
Algorithm
Characteristics of an Algorithm

 Unambiguous − Each of its steps and their inputs/outputs


should be clear and must lead to only one meaning.
 Input − algorithm should have 0 or more well-defined
inputs.
 Output − algorithm should have 1 or more well-defined
outputs, and should match the desired output.
 Finiteness − Algorithms must terminate after a finite
number of steps.
 Feasibility − Should be feasible with the available
resources.
 Independent − An algorithm must be language-
independent.

7
Algorithm
Why are Algorithms Important to Understand?

 The ability to define clear steps to solve a problem, is


crucial in many different fields (machine learning and
artificial intelligence).
 Even if we are not conscious of it, we use algorithms and
algorithmic thinking all the time. 
 Algorithmic thinking allows us to break down
problems and conceptualize solutions in terms of
discrete steps. 
 Being able to understand and implement an algorithm
requires us to practice structured thinking and reasoning
abilities.

8
Algorithm
Steps in Designing and Analyzing an Algorithm

1. Understanding the Problem


2. Development of a Model
3. Specification of an Algorithm
4. Design an Algorithm and Data Structures
5. Proving the correctness of an Algorithm
6. Analyzing an Algorithm
7. Coding an Algorithm

9
Algorithm
Steps in Designing and Analyzing an Algorithm

1. Understanding the Problem


 What are the problem objects?
 What are the operations applied to the objects?
2. Development of a Model
 How the objects would be represented?
 How the operations would be implemented?
3. Specification of an Algorithm
4. Design an Algorithm and Data Structures
 Build a computational model of the solving process

10
Algorithm
Steps in Designing and Analyzing an Algorithm

5. Proving the correctness of an Algorithm


 Correct output for every legitimate input in finite time
 Based on correct math formula
6. Analyzing an Algorithm
 Efficiency: time and space
 Simplicity
 Generality: range of inputs, special cases
 Optimality: no other algorithm can do better
7. Coding an Algorithm
 How the objects and operations in the algorithm are
represented in the chosen programming language?

11
Types of Algorithms

 Divide and conquer algorithms


 Brute force algorithms
 Randomized algorithms
 Greedy algorithms
 Recursive algorithms
 Backtracking algorithms
 Dynamic programming algorithms

12
Types of Algorithms

 Divide and conquer algorithms – divide the problem


into smaller subproblems of the same type; solve those
smaller problems, and combine those solutions to solve
the original problem.
 Brute force algorithms – try all possible solutions until
a satisfactory solution is found.
 Randomized algorithms – use a random number at
least once during the computation to find a solution to
the problem.
 Greedy algorithms – find an optimal solution at the
local level with the intent of finding an optimal solution
for the whole problem.
13
Types of Algorithms

 Recursive algorithms – solve the lowest and simplest version


of a problem to then solve increasingly larger versions of the
problem until the solution to the original problem is found.
 Backtracking algorithms – divide the problem into
subproblems, each which can be attempted to be solved;
however, if the desired solution is not reached, move
backwards in the problem until a path is found that moves it
forward.
 Dynamic programming algorithms – break a complex
problem into a collection of simpler subproblems, then solve
each of those subproblems only once, storing their solution for
future use instead of re-computing their solutions.

14
Analysis of Algorithms

 Issues:
 Correctness
 time efficiency
 space efficiency
 Optimality
 Approaches:
 theoretical analysis
 empirical analysis

15
Theoretical Analysis of Time Efficiency
 Time efficiency is analyzed by determining the number of
repetitions of the basic operation as a function of input size
 Basic operation: the operation that contributes most towards the
running time of the algorithm
input size

T(n) ≈ copC(n)
running time execution Number of
time times basic
for basic operation is
operation executed

16
Empirical Analysis of Time Efficiency

 Select a specific (typical) sample of inputs


 Use physical unit of time (e.g., milliseconds)
or
 Count actual number of basic operation’s executions
 Analyze the empirical data

17
Why Analysis of Algorithms is important?

 To predict the behavior of an algorithm without


implementing it on a specific computer.
 It is much more convenient to have simple measures for
the efficiency of an algorithm than to implement the
algorithm and test the efficiency every time a certain
parameter in the underlying computer system changes.
 It is impossible to predict the exact behavior of an
algorithm. There are too many influencing factors.
 The analysis is thus only an approximation; it is not perfect.
 More importantly, by analyzing different algorithms, we can
compare them to determine the best one for our purpose.

18
Algorithm Complexity

 Suppose X is an algorithm and n is the size of input data,


the time and space used by the algorithm X are the two
main factors, which decide the efficiency of X.
 Time Factor − Time is measured by counting the number
of key operations such as comparisons in the sorting
algorithm.
 Space Factor − Space is measured by counting the
maximum memory space required by the algorithm.
 The complexity of an algorithm f(n) gives the running time
and/or the storage space required by the algorithm in
terms of n as the size of input data.

19
Analysis Framework
Space Complexity

 Space complexity of an algorithm represents the amount of


memory space required by the algorithm in its life cycle.
 The space required by an algorithm is equal to the sum of
the following two components −
1. A fixed part that is a space required to store certain data
and variables, that are independent of the size of the
problem. For example, simple variables and constants used,
program size, etc.
2. A variable part is a space required by variables, whose size
depends on the size of the problem. For example, dynamic
memory allocation, recursion stack space, etc.

21
Space Complexity

 Space complexity S(P) of any algorithm P is S(P) = C +


S(I), where C is the fixed part & S(I) is the variable part of
the algorithm, which depends on instance characteristic I.
 Following is a simple example that tries to explain the
concept Algorithm: SUM(A, B)
 Step 1 - START
 Step 2 - C ← A + B + 10
 Step 3 - Stop
 Here we have three variables A, B, and C and one constant.
Hence S(P) = 1 + 3. Now, space depends on data types of
given variables and constant types and it will be multiplied
accordingly.
22
Time Complexity

 Time complexity of an algorithm represents the amount of


time required by the algorithm to run to completion.
 Time requirements can be defined as a numerical function
T(n), where T(n) can be measured as the number of steps,
provided each step consumes constant time.
 For example, addition of two n-bit integers takes n steps.
Consequently, the total computational time is T(n) = c ∗ n,
where c is the time taken for the addition of two bits.
 Here, we observe that T(n) grows linearly as the input size
increases.

23
Example: Sequential search
Best-case, average-case, worst-case

 For some algorithms efficiency depends on form of input:


 Worst case: Cworst(n) – maximum over inputs of size n
 Best case: Cbest(n) – minimum over inputs of size n
 Average case: Cavg(n) – “average” over inputs of size n

 Number of times the basic operation will be executed on


typical input
 NOT the average of worst and best case
 Expected number of basic operations considered as a
random variable under some assumption about the
probability distribution of all possible inputs
Best-case, average-case, worst-case

 Exact formula
e.g., C(n) = n(n-1)/2

 Formula indicating order of growth with specific


multiplicative constant
e.g., C(n) ≈ 0.5 n2

 Formula indicating order of growth with unknown


multiplicative constant
e.g., C(n) ≈ cn2
Time Complexity Classes

Class Example Description


Constant 1 Doing a single task at most a fixed number of times.
Example: retrieving the first element in a list.
Logarithmic logn Breaking down a large problem by cutting its size by
some fraction. Example: Binary Search.
Linear n "Touches" each element in the input. Example:
printing a list.
Linearithmic nlogn Breaking up a large problem into smaller problems,
solving them independently, and combining the
solutions. Example: Mergesort.
Quadratic "Touches" all pairs of input items. Example: Insertion
Sort.
n2
Exponential Often arises in brute-force search where you are
cn ,c>1 looking for subsets of a collection of items that
satisfy a condition.
Factorial n! Often arises in brute-force search where you are
looking for permutations of a collection of items that
satisfy a condition.
Growth Rate Function

 O(1) – constant time, the time is independent of n, e.g.


array look-up
 O(log n) – logarithmic time, usually the log is base 2, e.g.
binary search
 O(n) – linear time, e.g. linear search
 O(n*log n) – e.g. efficient sorting algorithms
 O(n2) – quadratic time, e.g. selection sort
 O(nc) – polynomial (where c is some constant)
 O(2n) – exponential time, very slow!
 Order of growth of some common functions
O(1) < O(log n) < O(n) < O(n * log n) < O(n2) < O(nc) < O(2n)
Growth Rate Function
Asymptotic Notations

 Asymptotic analysis of an algorithm refers to defining the


mathematical foundation/framing of its run-time
performance.
 The time required by an algorithm falls under three types −
 Best Case − Minimum time required for program execution.
 Average Case − Average time required for program execution.
 Worst Case − Maximum time required for program execution.
 Following are the commonly used asymptotic notations to
calculate the running time complexity of an algorithm.
 Ο Notation
 Ω Notation
 θ Notation
Asymptotic Notations – Big - Oh(O)

 Big-Oh (O) notation gives an upper bound for a function f(n)


to within a constant factor.
 We write f(n) = O(g(n)), If there are positive constants n0
 and c such that, to the right of n0 the f(n) always lies on or
below c*g(n).
 O(g(n)) = { f(n) : There exist positive constant c and n0
such that 0 ≤ f(n) ≤ c g(n), for all n ≥ n0}
Asymptotic Notations - Big-
Omega(Ω)
 Big-Omega (Ω) notation gives a lower bound for a function
f(n) to within a constant factor.
 We write f(n) = Ω(g(n)), If there are positive constants n0
 and c such that, to the right of n0 the f(n) always lies on or
above c*g(n).
 Ω(g(n)) = { f(n) : There exist positive constant c and n0
such that 0 ≤ c g(n) ≤ f(n), for all n ≥ n0}
Asymptotic Notations - Big- Theta (Θ)

 Big-Theta(Θ) notation gives bound for a function f(n) to


within a constant factor.
 We write f(n) = Θ(g(n)), If there are positive constantsn0
 and c1 and c2 such that, to the right of n0 the f(n) always
lies between c1*g(n) and c2*g(n) inclusive.
 Θ(g(n)) = {f(n) : There exist positive constant c1, c2 and n0
such that 0 ≤ c1 g(n) ≤ f(n) ≤ c2 g(n), for all n ≥ n0}
Asymptotic Notations – Little - oh (o)

 Little o notation is used to describe an upper bound that


cannot be tight. In other words, loose upper bound of f(n).
 We can say that the function f(n) is o(g(n)) if for any real
positive constant c, there exists an integer constant n0 ≤ 1
such that f(n) > 0.
 Mathematical Relation of Little o notation
 Using mathematical relation, we can say that f(n) = o(g(n))
means,
Asymptotic Notations – Little - oh (o)

 Little o notation is used to describe an upper bound that


cannot be tight. In other words, loose upper bound of f(n).
 We can say that the function f(n) is o(g(n)) if for any real
positive constant c, there exists an integer constant n0 ≤ 1
such that f(n) > 0.
 Mathematical Relation of Little o notation
 Using mathematical relation, we can say that f(n) = o(g(n))
means,
Asymptotic Notations – Little - Omega (ω)

 Little ω Notations
 Little omega (ω) notation is used to describe a loose lower
bound of f(n).
Example 1: Maximum Element
Example 2: Element Uniqueness
Problem
Example 2: Element Uniqueness
Problem

You might also like