IT 4043
Data Structures and Algorithms
Budditha Hettige
Department of Computer Science
1
Syllabus
• Introduction to DSA
• Abstract Data Types
• Arrays
• List Operation Using Arrays
• Recursion
• Stacks
• Queues
• Link List
• Sorting
• Algorithms Analysis
2
Introduction to
Analysis of Algorithms
1-4
1-4
Introduction to
Analysis of Algorithms
• One aspect of software quality is the efficient
use of computer resources :
– CPU time
– Memory usage
• We frequently want to analyse algorithms
with respect to execution time
– Called time complexity analysis
– For example, to decide which sorting algorithm
will take less time to run
1-5
1-5
Time Complexity
• Analysis of time taken is based on:
– Problem size (e.g. number of items to sort)
– Key operations (e.g. comparison of two values)
• What we want to analyse is the relationship
between
– The size of the problem, n
– And the time it takes to solve the problem, t(n)
• Note that t(n) is a function of n, so it depends on the size
of the problem
12-6
Worst, Average, Best Case
• Worst case analysis: considers the maximum of the
time over all inputs of size n
– Used to find an upper bound on algorithm
performance for large problems (large n)
• Average case analysis: considers the average of the
time over all inputs of size n
– Determines the average (or expected) performance
• Best case analysis: considers the minimum of the
time over all inputs of size n
12-7
Discussion
• What are some difficulties with average case
analysis?
– Hard to determine
– Depends on distribution of inputs
(they might not be evenly distributed)
• So, we usually use worst case analysis
(why not best case analysis?)
1-8
1-8
Growth Functions
• This t(n) is called a growth function
• What does a growth function look like?
– Example of a growth function for some
algorithm:
t(n) = 15n2 + 45 n
• See the next slide to see how t(n) changes as n gets
bigger!
1-9
No. of items n 15n2 45n 15n2 + 45n
1 15 45 60
2 60 90 150
5 375 225 600
10 1,500 450 1,950
100 150,000 4,500 154,500
1,000 15,000,000 45,000 15,045,000
10,000 1,500,000,000 450,000 1,500,450,000
100,000 150,000,000,000 4,500,000 150,004,500,000
1,000,000 15,000,000,000,000 45,000,000 15,000,045,000,000
Example: 15n2 + 45 n
1-10
Comparison of Terms in 15n2 + 45 n
• When n is small, which term is larger?
• But, as n gets larger, note that the 15n2 term
grows more quickly than the 45n term
• Also, the constants 15 and 45 become irrelevant
as n increases
• We say that the n2 term is dominant in this
expression
1-11
1-11
Big-O Notation
• It is not usually necessary to know the exact
growth function
• The key issue is the asymptotic complexity of
the function :
how it grows as n increases
– This is determined by the dominant term in the
growth function (the term that increases most
quickly as n increases)
– Constants and secondary terms become irrelevant
as n increases
1-12
1-12
• The asymptotic complexity of the function is
referred to as the order of the algorithm, and is
specified by using Big-O notation
– Example: O(n2) means that the time taken by the
algorithm grows like the n2 function as n increases
– O(1) means constant time, regardless of the size of the
problem
– Def:
– f (n) is O(g(n)) if there exist positive numbers c and N
such that
f (n) ≤ cg(n) for all n ≥ N
Big-O Notation
1-13
1-13
Some Growth Functions and Their
Asymptotic Complexities
Growth Function Order
t(n) = 17 O(1)
t(n) = 20n - 4 O(n)
t(n) = 12n * log2n + 100n O(n*log2n)
t(n) = 3n2 + 5n - 2 O(n2)
t(n) = 2n + 18n2 + 3n O(2n)
1-14
1-14
Comparison of Some Typical Growth
Functions
1200
1000
800
600
400
200
70605040302010
n
1009080
t(n) = n3
t(n) = n2
t(n) = nlog2n
t(n) = n
1-15
1-15
Exercise: Asymptotic Complexities
Growth Function Order
t(n) = 5n2 + 3n ?
t(n) = n3 + log2n – 4 ?
t(n) = log2n * 10n + 5 ?
t(n) = 3n2 + 3n3 + 3 ?
t(n) = 2n + 18n100 ?
1-16
Determining Time Complexity
• Algorithms frequently contain sections of code
that are executed over and over again, i.e. loops
• So, analysing loop execution is basic to
determining time complexity
1-17
1-17
Analysing Loop Execution
• A loop executes a certain number of times
(say n), so the time complexity of the loop is
n times the time complexity of the body of
the loop
• Example: what is the time complexity of the
following loop, in Big-O notation?
x = 0;
for (int i=0; i<n; i++)
x = x + 1;
1-18
1-18
• Nested loops: the body of the outer loop
includes the inner loop
• Example: what is the time complexity of
the following loop, in Big-O notation?
for (int i=0; i<n; i++)
{
x = x + 1;
for (int j=0; j<n; j++)
y = y – 1;
}
1-19
1-19
More Loop Analysis Examples
x = 0;
for (int i=0; i<n; i=i+2)
{
x = x + 1;
}
x = 0;
for (int i=1; i<n; i=i*2)
{
x = x + 1;
}
1-20
1-20
x = 0;
for (int i=0; i<n; i++)
for (int j = i, j < n, j ++)
{
x = x + 1;
}
More Loop Analysis Examples
1-21
Analysis of Stack Operations
• Stack operations are generally efficient,
because they all work on only one end of the
collection
• But which is more efficient: the array
implementation or the linked list
implementation?
1-22
Analysis of Stack Operations
• n is the number of items on the stack
• push operation for ArrayStack:
– O(1) if array is not full (why?)
– What would it be if the array is full? (worst case)
• push operation for LinkedStack:
– O(1) (why?)
• pop operation for each?
• peek operation for each?
Example
• Bubble Sort
• Selection Sort
23
• Shell Sort
• Quick Sort
12-
24
Discussion
• Suppose we want to perform a sort that is O(n2).
What happens if the number of items to be
sorted is 100000?
• Compare this to a sort that is O(n log2(n)) . Now
what can we expect?
• Is an O(n3) algorithm practical for large n?
• What about an O(2n) algorithm, even for small
n? e.g. for a Pentium, runtimes are:
n = 30 n = 40 n = 50 n = 60
11 sec. 3 hours 130 days 365 years

