0% found this document useful (0 votes)
10 views

Week05 Design 2

The document discusses divide and conquer algorithms. It explains the general divide and conquer approach of dividing a problem into subproblems, solving the subproblems recursively, and combining the solutions. It provides examples of algorithms that use this approach including merge sort, quicksort, and finding the maximum value.

Uploaded by

Lord Ch4os
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
10 views

Week05 Design 2

The document discusses divide and conquer algorithms. It explains the general divide and conquer approach of dividing a problem into subproblems, solving the subproblems recursively, and combining the solutions. It provides examples of algorithms that use this approach including merge sort, quicksort, and finding the maximum value.

Uploaded by

Lord Ch4os
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 42

Algorithm Design :

Divide and Conquer


“Divide et impera ”
Divide and rule
Julius Caesar’s favorite war tactic : Divide an opposing army
in two halves and then assault one half with entire force.
Divide and Conquer
• Divide-and-conquer method for algorithm design:
• If the problem size is small enough to solve it in a
straightforward manner, solve it. Else:
• Divide: Divide the problem into two or more disjoint
smaller subproblems
• Conquer: Use divide-and-conquer recursively to solve the
subproblems
• Combine: Take the solutions to the subproblems and
combine these solutions into a solution for the original
problem
Divide-and-conquer technique
Divide. Yes but, is it possible?
a problem of size n If it is, then HOW?

subproblem 1 subproblem 2
of size n/2 of size n/2

a solution to a solution to
subproblem 1 subproblem 2

Combine. HOW?
a solution to
the original problem
Solving Small and Large Instances
• Usually, a small instance can be solved using some direct/simple
strategy. Examples:
• Sort a list that has n <= 10 elements.
• Use insertion, bubble, or selection sort.
• Find the minimum of n <= 2 elements.
• When n = 0, there is no minimum element.
• When n = 1, the single element is the minimum.
• When n = 2, compare the two elements and determine the smaller.
•Find the minimum of n>2 elements.
A large instance: We need a different solution method
A simple example : FindMax
• Finding the maximum of a set S of n numbers

Small instances

5 -5
Time complexity of FindMax : Recurrence
 2T(n/2)+1 , n>2
T(n)= 
 1 , n2
Assume n = 2k . Use substitution
T(n)= 2T(n/2)+1
= 2(2T(n/4)+1)+1
= 4T(n/4)+2+1
= 8T(n/8)+4+2+1
:
=2k-1T(2)+ 2k-2+…+4+2+1
=2k-1+2k-2+…+4+2+1
=2k-1 (Using 1+2+4+…….2 n-1 = 2 n- 1 )
= n-1 ( Since n = 2k )
= O(n)

5 -6
Divide-and-Conquer Examples
• Sorting: mergesort and quicksort
• Binary Search
• Binary tree traversals
• Graph applications
• Big Integer Multiplication
• Closest Pair of Points Problem
• Strassen’s Algorithm for Matrix Multiplication
• …………………..
5 Examples for Divide-and-Conquer
#1 Mergesort
Merge-sort on an input sequence A with r elements consists of three steps:

1. Divide: partition A into two sequences A1 and A2 of about r/2


elements each

2. Conquer(Recur): recursively sort A1 and A2

3. Combine: merge A1 and A2 into a unique sorted sequence

9
#1 Recursive Merge Sort
//p, r : first and last index values. Initially: p=1, r=n
MERGE_SORT(A,p,r)
if p<r
then q←(p+r)/2
MERGE_SORT(A,p,q)
MERGE_SORT(A,q+1, r)
MERGE(A,p,q,r)
#1 Merge Sort
1 2 3 4 5 6 7 8 9 10 11

Step #1 Divide 4 7 2 6 1 4 7 3 5 2 6 q=6

1 2 3 4 5 6 7 8 9 10 11

q=3 4 7 2 6 1 4 7 3 5 2 6 q=9

1 2 3 4 5 6 7 8 9 10 11

4 7 2 6 1 4 7 3 5 2 6

1 2 3 4 5 6 7 8 9 10 11

4 7 2 6 1 4 7 3 5 2 6

1 2 4 5 7 8

4 7 6 1 7 3

11
#1 Merge Sort
1 2 3 4 5 6 7 8 9 10 11

1 2 2 3 4 4 5 6 6 7 7
Step #2 Conquer
1 2 3 4 5 6 7 8 9 10 11

Step #3 Merge 1 2 4 4 6 7 2 3 5 6 7

1 2 3 4 5 6 7 8 9 10 11

2 4 7 1 4 6 3 5 7 2 6

1 2 3 4 5 6 7 8 9 10 11

