Chapter 9

Exercise 9.1-1

Available in the latest revision of the IM.

Exercise 9.1-2

Available in the latest revision of the IM.

Exercise 9.1-3

The minimum number of races it takes to determine the fastest three horses out of 25 is 7. Here is the procedure.

1

Determine the fastest horse in each group

Organize 5 races to know the fastest horse in each group.

2

Determine the fastest horse overall

Organize the 6th race to see which horse is the fastest overall. This is one of the three we are looking for.

3

Determine the other two horses

Using the result of the previous race we can select candidates for the final race. The forth and fifth placed horse, together with their groups, can be immediately eliminated. They cannot be candidates for the second and third place. Furthermore, the rest of the horses from a group of the third placed horse can be excluded, too. We need to take 2 horses from the winner's group and 1 horse from the group of the second placed horse. Now, we have 5 horses for the 7th race. The first and second horse from this race are the additional two we are looking for.

Exercise 9.1-4

Let AA represent the set of numbers which are potentially the minimum and let BB denote the set of numbers which are potentially the maximum. Initially, all nn numbers are potentially either the minimum or maximum, so A=B=n|A|=|B|=n. There are two types of comparisons:

  1. Between two numbers that are members of both sets.

  2. Between two numbers from the same set.

The first type of comparison reduces the size of both AA and BB by one. The reason is that a smaller of the two numbers cannot anymore be a member of BB and the larger of the two numbers cannot anymore remain in AA. The second type of comparison only reduces the matching set by one without having any impact on the other. So, to attain the lower bound we must leverage the first type of comparison as much as possible.

As with proving the upper bound, we process elements in pairs. We can form n/2\lfloor n/2 \rfloor pairs, so after the first stage A=B=n/2|A|=|B|=\lceil n/2 \rceil. Observe that these sets can have at most one element in common, which happens when nn is odd. At any rate, the minimum must be searched among members of AA and the maximum among those from BB. We already know the lower bound on the amount of comparisons needed, which is m1m-1 for a set of mm elements. This is where we can only use the second type of comparison (see above).

The total number of comparisons required is

n/2+2(n/21)=n+n/22=3n/22\lfloor n/2 \rfloor+2(\lceil n/2 \rceil-1)=n+\lceil n/2 \rceil-2=\lceil 3n/2 \rceil-2

Exercise 9.2-1

Available in the latest revision of the IM.

Exercise 9.2-2

Available in the latest revision of the IM.

Exercise 9.2-3

In each partitioning the maximum of the current subarray should be selected as a pivot. For example, the first iteration should choose 9, the second 8, and so on. The sequence stops when the last subarray becomes [0].

Exercise 9.2-4

Available in the latest revision of the IM.

Exercise 9.3-1

Available in the latest revision of the IM.

Exercise 9.3-2

Let n=rp+1n=r-p+1, thus g=n/5n/5g=\lfloor n/5 \rfloor \le n/5. The subarray A[5g+1:r]A[5g+1:r] may contain at most 4 elements, that should be added to both sides of a partition. The recurrence becomes

T(n)T(n/5)+T(7n/10+4)+Θ(n)T(n) \le T(n/5)+T(7n/10 + 4)+\Theta(n)

The driving function satisfies the polynomial-growth condition, so according to the Akra-Bazzi theorem, replacing T(7n/10)T(7n/10) with T(7n/10+4)T(7n/10+4), where 4=O(n/lg1+ϵn)4=O(n/\lg^{1+\epsilon}n) for some constant ϵ>0\epsilon>0 and sufficiently large nn, leaves the asymptotic solution unaffected. Therefore, we still have Θ(n)\Theta(n) running time.

Exercise 9.3-3

Available in the latest revision of the IM.

Exercise 9.3-4

We apply the decision tree model to prove the statement from the book. In the decision tree model:

  • Each internal node represents a comparison between two elements.

  • Each leaf corresponds to a conclusion reached by the algorithm after a sequence of comparisons.

  • For the algorithm to correctly identify the iith smallest element xx, every input that leads to a leaf where xx is output must have xx as the iith smallest element.

