Divide and Conquer Technique: General Method
Divide and Conquer Technique: General Method
General Method:
The Divide and Conquer Technique splits n inputs into k
subsets , 1< k ≤ n, yielding k subproblems.
Algorithm DAndC(p)
{
if Small(p) then return s(p);
else
{
divide p into smaller instances p1,p2,…….,pk, k≥1;
Apply DAndC to each of these subproblems;
return Combine(DAndC(p1), DAndC(p2),……,DAndC(pk));
}
}
If the size of p is n and the sizes of the k subproblems are n1,n2,
….,nk,then the computing time of DAndC is described by the
recurrence relation
T(n)= g( n) n small
T(n1)+T(n2)+……+T(nk)+f(n) Otherwise
Where T(n) is the time for DAndC on any input of size n and g(n) is
the time to compute the answer directly for small inputs.
The function f(n) is the time for dividing p and combining the
solutions to subproblems.
The Complexity of many divide-and-conquer
algorithms is given by recurrences of the form
c n small
T(n)=
aT(n/b)+f(n) Otherwise
If the time for diving the list is a constant, then the computing time
for binary search is described by the recurrence relation
Unsuccessful searches :
Divide into
two subsists
A FirstPart SecondPart
Recursively
Recursively sort
sort
FirstPart SecondPart
Merge
A is sorted!
Merge-Sort(A, 0, 7)
Divide
A: 66 22 88 44 3 3 7 7 5 5 11
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 3) , divide
A: 3 7 5 1
66 22 88 4
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 1) , divide
A: 3 7 5 1
8 4
6 2
2
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 0) , base case
A: 3 7 5 1
8 4
6
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 0), return
A: 3 7 5 1
8 4
6 2
Merge-Sort(A, 0, 7)
Merge-Sort(A, 1, 1) , base case
A: 3 7 5 1
8 4
2
Merge-Sort(A, 0, 7)
Merge-Sort(A, 1, 1), return
A: 3 7 5 1
8 4
6 2
Merge-Sort(A, 0, 7)
Merge(A, 0, 0, 1)
A: 3 7 5 1
8 4
2 6
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 1), return
A: 3 7 5 1
2 6 8 4
Merge-Sort(A, 0, 7)
Merge-Sort(A, 2, 3) , divide
A: 3 7 5 1
2 6
8 4
4
Merge-Sort(A, 0, 7)
Merge-Sort(A, 2, 2), base case
A: 3 7 5 1
2 6
8
Merge-Sort(A, 0, 7)
Merge-Sort(A, 2, 2), return
A: 3 7 5 1
2 6
8 4
Merge-Sort(A, 0, 7)
Merge-Sort(A, 3, 3), base case
A:
2 6
4
Merge-Sort(A, 0, 7)
Merge-Sort(A, 3, 3), return
A: 3 7 5 1
2 6
8 4
Merge-Sort(A, 0, 7)
Merge(A, 2, 2, 3)
A: 3 7 5 1
2 6
4 8
Merge-Sort(A, 0, 7)
Merge-Sort(A, 2, 3), return
A: 3 7 5 1
2 6 4 8
Merge-Sort(A, 0, 7)
Merge(A, 0, 1, 3)
A: 3 7 5 1
2 4 6 8
Merge-Sort(A, 0, 7)
Merge-Sort(A, 0, 3), return
A: 2 4 6 8 3 7 5 1
Merge-Sort(A, 0, 7)
Merge-Sort(A, 4, 7)
A: 2 4 6 8
3 7 5 1
Merge-Sort(A, 0, 7)
Merge (A, 4, 5, 7)
A: 2 4 6 8
1 3 5 7
Merge-Sort(A, 0, 7)
Merge-Sort(A, 4, 7), return
A: 2 4 6 8 1 3 5 7
Merge-Sort(A, 0, 7)
Merge-Sort(A,
Merge(A, 0, 3, 0,
7)7), done!
A: 1 2 3 4 5 6 7 8
Ex:- [ 179, 254, 285, 310, 351, 423, 450, 520,
652,861 ]
Tree of calls of merge sort
1,10
1,5 6,10
{
mid ← (low+high)/2; Recursive Calls
MergeSort(low,mid);
MergeSort(mid+1, high);
Merge(low, mid, high);
}
}
Merge-Sort: Merge Example
low mid high
A: 2
5 3
5 7 28
15 8 30
1 4
6 5 14
10 6
B: 5 5 15 28 30 6 10 14
L R
: 3 5 15 28 : 6 10 14 22
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
3
1 5 15 28 30 6 10 14
k=low
L: R:
3
2 15
3 28
7 30
8 6
1 10
4 14
5 22
6
i=low j=mid+1
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2
5 15 28 30 6 10 14
L: R:
3
2 5
3 15
7 28
8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 28 30
15 6 10 14
L: R:
2 3 7 8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 6 10 14
L: R:
2 3 7 8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 5 6 10 14
L: R:
2 3 7 8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 5 6 10 14
L: R:
2 3 7 8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 5 6 7 14
L: R:
2 3 7 8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 5 6 7 8
14
L: R:
3
2 5
3 15
7 28
8 6
1 10
4 14
5 22
6
i j
Merge-Sort: Merge Example
A: 5 5 15 28 30 6 10 14
B:
1 2 3 4 5 6 7 8
L: R:
3
2 5
3 15
7 28
8 6
1 10
4 14
5 22
6
i j
A:
5 5 15 28 30 6 10 14
B: 1 2 3 4 5 6 7 8
Algorithm Merge(low,mid,high)
// a[low:high] is a global array containing two sorted subsets in a[low:mid]
// and in a[mid+1:high]. The goal is to merge these two sets into a single set
// residing in a [low:high]. b[ ] is a temporary global array.
{
h:=low; i:=low; j:=mid+1;
while( h ≤ mid ) and ( j ≤ high ) do
{
if( a[h] ≤ a[j] ) then
{
b[i]:=a[h]; h:=h+1;
}
else
{
b[i]:=a[j]; j:=j+1;
}
i:=i+1;
}
if( h > mid ) then
for k:=j to high do
{
b[i] := a[k]; i:= i+1;
}
else
for k:=h to mid do
{
b[i] := a[k]; i:= i+1;
}
for k:= low to high do a[k]:=b[k];
}
Merge-Sort Analysis
n/2 n/2
2 2 2
Merge-Sort Time Complexity
If the time for the merging operation is proportional to n, then the
computing time for merge sort is described by the recurrence relation
c1 n=1, c1 is a constant
T(n) =
2T(n/2) + c2n n>1, c2 is a constant
…..
…..
=2k T(1)+ kc2n
= c1n+c2nlogn = = O(nlogn)
Summary
• Merge-Sort
– Most of the work done in combining the
solutions.
– Best case takes o(n log(n)) time
– Average case takes o(n log(n)) time
– Worst case takes o(n log(n)) time
3. Quick Sort
• Divide:
• Pick any element as the pivot, e.g, the first
element
• Partition the remaining elements into
FirstPart, which contains all elements < pivot
SecondPart, which contains all elements > pivot
4 2 7 8 1 9 3 6 5
pivo
t
x y
The whole process
4 2 7 8 1 9 3 6 5
2 1 3 4 7 8 9 6 5
1 2 3 6 5 7 8 9
1 3 5 6 8 9
5 9
Process:
Keep moving from left side as long as a[ i ]<pivot and from the
right side as long as a[ j ]>pivot
pivot 85 24 63 95 17 31 45 98
i j
85 24 63 95 17 31 45 98
i j
85 24 63 95 17 31 45 98
i j
85 24 63 95 17 31 45 98
i j
If i<j interchange ith and j th elements and
then Continue the process.
85 24 63 45 17 31 95 98
i j
85 24 63 45 17 31 95 98
i j
85 24 63 45 17 31 95 98
i
85 24 63 45 17 31 95 98
85 24 63 45 17 31 95 98
j i
Two sublists:
35 24 63 45 17 95 98
85
Recursively sort
FirstPart and SecondPart
QickSort( low, j-1 ) QickSort( j+1,high )
Quick Sort Algorithm :
Algorithm QuickSort(low,high)
//Sorts the elements a[low],…..,a[high] which resides
//in the global array a[1:n] into ascending order;
// a[n+1] is considered to be defined and must ≥ all the
// elements in a[1:n].
{
if( low< high ) // if there are more than one element
{ // divide p into two subproblems.
j :=Partition(low,high);
// j is the position of the partitioning element.
QuickSort(low,j-1);
QuickSort(j+1,high);
// There is no need for combining solutions.
}
}
Algorithm Partition(l,h)
{
pivot:= a[l] ; i:=l; j:= h+1;
while( i < j ) do
{
i++;
while( a[ i ] < pivot) do
i++;
j--;
while( a[ j ] >= pivot ) do
j--;
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
4 5 6 7 8 9
5 6 7 8 9 O(n2)
6 7 8 9
7 8 9
8 9
9
Worst/bad Case
n cn
n-1 c(n-1)
n-2 c(n-2)
3c
3
Happens only if
• input is sortd 2 2c
• input is reversely sorted 1c
1
Total time:
O(n2)
A best/good case
• It occurs only if each partition divides the list into two
equal size sublists.
O(n logn)
Best/good Case
n
n/2 n/2
2 2 2
c11 c12 1 1 2 2 5 5 6 6
C11=A11B11+A12B21
C11 C12 1 1 2 2 5 5 6 6
C12=A11B12+A12B22 C
C 21 C 22 3 3 4 4 7 7 8 8
C21=A21B11+A22B21 c21 c22 3 3 4 4 7 7 8 8
A A B B22
C22=A21B12+A22B22 21 22 21
T(n)= c1 if n<=2
8T(n/2)+ c2n2 if n>2
T(n) = O(n3)
= 82 T(n/4)+ c22n2 + c 2n 2
= 8log n
2 c1 + c n2
.
8
C11=M1 + M4 - M5 + M7
C12= M3 + M5
C21= M2 + M4
C22=M1 + M3 - M2 + M6
C11 C12 A11 A12 B11 B12
= *
C21 C22 A21 A22 B21 B22
M1 + M 4 - M 5 + M 7 M3 + M5
=
M2 + M4 M1 + M 3 - M 2 + M 6
T(n)= c1 n<=2
7T(n/2) +c2n2 n>2
T(n)= 7kT(1) + c2n2 1+ 7/4 + (7/4)2 + (7/4) 3+……………..+ (7/4)k-1
..
.