Top Banner
Universidade Federal da Paraíba Centro de Informática Recursion II Lecture 15 1107186 – Estrutura de Dados – Turma 02 Prof. Christian Azambuja Pagot CI / UFPB
34

Data Structures - 12. Recursion, II

Jun 24, 2015

Download

Education

Slide da cadeira de Estrutura de Dados, ministrado pelo Prof. Dr. Christian Pagot, na Universidade Federal da Paraíba.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Data Structures - 12. Recursion, II

Universidade Federal da ParaíbaCentro de Informática

Recursion IILecture 15

1107186 – Estrutura de Dados – Turma 02

Prof. Christian Azambuja PagotCI / UFPB

Page 2: Data Structures - 12. Recursion, II

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

Page 3: Data Structures - 12. Recursion, II

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.

Page 4: Data Structures - 12. Recursion, II

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.

Page 5: Data Structures - 12. Recursion, II

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

Page 6: Data Structures - 12. Recursion, II

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

Page 7: Data Structures - 12. Recursion, II

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

Page 8: Data Structures - 12. Recursion, II

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

Page 9: Data Structures - 12. Recursion, II

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

Page 10: Data Structures - 12. Recursion, II

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

Page 11: Data Structures - 12. Recursion, II

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

Page 12: Data Structures - 12. Recursion, II

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

Page 13: Data Structures - 12. Recursion, II

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

Page 14: Data Structures - 12. Recursion, II

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

Page 15: Data Structures - 12. Recursion, II

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

Page 16: Data Structures - 12. Recursion, II

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

Page 17: Data Structures - 12. Recursion, II

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

Page 18: Data Structures - 12. Recursion, II

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!!!

...

Page 19: Data Structures - 12. Recursion, II

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

Page 20: Data Structures - 12. Recursion, II

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:

Page 21: Data Structures - 12. Recursion, II

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:

Page 22: Data Structures - 12. Recursion, II

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:

Page 23: Data Structures - 12. Recursion, II

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:

Page 24: Data Structures - 12. Recursion, II

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

Page 25: Data Structures - 12. Recursion, II

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)

Page 26: Data Structures - 12. Recursion, II

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.

Page 27: Data Structures - 12. Recursion, II

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.

Page 28: Data Structures - 12. Recursion, II

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.

Page 29: Data Structures - 12. Recursion, II

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.

Page 30: Data Structures - 12. Recursion, II

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.

Page 31: Data Structures - 12. Recursion, II

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.

Page 32: Data Structures - 12. Recursion, II

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.

Page 33: Data Structures - 12. Recursion, II

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.

Page 34: Data Structures - 12. Recursion, II

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.