data structures - 12. recursion, ii

34
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

Upload: emerson-ferreira

Post on 24-Jun-2015

132 views

Category:

Education


3 download

DESCRIPTION

Slide da cadeira de Estrutura de Dados, ministrado pelo Prof. Dr. Christian Pagot, na Universidade Federal da Paraíba.

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.