data structures - 12. recursion, ii
DESCRIPTION
Slide da cadeira de Estrutura de Dados, ministrado pelo Prof. Dr. Christian Pagot, na Universidade Federal da Paraíba.TRANSCRIPT
Universidade Federal da ParaíbaCentro de Informática
Recursion IILecture 15
1107186 – Estrutura de Dados – Turma 02
Prof. Christian Azambuja PagotCI / UFPB
2Universidade Federal da ParaíbaCentro de Informática
Divide-and-Conquer Algorithms
● Divide-and-conquer algorithms can be characterized by:– Subdivision of the original problem into smaller
ones of the same type.
– Multi-branched recursion.
● Example:– Merge Sort
3Universidade Federal da ParaíbaCentro de Informática
Merge Sort
● It is a divide-and-conquer-based sorting algorithm, with worst case O(n log n).
● Algorithm:– Division: The initial sequence of n numbers is
recursively split into 2 sequences of length n/2 until the length of each sequence is 1.
– Conquer: Sort the subproblems recursively.
– Combine: The 2 sequences are combined.
4Universidade Federal da ParaíbaCentro de Informática
Merge Sort
● It is composed by two functions:– MergeSort: recursively splits the input vector of
length n into 2 vectors of length n/2.
– Merge: Combine two separate pre sorted vectors into an ordered vector.
5Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p=q r
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p=r
6Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p=q r
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p=r
7Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
10 1 9 3 7 8 4 2 6 5
p=q r
8Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p=q r
9Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p=r
10Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p rq
11Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
12Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p=q r
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p=r
13Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p=q r
0 1 2 3 4 5 6 7 8 9
1 10 9 3 7 8 4 2 6 5
p=r
14Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p=q r
15Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p=q r
16Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
17Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 3 7 9 10 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 3 7 9 10 8 4 2 6 5
p rq
18Universidade Federal da ParaíbaCentro de Informática
MergeSort() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:
...
MergeSort(v, 0, 9);
v = 0 1 2 3 4 5 6 7 8 9
1 3 7 9 10 8 4 2 6 5
p rq
0 1 2 3 4 5 6 7 8 9
1 3 7 9 10 8 4 2 6 5
p rq
And so on!!!
...
19Universidade Federal da ParaíbaCentro de Informática
Merge() Function
void MergeSort(int* v, int p, int r){
int q;
if (p<r){
q = (int) (p+r) / 2.0f;MergeSort(v, p, q);MergeSort(v, q+1, r);Merge(v, p, q, r);
}}
C code excerpt:0 1 2 3 4 5 6 7 8 9
1 9 10 3 7 8 4 2 6 5
p rq
v =
0 1 2 3 4 5 6 7 8 9
1 3 7 9 10 8 4 2 6 5
p rq
20Universidade Federal da ParaíbaCentro de Informática
Merge() Function
int Merge(int* v, int p, int q, int r) {int i, j, k;int n1 = q p + 1;int n2 = r q;int* left = (int*) malloc((n1 + 1) * sizeof(int));int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++)left[i] = v[p + i];
for (j=0; j<n2; j++)right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX;i = 0; j = 0;for (k=p; k<=r; k++)
if (left[i] <= right[j]) {v[k] = left[i];i += 1;
}else {
v[k] = right[j];j += 1;
}free(left); free(right);
}
C code excerpt:
21Universidade Federal da ParaíbaCentro de Informática
Merge() Function
int Merge(int* v, int p, int q, int r) {int i, j, k;int n1 = q p + 1;int n2 = r q;int* left = (int*) malloc((n1 + 1) * sizeof(int));int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++)left[i] = v[p + i];
for (j=0; j<n2; j++)right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX;i = 0; j = 0;for (k=p; k<=r; k++)
if (left[i] <= right[j]) {v[k] = left[i];i += 1;
}else {
v[k] = right[j];j += 1;
}free(left); free(right);
}
C code excerpt:
22Universidade Federal da ParaíbaCentro de Informática
Merge() Function
int Merge(int* v, int p, int q, int r) {int i, j, k;int n1 = q p + 1;int n2 = r q;int* left = (int*) malloc((n1 + 1) * sizeof(int));int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++)left[i] = v[p + i];
for (j=0; j<n2; j++)right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX;i = 0; j = 0;for (k=p; k<=r; k++)
if (left[i] <= right[j]) {v[k] = left[i];i += 1;
}else {
v[k] = right[j];j += 1;
}free(left); free(right);
}
C code excerpt:
23Universidade Federal da ParaíbaCentro de Informática
Merge() Function
int Merge(int* v, int p, int q, int r) {int i, j, k;int n1 = q p + 1;int n2 = r q;int* left = (int*) malloc((n1 + 1) * sizeof(int));int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++)left[i] = v[p + i];
for (j=0; j<n2; j++)right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX;i = 0; j = 0;for (k=p; k<=r; k++)
if (left[i] <= right[j]) {v[k] = left[i];i += 1;
}else {
v[k] = right[j];j += 1;
}free(left); free(right);
}
C code excerpt:
24Universidade Federal da ParaíbaCentro de Informática
int Merge(int* v, int p, int q, int r) {int i, j, k;int n1 = q p + 1;int n2 = r q;int* left = (int*) malloc((n1 + 1) * sizeof(int));int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++)left[i] = v[p + i];
for (j=0; j<n2; j++)right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX;i = 0; j = 0;for (k=p; k<=r; k++)
if (left[i] <= right[j]) {v[k] = left[i];i += 1;
}else {
v[k] = right[j];j += 1;
}free(left); free(right);
}
C code excerpt:
Merge() Function
25Universidade Federal da ParaíbaCentro de Informática
int Merge(int* v, int p, int q, int r) { int i, j, k; int n1 = q p + 1; int n2 = r q; int* left = (int*) malloc((n1 + 1) * sizeof(int)); int* right = (int*) malloc((n2 + 1) * sizeof(int));
for (i=0; i<n1; i++) left[i] = v[p + i]; for (j=0; j<n2; j++) right[j] = v[q + 1 + j];
left[n1] = INT_MAX; right[n2] = INT_MAX; i = 0; j = 0; for (k=p; k<=r; k++) if (left[i] <= right[j]) { v[k] = left[i]; i += 1; } else { v[k] = right[j]; j += 1; } free(left); free(right);}
C code excerpt:
Cost of the Merge() Function
…... Constant cost
…..............…... Constant cost
….............….................…... O(n1 + n2) = O(n)
….............….................... O(n)
26Universidade Federal da ParaíbaCentro de Informática
Cost of the MergeSort() Function
● If the algorithm is recursive, its running time can be described by a recurrence:– T(n) is the running time on a problem of size n.
– If n <= c (c is a constant), time is constant.
27Universidade Federal da ParaíbaCentro de Informática
Cost of the MergeSort() Function
● Our division problem step yields a subproblems, each of wich is 1/b the size of the original (for Merge Sort a = b = 2).
● It takes time T(n/b) to solve one subproblem of size n/b.
● It takes aT(n/b) to solve a such subproblems.● Subdivision takes D(n) time.● Combination takes C(n) time.
28Universidade Federal da ParaíbaCentro de Informática
Cost of the MergeSort() Function
● Thus, we get the following recurrence:
T (n)={ Θ(1) , if n≤caT (n/b)+D(n)+C (n)otherwise.
29Universidade Federal da ParaíbaCentro de Informática
Cost of the MergeSort() Function
● With respect to Merge Sort:– Subdivision: computes the middle of the
subarray. Time: D(n) = Θ(1).
– Conquer: solves 2 problems with size n/2. Time: 2T(n/2).
– Combine: Merge = Θ(n).
● Thus, the related recurrence can be rewritten as:
T (n)={ Θ(1) , if n=12T (n /2)+Θ(n) ,if n>1.
30Universidade Federal da ParaíbaCentro de Informática
Cost of the MergeSort() Function
● We can rewrite the recurrence
as
where c is the cost to execute a unique operation.
T (n)={ Θ(1) , if n=12T (n /2)+Θ(n) ,if n>1.
T (n)={ c ,if n=12T (n /2)+cn ,if n>1.
31Universidade Federal da ParaíbaCentro de Informática
Computing the Total Cost of the MergeSort Algorithm
T (n)
T (n)={ c ,if n=12T (n /2)+cn ,if n>1.
32Universidade Federal da ParaíbaCentro de Informática
Computing the Total Cost of the MergeSort Algorithm
cn
T (n/2) T (n/2)
T (n)={ c ,if n=12T (n /2)+cn ,if n>1.
33Universidade Federal da ParaíbaCentro de Informática
Computing the Total Cost of the MergeSort Algorithm
cn
cn /2 cn /2
T (n/ 4) T (n/ 4) T (n/ 4) T (n/ 4)
T (n)={ c ,if n=12T (n /2)+cn ,if n>1.
34Universidade Federal da ParaíbaCentro de Informática
Computing the Total Cost of the MergeSort Algorithm
cn
cn /2 cn /2
c c c c
Height = log2n + 1
cn
cn
cn
+
+
Total cost: cn log2n + cn
Total cost: cn log2n
Total cost O(n log2n)
T (n)={ c ,if n=12T (n /2)+cn ,if n>1.