Assume the algorithm reaches a leaf where it outputs xx as the iith smallest element. Suppose, for the sake of contradiction, that there exists an element yxy \neq x such that the relation between xx and yy is not determined, either directly or via transitive inference, by the comparisons made along the path to that leaf. Then, there exist two inputs sharing the same path toward xx:

  • In one y<xy<x

  • In the other y>xy>x

But this is a contradiction. If y<xy<x, then the iith smallest element is yy given that xx is the iith smallest element when y>xy>x. Hence, the relation between xx and every other element yy must be determined by the comparisons already made. No need for performing any additional comparisons.

Exercise 9.3-5

You can read the solution here.

Exercise 9.3-6

Available in the latest revision of the IM.

Exercise 9.3-7

Available in the latest revision of the IM.

Here is a simple proof, without any mathematics as in the IM, that the median of the yy-coordinates minimizes the total spur length. Draw a line of the main pipeline on this median yy-coordinate. Observe that the xx-coordinates have no significance on the result. Form pairs of wells by aligning them on their xx-coordinates (move wells horizontally as needed) such that one is above or at the main pipeline, and the other one is below or at the main pipeline. This is possible, since the main pipeline goes through the median of the yy-coordinates. The optimal total spur length is simply the sum of lengths of segments formed by previous pairs of wells. Moving the main pipeline above or below of any segment would increase the total length. Therefore, the main pipeline must intersect (touch) each segment. If nn is odd, then it will go through one single well with the median yy-coordinate.

Exercise 9.3-8

Available in the latest revision of the IM.

Exercise 9.3-9

Available in the latest revision of the IM.

Exercise 9.3-10

Available in the latest revision of the IM.

More Generic LeetCode Example

Below is the solution in C++ for the problem associated with this exercise.

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        // The median must be either in nums1 or nums2.
        double median = findMedianSortedArrays(nums1, nums2, 0, nums1.size() - 1);
        if (isnan(median))
            median = findMedianSortedArrays(nums2, nums1, 0, nums2.size() - 1);
        return median;
    }

private:
    double findMedianSortedArrays(vector<int>& a, vector<int>& b, int low, int high) {
        const int m = a.size();
        const int n = b.size();
        const bool isEven = ((m + n) & 1) == 0;
        const int half = (m + n) >> 1;

        if (n == 0)
            return isEven ? (a[half - 1] + a[half]) / 2.0 : a[half];

        // Use binary search over A to find the median, if possible.
        while (low <= high) {        
            // a[k] is the so-called lower median.
            const int k = (low + high) >> 1;
            // Number of elements in A left of the median.
            int left = k + int(isEven);
            // Index into B immediately left of the median.
            const int q = half - left - 1;
                        
            if (left == half and a[k] <= b.front() or 
                    q >= 0 and q < n and b[q] <= a[k] and (q == n - 1 or a[k] <= b[q + 1]))
                if (isEven) {
                    const double neighborA = (k < m - 1) ? a[k + 1] : INFINITY;
                    const double neighborB = (q < n - 1) ? b[q + 1] : INFINITY;
                    return (a[k] + min(neighborA, neighborB)) / 2.0;
                } else
                    return a[k];
        
            if (q < 0 or q < n - 1 and a[k] > b[q + 1])
                high = k - 1;
            else
                low = k + 1;
        }

        return NAN;
    }
};

Problem 9-1

Available in the latest revision of the IM.

Problem 9-2

Available in the latest revision of the IM.

Problem 9-3

Available in the latest revision of the IM.

Problem 9-4

Available in the latest revision of the IM.

The idea in part (a) is essentially simple, as depicted in the following example with array [5,2,7,6,1,9,3,8,4,0], n=10n=10 and i=2i=2. The mappings substitute the need to simultaneously apply reorderings in the section containing larger elements from pairwise comparisons (as instructed in the solution from the IM). Such cascading updates are difficult to implement.