4 7 2 1 6 4 3 7 5 2 6

1 2 4 5 7 8

4 7 6 1 7 3

12
Running time: Recurrence Equation
n n
T ( n) = T ( ) + T ( ) + O ( n) (O(n) is for merge operations)
2 2
n
= 2T ( ) + O(n)
2

Assume that:
n = 2k
T (1) = 1
n
T (n) = 2T ( ) + n
2
Running Time : Solving the Recurrence
T(n) = 2T(n/2) + n
T(n) = 2[2T(n/4)+n/2] + n
= 4T(n/4) + 2n
= 4[2T(n/8)+n/4] + 2n
= 8T(n/8) + 3n
……………………………..

T(n) = 2kT(n/2k) + k n (After kth derivation)

But, n = 2k and k = log2n. By replacing the value for k we find:

T(n) = nT(1) + nlog2n = O(nlog2n)


Running Time : Recursion Tree Method
n n
T (1) = 1
T (n) = 2T (n / 2) + n
n/2 n/2 n

log2 n
n/4 n/4 n/4 n/4 n

. . . . . . . .

1 1 1 1 1 1 1 1 n

Total = n log2 n
T (n) = O(n log2 n) = O(n lg n)
#2 Quicksort
• Select a pivot (partitioning element) – here, the first element
• Rearrange the list so that all the elements in the first s positions are
smaller than or equal to the pivot and all the elements in the
remaining n-s positions are larger than or equal to the pivot

A[i]p A[i]>p
• Exchange the pivot with the last element in the first (i.e., ) sub-array — the
pivot is now in its final position
• Sort the two sub-arrays recursively
→Divide and conquer solution

17
Quicksort : Divide A[p…q] ≤ A[q+1…r]

• Sort an array A[p…r]


• Divide
• Partition the array A into 2 subarrays A[p..q] and A[q+1..r], such that each element of
A[p..q] is smaller than or equal to each element in A[q+1..r]
• Need to find index q to partition the array

18
Quicksort :Conquer and Combine
A[p…q] ≤ A[q+1…r]

• Conquer
• Recursively sort A[p..q] and A[q+1..r] using Quicksort
• Combine
• Trivial: the arrays are sorted in place
• No additional work is required to combine them
• The entire array is now sorted

19
Quicksort: Pseudocode
// lo:lower index,hi: higher index
Algorithm quicksort(A, lo, hi)
if lo < hi then
p  partition(A, lo, hi)
quicksort(A, lo, p – 1)
quicksort(A, p + 1, hi)
Partitioning : Illustration

n=16

n=7 n=8 height=log216


=4

n=3 n=3 n=3 n=4

n=1 n=1 n=1 n=1 n=1 n=1 n=1 n=2

n=1
Worst-Possible Partitioning
What will be the worst partitioning ? There are Two cost
factors:
• The partitioning cost for n items (+ a smaller number of
exchanges, which may be ignored)
• The cost for recursively sorting the remaining n−1 items.
A simple argumentation : We are selecting the first element as
pivot and the pivot divides the list of size n into two sublists of
sizes 0 and n-1
→Pivot is always smallest element
The number of key comparisons :
T(n) = n-1 + n-2 + ... + 1 Remark: If you are not careful enough when
determining the pivot value,
2
= n /2 – n/2 then the complexity of Quick Sort grows from
= O(n2) O(nlogn) to O(n2) quickly!!!
Worst-Case Analysis: Recurrence
• What will be the worst case?
• The pivot is the smallest element, all the time
T(0) = T(1) = 0 (base case)
T(N) = N + T(N-1)
T(N-1) = (N-1) + T(N-2) (Substitute down)

T(N-2) = (N-2) + T(N-3)


...
Remark: As shown here, If you are not careful
T(3) = 3 + T(2) enough when determining the pivot value,
T(2) = 2 + T(1) then the complexity of Quick Sort grows from
O(nlogn) to O(n2) quickly!!!
T(1) = 0
T(N) = N + (N-1) + (N-2) ... + 3 + 2
=O (N2)
Worst Case : Recursion Tree
• Worst-case partitioning

• One region has one element and the other has n – 1 elements

• Maximally unbalanced n n
1 n-1 n
1 n-2 n-1
n 1 n-3 n-2

1
2 3
1 1 + 2

(n2)
Total number of comparisons=

24
Best-case Analysis
• What will be the best case?
• Partition is perfectly balanced.
• Pivot is always in the middle (median of the array)
• Thus, the recurrence relation in this case is the same as the
recurrence of merge sort.
T(1) =1
T(n) = 2T(n/2) + n
The solution is :
T(n) = n + nlogn
= O(nlogn)
Best Case: Recursion Tree
• Best-case partitioning
• Partitioning produces two regions of size n/2