Algorithm analysis

  • 1.
    IT 4043 Data Structuresand Algorithms Budditha Hettige Department of Computer Science 1
  • 2.
    Syllabus • Introduction toDSA • Abstract Data Types • Arrays • List Operation Using Arrays • Recursion • Stacks • Queues • Link List • Sorting • Algorithms Analysis 2
  • 3.
  • 4.
    1-4 1-4 Introduction to Analysis ofAlgorithms • One aspect of software quality is the efficient use of computer resources : – CPU time – Memory usage • We frequently want to analyse algorithms with respect to execution time – Called time complexity analysis – For example, to decide which sorting algorithm will take less time to run
  • 5.
    1-5 1-5 Time Complexity • Analysisof time taken is based on: – Problem size (e.g. number of items to sort) – Key operations (e.g. comparison of two values) • What we want to analyse is the relationship between – The size of the problem, n – And the time it takes to solve the problem, t(n) • Note that t(n) is a function of n, so it depends on the size of the problem
  • 6.
    12-6 Worst, Average, BestCase • Worst case analysis: considers the maximum of the time over all inputs of size n – Used to find an upper bound on algorithm performance for large problems (large n) • Average case analysis: considers the average of the time over all inputs of size n – Determines the average (or expected) performance • Best case analysis: considers the minimum of the time over all inputs of size n
  • 7.
    12-7 Discussion • What aresome difficulties with average case analysis? – Hard to determine – Depends on distribution of inputs (they might not be evenly distributed) • So, we usually use worst case analysis (why not best case analysis?)
  • 8.
    1-8 1-8 Growth Functions • Thist(n) is called a growth function • What does a growth function look like? – Example of a growth function for some algorithm: t(n) = 15n2 + 45 n • See the next slide to see how t(n) changes as n gets bigger!
  • 9.
    1-9 No. of itemsn 15n2 45n 15n2 + 45n 1 15 45 60 2 60 90 150 5 375 225 600 10 1,500 450 1,950 100 150,000 4,500 154,500 1,000 15,000,000 45,000 15,045,000 10,000 1,500,000,000 450,000 1,500,450,000 100,000 150,000,000,000 4,500,000 150,004,500,000 1,000,000 15,000,000,000,000 45,000,000 15,000,045,000,000 Example: 15n2 + 45 n
  • 10.
    1-10 Comparison of Termsin 15n2 + 45 n • When n is small, which term is larger? • But, as n gets larger, note that the 15n2 term grows more quickly than the 45n term • Also, the constants 15 and 45 become irrelevant as n increases • We say that the n2 term is dominant in this expression
  • 11.
    1-11 1-11 Big-O Notation • Itis not usually necessary to know the exact growth function • The key issue is the asymptotic complexity of the function : how it grows as n increases – This is determined by the dominant term in the growth function (the term that increases most quickly as n increases) – Constants and secondary terms become irrelevant as n increases
  • 12.
    1-12 1-12 • The asymptoticcomplexity of the function is referred to as the order of the algorithm, and is specified by using Big-O notation – Example: O(n2) means that the time taken by the algorithm grows like the n2 function as n increases – O(1) means constant time, regardless of the size of the problem – Def: – f (n) is O(g(n)) if there exist positive numbers c and N such that f (n) ≤ cg(n) for all n ≥ N Big-O Notation
  • 13.
    1-13 1-13 Some Growth Functionsand Their Asymptotic Complexities Growth Function Order t(n) = 17 O(1) t(n) = 20n - 4 O(n) t(n) = 12n * log2n + 100n O(n*log2n) t(n) = 3n2 + 5n - 2 O(n2) t(n) = 2n + 18n2 + 3n O(2n)
  • 14.
    1-14 1-14 Comparison of SomeTypical Growth Functions 1200 1000 800 600 400 200 70605040302010 n 1009080 t(n) = n3 t(n) = n2 t(n) = nlog2n t(n) = n
  • 15.
    1-15 1-15 Exercise: Asymptotic Complexities GrowthFunction Order t(n) = 5n2 + 3n ? t(n) = n3 + log2n – 4 ? t(n) = log2n * 10n + 5 ? t(n) = 3n2 + 3n3 + 3 ? t(n) = 2n + 18n100 ?
  • 16.
    1-16 Determining Time Complexity •Algorithms frequently contain sections of code that are executed over and over again, i.e. loops • So, analysing loop execution is basic to determining time complexity
  • 17.
    1-17 1-17 Analysing Loop Execution •A loop executes a certain number of times (say n), so the time complexity of the loop is n times the time complexity of the body of the loop • Example: what is the time complexity of the following loop, in Big-O notation? x = 0; for (int i=0; i<n; i++) x = x + 1;
  • 18.
    1-18 1-18 • Nested loops:the body of the outer loop includes the inner loop • Example: what is the time complexity of the following loop, in Big-O notation? for (int i=0; i<n; i++) { x = x + 1; for (int j=0; j<n; j++) y = y – 1; }
  • 19.
    1-19 1-19 More Loop AnalysisExamples x = 0; for (int i=0; i<n; i=i+2) { x = x + 1; } x = 0; for (int i=1; i<n; i=i*2) { x = x + 1; }
  • 20.
    1-20 1-20 x = 0; for(int i=0; i<n; i++) for (int j = i, j < n, j ++) { x = x + 1; } More Loop Analysis Examples
  • 21.
    1-21 Analysis of StackOperations • Stack operations are generally efficient, because they all work on only one end of the collection • But which is more efficient: the array implementation or the linked list implementation?
  • 22.
    1-22 Analysis of StackOperations • n is the number of items on the stack • push operation for ArrayStack: – O(1) if array is not full (why?) – What would it be if the array is full? (worst case) • push operation for LinkedStack: – O(1) (why?) • pop operation for each? • peek operation for each?
  • 23.
    Example • Bubble Sort •Selection Sort 23 • Shell Sort • Quick Sort
  • 24.
    12- 24 Discussion • Suppose wewant to perform a sort that is O(n2). What happens if the number of items to be sorted is 100000? • Compare this to a sort that is O(n log2(n)) . Now what can we expect? • Is an O(n3) algorithm practical for large n? • What about an O(2n) algorithm, even for small n? e.g. for a Pentium, runtimes are: n = 30 n = 40 n = 50 n = 60 11 sec. 3 hours 130 days 365 years