Professional Documents
Culture Documents
Data Structures and Algorithms Lecture Notes: Introduction, Definitions, Terminology, Brassard Chap. 2
Data Structures and Algorithms Lecture Notes: Introduction, Definitions, Terminology, Brassard Chap. 2
Data Structures and Algorithms Lecture Notes: Introduction, Definitions, Terminology, Brassard Chap. 2
16 septembre 2020
Outline
There are often many different algorithms for a same problem (ex.
sorting an array of integers : insertion, selection, merge sort, quicksort,
bubblesort)
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +)
v=A[i] ; j=i-1 ;
while(j > 0 & A[j] > v )
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
Many algorithms for a same problem
Given that there is often several algorithms for a same problem, one
might want to compare the algorithms with each others
Pretty much every one prefer algorithms that run fast, the faster the
better
But we need to be little bit careful when measuring the running time
of an algorithm because factors not related to the algorithm can affect
the running time.
Experimental Running Time
Write a program implementing the algorithm
Run the program with inputs of varying size and composition
Use a method like clock( ) to get an accurate measure of the actual
running time
Selection sort(A[1..n])
for i = 1 to n − 1 do
minj = i ; minx = A[i] ;
for j = i + 1 to n do
if A[j] < minx then
minj = j ; minx = A[j] ;
A[minj] = A[i] ; A[i] = minx ;
Identifying the instruction to be counted
The operation to be counted is the one that is executed the most often
Here the expression describing the running time T (n) is the same across computer
architectures :
T (n) =
Pn Pn Pn
c1 n + c2 (n − 1) + c4 (n − 1) + c5 j=2 tj + c6 j=2 (tj − 1) + c7 j=2 (tj − 1) + c8 (n − 1)
Aggregating the terms in T (n)
n
X n
X n
X
T (n) = c1 n + c2 (n − 1) + c4 (n − 1) + c5 tj + c6 (tj − 1) + c7 (tj − 1)
j=2 j=2 j=2
+c8 (n − 1)
n(n + 1) n(n − 1)
= c1 n + c2 (n − 1) + c4 (n − 1) + c5 ( − 1) + c6 ( )
2 2
n(n − 1)
+c7 ( ) + c8 (n − 1)
2
c5 c6 c7 c5 c6 c7
= ( + + )n2 + (c1 + c2 + c4 + − − )n
2 2 2 2 2 2
−(c2 + c4 + c5 + c8 )
= an2 + bn + c
Rational for selecting one basic instruction
Selection sort(A[1..n])
for i = 1 to n − 1 do
minj = i ; minx = A[i] ;
for j = i + 1 to n do
if A[j] < minx then
minj = j ; minx = A[j] ;
A[minj] = A[i] ; A[i] = minx ;
Selection sort(A[1..n])
for i = 1 to n − 1 do
minj = i ; minx = A[i] ;
for j = i + 1 to n do
if A[j] < minx then
minj = j ; minx = A[j] ;
A[minj] = A[i] ; A[i] = minx ;
The problem : search for a value x in an array A[1..n] of n integers. If x is found returns the
entry i in A where x has been found, else returns 0.
SequentialSearch (L[1..n], x)
Foundx = false; i = 1;
while (i ≤ n & Foundx = false) do
if L[i] = x then
Foundx = true;
else
i = i + 1;
if not Foundx then i = 0;
return i;
I What is the size of the input ?
I What are the elementary operations ?
I Which EO will be a good one to measure the running time of this algorithm ?
I How many elementary operations, as a function of the array size n ?
Running time & worst case instances
For many algorithms, we still cannot tell their running time just by
counting the number of times an elementary operation is executed
To solve this issue we express the running time for the worst case
instance of a given size
Worst case analysis
Same as before except one needs to find the worst instances, i.e. the
instances which for a given size n have the largest possible running time
SequentialSearch (L[1..n], x)
Foundx = false; i = 1;
while (i ≤ n & Foundx = false) do
if L[i] = x then
Foundx = true;
else
i = i + 1;
if not Foundx then i = 0;
return i;
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; for i = 2 one basic operation is
while(j > 0 & A[j] > v ) executed
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
Insertion sort, worst case analysis
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; for i = 3, two basic operations are
while(j > 0 & A[j] > v ) executed,therefore 1 + 2
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
Insertion sort, worst case analysis
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; for i = 4, three basic operations are
while(j > 0 & A[j] > v ) executed,therefore 1 + 2 +3
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
Insertion sort, worst case analysis
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; for i = 5, two basic operations are
while(j > 0 & A[j] > v ) executed,therefore 1 + 2 + 3 + 2
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
Insertion sort, worst case analysis
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; for i = 6, one basic operation is
while(j > 0 & A[j] > v ) executed,therefore
A[j+1]=A[j] ; j– ; 1 + 2 + 3 + 2 + 1 = 9 basic
A[j+1] = v ; operations
Insertion sort, worst case analysis
The input array is already sorted (best case)
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; In this case the running time is
while(j > 0 & A[j] > v ) n−1
A[j+1]=A[j] ; j– ;
A[j+1] = v ;
8 23 32 45 56 78
8 23 32 45 56 78
8 23 32 45 56 78
8 23 32 45 56 78
8 23 32 45 56 78
8 23 32 45 56 78
Insertion sort, worst case analysis
The input array is sorted in decreasing order (worst case)
InsertionSort(A[1..n])
for (i = 2; i <= n; i + +) Running time
v=A[i] ; j=i-1 ; In this case the running
P time is
while(j > 0 & A[j] > v ) 2 + 3 + 4 + 5 + 6 = nj=2 j =
A[j+1]=A[j] ; j– ; n(n+1)
2 −1
A[j+1] = v ;
78 56 45 32 23 8
56 78 45 32 23 8
45 56 78 32 23 8
32 45 56 78 23 8
23 32 45 56 78 8
8 23 32 45 56 78
Selection sort, worst case analysis
Selection sort(A[1..n])
for i = 1 to n − 1 do
minj = i ; minx = A[i] ;
for j = i + 1 to n do
if A[j] < minx then
minj = j ; minx = A[j] ;
A[minj] = A[i] ; A[i] = minx ;
The execution of the two loops is independent of how the input array
is structured, therefore the running time for selection sort is the same
for all inputs of a given size n
Example : Search for Maximum
Problem : Search the maximum element in an array of n integers.
Algorithm :
max(A[1..n])
max value = int.MIN VAL ;
for ( i = 0; i < n; i + +)
max value = MAXIMUM(max value, A[i]) ;
return max value ;
Selecting (=) inside the loop as EO, the worst-case running time in
terms of n are :
I for an array of length 1, 1 comparison
I for an array of length 2, 2 comparisons
..
.
I for an array of length n, n comparisons
1. As the example on slides 27 to 30, show the steps of insertion sort on the following
array A = [31, 41, 59, 26, 41, 58]. For each iteration of the outer for loop, gives the
number of iterations executed by the inner while loop.
2. How many elementary operations insertion sort executes on each of the two following
input arrays : [4, 3, 2, 1], [1, 2, 3, 4], [3, 1, 4, 2] ?
3. How would you modify the procedure insertion-sort such that it sorts in decreasing
order rather than in increasing order as it is on slide 27 ?
Exercises (cont)
4. The following algorithm test whether an array of size n is sorted in increasing order. If
so return true. Algorithm :
TestForAscendingOrder(L[1..n])
i = 1 ; ascending = true ;
while (i ≤ n − 1 & ascending) do
ascending = (L[i] ≤ L[i + 1]) ;
i = i + 1;
return ascending ;
I Choose elementary operation(s) and decide what the size of the input is for the
algorithm.
I Give a worst-case input and compute how many elementary operations are
performed for it.
I Give a “best-case” input and compute how many elementary operations are
performed for it.