Sum=
#3 Divide and Conquer: Binary Search
• Binary Search is also a divide and conquer algorithm :
• Divide: Split the list around the mid point
• Conquer: Recursively Search in each half
• Combine: Each time remove half of the list from search
• The complexity of Binary Search is O(logn)
#4 Binary Tree Algorithms: Traversals
Binary tree is a divide-and-conquer ready data structure by the very definition.
“Any node n of a binary tree B defines a binary tree Bn”
Classic traversals : preorder, inorder, postorder
These are Divide and Conquer methods.Example:
Algorithm Inorder(T)
if T  
Inorder(Tleft)
process(root of T)
Inorder(Tright)
→Traversal moves down by splitting the subtrees.
Complexity : Θ(n)

32
Binary Tree Algorithms: Height of Binary Tree

• The height of a binary tree T can be defined recursively as:


• If T is empty, its height is 0.
• If T is non-empty tree, then since T is of the form :
r

TL TR

→height of T is 1 greater than height of its root’s taller subtree:


height(T) = 1 + max{height(TL),height(TR)}
Complexity: Θ(n)

11/9/2023 33
Height of Binary Tree: Divide and Conquer
//Returns the height h of binary tree T
Algorithm Height( T )
If T  
hleft  height( leftSubtree T)
hright  height( rightSubtree T)
h  1 + max( hleft , hright)
return h
#5 Closest Pair Of Points
• Given n points in 2D, find the pair of points that are closest.
Applications

• We plan to drill holes in a metal sheet.


• If the holes are too close, the sheet will tear during drilling.
• Verify that no two holes are closer than a threshold distance
(e.g., holes are at least 1 inch apart).
Air Traffic Control

• 3D -- Locations of airplanes flying in the neighborhood of a busy airport are known.


• To avoid crash,make sure that no two planes get closer than a given threshold distance.
Divide-And-Conquer Solution
• When n is small, use brute force solution :O(n2)
• Poblem starts when n is large
• Divide the point set into two roughly equal parts A and B.
• Conquer
• Determine the closest pair of points in A.
• Determine the closest pair of points in B.
• Combine : Determine the closest pair of points such that one
point is in A and the other in B.
• From the three closest pairs computed, select the one with
least distance.
Closest pair in the plane
• Divide and conquer approach:
• split point set in equal sized left and right sets

• find closest pair in left, right, across middle

39
Closest pair in the plane
• Find closest pair distances in A and B as : d1 and d2

d1

d2

A B
Closest pair in the plane
Find closest pair distances in A and B as : d1 and d2

d1

d2

A B

Let d = min {d1, d2}. Is d the minimum distance? Not necessarily.


The other possibility?
There may be a pair with one point in A, the other in B and their distance < d?
Closest pair in the plane
Candidates must lie within d of the dividing line. Call this region M
M includes left and right parts: RA and RB .

A B
RA RB
We have to limit the search to the points in the strip M since the distance will
be > d for all pairs outside this region.
Example

A B
RA RB
• Let p be a point in RA.
• p need be paired only with those points in RB that are at most d
apart.
(Distance to all other points will be >d )
Example

p 2d
d

A B
RA RB
• Points that are to be paired with p are in a d x 2d rectangle of RB
(Search region of p for a matching point in RB).
Closest pair in the plane: Algorithm
Closest-Pair(P: set of n points in the plane)
sort by x coordinate and split equally into L and R subsets
(p,q) = Closest-Pair(L)
(r,s) = Closest-Pair(R)
d = min (distance(p , q), distance(r , s))
scan p by x coordinate to find M : points within d of midline
sort M by y coordinate.
compute closest pair among all pairs in M
return best among (this pair, (p,q), (r,s) )

46
Time Complexity
A simplified argumentation:
• Let T(n) be the time to find the closest pair (excluding the
time to create the two sorted lists).
• Simple case : T(n) = c, n < 4, where c is a constant.
• When n >= 4:
Separation can be done in O(n). So that ,the recurrence is
T(n) = T((n/2)) + T((n/2)) + O(n)
• To solve the recurrence, assume n is a power of 2 and use
repeated substitution.
T(n) = O(n log n)+ O(n)
=O(n log n)
Divide and Conquer:Performance Summary
✦ The divide and conquer strategy often reduces the number of iterations
of the main loop from n to log2 n
❖ binary search:
❖ merge sort:
❖ QuickSort:

✦ It may not look like much, but the reduction


in the number of iterations is significant for
larger problems.

You might also like