Level 1: Recursive case
Splitting: 5 2 7 6 1 9 3 8 4 0 -> 9 3 8 6 1 | 5 2 7 4 0
Mappings: (5,9), (2,3), (7,8), (4,6), (0,1)

    Level 2: Recursive case
    Splitting: 5 2 7 4 0 -> 7 4 | 5 2 0
    Mappings: (5,7), (2,4), (0,0)
	
	Level 3: Base case
	Select({5,2,0}, i=2) -> {0,2}
	
    Select({0, 2, 4}, i=2) -> {0,2}
	
Select({0,2,3,1}, i=2) -> {0,1}
Return: 1

Problem 9-5

Available in the latest revision of the IM.

Problem 9-6

a.

We follow the template from the book for k=5k=5. The number gg of groups is at most n/kn/k. There are at least k/2(g/2+1)k/2g/2\lceil k/2 \rceil(\lfloor g/2 \rfloor +1) \ge \lceil k/2 \rceil g/2 elements greater than or equal to the pivot, and at least k/2g/2k/2g/2\lceil k/2 \rceil \lceil g/2 \rceil \ge \lceil k/2 \rceil g/2 elements less than or equal to the pivot. That leaves at most

kgk/2g/2nk/22k=n2kk/22kkg-\lceil k/2 \rceil g/2 \le n-\frac{\lceil k/2 \rceil}{2k}=n \cdot \frac{2k-\lceil k/2 \rceil}{2k}

elements in the recursive call. The recurrence becomes

T(n)T(n/k)+T(n2kk/22k)+O(n)T(n) \le T(n/k) + T\left(n \cdot \frac{2k-\lceil k/2 \rceil}{2k}\right)+O(n)

Since kk is odd, then k/2=(k+1)/2\lceil k/2 \rceil=(k+1)/2. We have

T(n)T(n/k)+T(n4k(k+1)4k)+O(n)=T(n/k)+T(n3k14k)+O(n)\begin{align*} T(n) &\le T(n/k) + T\left(n \cdot \frac{4k-(k+1)}{4k}\right)+O(n) \\ &= T(n/k) + T\left(n \cdot \frac{3k-1}{4k}\right)+O(n) \end{align*}

We prove that T(n)cnT(n)\le cn using the substitution method for some constant c>0c>0 and n>1n>1.

T(n)c(n/k)+cn3k14k+O(n)=cn4+3k14k+O(n)=cn3k+34k+O(n)=cncn(13k+34k)+O(n)(k>3    3k+34k<1)cn\begin{align*} T(n) &\le c(n/k) + cn \cdot \frac{3k-1}{4k}+O(n) \\ &=cn \cdot \frac{4+3k-1}{4k}+O(n) \\ &=cn \cdot \frac{3k+3}{4k}+O(n) \\ &=cn-cn\left(1- \frac{3k+3}{4k}\right)+O(n) && \text{($k>3 \implies \cfrac{3k+3}{4k} < 1$)} \\ &\le cn \end{align*}

We should choose cc to dominate the constant hidden in the O(n)O(n). Therefore, T(n)=O(n)T(n)=O(n).

b.

When k=3k=3 the recurrence becomes T(n)T(n/3)+T(2n/3)+O(n)T(n) \le T(n/3)+T(2n/3)+O(n), which evidently resolves to T(n)=O(nlgn)T(n)=O(n\lg n) using the Akra-Bazzi method with p=1p=1 and a trivial driving function f(n)=nf(n)=n.

c.

Read the section 3 about the repeated step algorithm in the attached PDF document (download from here on October 2025). It contains both a visual representation of what is going on, explanation how it differs from grouping by 9, and contains an analysis of the running time (important for part (d)).

407KB
Open

I highly recommend you to read the full paper. It contains many interesting ideas and variants of the SELECT algorithm not mentioned in the book.

d.

See part (c).

Last updated