第4章 分治策略

4.1 最大子数组问题

4.1-1 

当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回一个最大的负数。

4.1-2

暴力求解最大子数组问题的伪代码: 

VIOLENTLY-FIND-MAXIMUM-SUBARRAY(A, low, high)
    if high == low
        return (low, high, A[low])
    else
        max-sum = -∞
        for i = low to high
            sum = 0
            for j = i to high
                sum = sum + A[j]
                if sum > max-sum
                    max-sum = sum
                    max-left = i
                    max-right = j
        return (max-left, max-right, max-sum)

 4.1-3

用C++实现最大子数组的暴力算法: 

#include <iostream>
#include <random>
#include <ctime>

int violently_find_maximum_subarray(int[], int*, int*);

using namespace std;

int main() {
    int test[20];
    int low = 0, high = 19, max_sum;
    uniform_int_distribution<int> u(-10, 10);
    default_random_engine e(time(0));
    for (size_t i = 0; i < 20; i++)
    {
	test[i] = u(e);
	cout << test[i] << " ";
    }
    cout << endl;

    max_sum = violently_find_maximum_subarray(test, &low, &high);

    cout << "最大子数组和为:" << max_sum << endl;
    for (size_t i = low; i < high + 1; i++)
    {
	cout << test[i] << " ";
    }
    cout << endl;

    system("pause");
    return 0;
}

int violently_find_maximum_subarray(int test[], int *low, int *high)
{
    int left = *low, right = *high;
    if (left == right)
    {
    	return test[left];
    }
    else
    {
	int max_left, max_right, max_sum = test[left];
	for (size_t i = left; i < right + 1; i++)
	{
	    int sum = 0;
       	    for (size_t j = i; j < right + 1; j++)
	    {
		sum += test[j];
		if (sum > max_sum)
		{
	            max_sum = sum;
		    max_left = i;
		    max_right = j;
		}
    	    }
	}
	*low = max_left;
	*high = max_right;
	return max_sum;
    }
}

用C++实现最大子数组问题的递归算法: 

#include <iostream>
#include <random>
#include <ctime>

int recursively_find_maximum_subarray(int[], int*, int*);

using namespace std;

int main() {
    int test[20];
    int low = 0, high = 19, max_sum;
    uniform_int_distribution<int> u(-10, 10);
    default_random_engine e(time(0));
    for (size_t i = 0; i < 20; i++)
    {
	test[i] = u(e);
	cout << test[i] << " ";
    }
    cout << endl;

    max_sum = recursively_find_maximum_subarray(test, &low, &high);

    cout << "最大子数组和为:" << max_sum << endl;
    for (size_t i = low; i < high + 1; i++)
    {
	cout << test[i] << " ";
    }
    cout << endl;

    system("pause");
    return 0;
}

int find_max_crossing_subarray(int sub[], int *low, int mid, int *high) {
    int left = *low, right = *high;
    int max_left = mid, left_sum = sub[mid];
    int sum = 0;
    for (int i = mid; i >= left; i--)
    {
	sum += sub[i];
	if (sum > left_sum)
	{
	    left_sum = sum;
	    max_left = i;
	}
    }
    int max_right = mid + 1, right_sum = sub[mid + 1];
    sum = 0;
    for (int i = mid + 1; i <= right; i++)
    {
	sum += sub[i];
	if (sum > right_sum)
	{
	    right_sum = sum;
	    max_right = i;
	}
    }
    *low = max_left;
    *high = max_right;
    return left_sum + right_sum;
}

int recursively_find_maximum_subarray(int test[], int *low, int *high)
{
    int left = *low, right = *high;
    if (left == right)
    {
	return test[left];
    }
    else
    {
	int mid = (left + right) / 2, left_sum, right_sum, cross_sum;
	int left_low = left, left_high = mid;
	int right_low = mid + 1, right_high = right;
	int cross_low = left, cross_high = right;
	left_sum = recursively_find_maximum_subarray(test, &left_low, &left_high);
	right_sum = recursively_find_maximum_subarray(test, &right_low, &right_high);
	cross_sum = find_max_crossing_subarray(test, &cross_low, mid, &cross_high);
	if (left_sum >= right_sum && left_sum >= cross_sum)
	{
	    *low = left_low;
	    *high = left_high;
	    return left_sum;
	}
	else if (right_sum >= left_sum && right_sum >= cross_sum)
	{
	    *low = right_low;
	    *high = right_high;
	    return right_sum;
	}
	else
	{
	    *low = cross_low;
	    *high = cross_high;
	    return cross_sum;
	}
    }
}

4.1-4 

FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high)
    left-sum = 0
    max-left = 0
    sum = 0
    for i = mid downto low
        sum = sum + A[i]
        if sum > left-sum
            left-sum = sum
            max-left = i
    right-sum = 0
    max-right = 0
    sum = 0
    for j = mid + 1 to high
        sum = sum + A[j]
        if sum > right-sum
            right-sum = sum
            max-right = j
    return (max-left, max-right, left-sum + right-sum)

FIND-MAXIMUM-SUBARRAY(A, low, high)
    if high == low
        if A[low] > 0
            return (low, high, A[low])
        else
            return (0, 0, 0)
    else
        mid = ⌊(low + high) / 2⌋
        (left-low, left-high, left-sum) = FIND-MAXIMUM-SUBARRAY(A, low, mid)
        (right-low, right-high, right-sum) = FIND-MAXIMUM-SUBARRAY(A, mid + 1, high)
        (cross-low, cross-high, cross-sum) = FIND-MAX-CROSSING-SUBARRAY(A, low, mid,high)
        if left-sum ≥ right-sum and left-sum ≥ cross-sum
            return (left-low, left-high, left-sum)
        elseif right-sum ≥ left-sum and right-sum ≥ cross-sum
            return (right-low, right-high, right-sum)
        else
            return (cross-low, cross-high, cross-sum)

4.1-5

最大子数组问题非递归的、线性时间的算法: 

FIND-MAXIMUM-SUBARRAY(A, low, high)
    max-left = low
    while A[max-left] <= 0
        max-left = max-left + 1
    max-sum = A[max-left]
    right-sum = 0
    max-right-sum = 0
    max-right-left = max-left
    for i = low + 1 to high
        if A[i] + max-right-sum > max-sum
            max-sum = A[i] + max-right-sum
            max-left = max-right-left + 1
            max-right = i
            right-sum = 0
            max-right-sum = 0
            max-right-left = i
        elseif A[i] + right-sum > 0
            max-sum = max-sum + A[i] + right-sum
            max-right = i
            right-sum = 0
            max-right-sum = 0
            max-right-left = i
        else
            right-sum = right-sum + A[i]
            if max-right-sum <= 0
                max-right-sum = A[i]
                max-right-left = i - 1
            else
                max-right-sum = max-right-sum + A[i]

4.2 矩阵乘法的Strassen算法

4.2-1

步骤1:A_{11}=[1],A_{12}=[3],A_{21}=[7],A_{22}=[5]B_{11}=[6],B_{12}=[8],B_{21}=[4],B_{22}=[2]

步骤2:S_{1}=B_{12}-B_{22}=[6],S_{2}=A_{11}+A_{12}=[4],S_{3}=A_{21}+A_{22}=[12],S_{4}=B_{21}-B_{11}=[-2],S_{5}=A_{11}+A_{22}=[6],S_{6}=B_{11}+B_{22}=[8],S_{7}=A_{12}-A_{22}=[-2],S_{8}=B_{21}+B_{22}=[6],S_{9}=A_{11}-A_{21}=[-6],S_{10}=B_{11}+B_{12}=[14]

步骤3:P_{1}=A_{11}\cdot S_{1}=[6],P_{2}=S_{2}\cdot B_{22}=[8],P_{3}=S_{3}\cdot B_{11}=[72],P_{4}=A_{22}\cdot S_{4}=[-10],P_{5}=S_{5}\cdot S_{6}=[48],P_{6}=S_{7}\cdot S_{8}=[-12],P_{7}=S_{9}\cdot S_{10}=[-84]

步骤4:C_{11}=P_{5}+P_{4}-P_{2}+P_{6}=[18],C_{12}=P_{1}+P_{2}=[14],C_{21}=P_{3}+P_{4}=[62],C_{22}=P_{5}+P_{1}-P_{3}-P_{7}=66

所以:\begin{bmatrix} 1 & 3\\ 7 & 5 \end{bmatrix}\begin{bmatrix} 6 & 8\\ 4 & 2 \end{bmatrix}=\begin{bmatrix} 18 & 14\\ 62 & 66 \end{bmatrix}

4.2-2

STRASSEN-MATRIX-MULTIPLY(A, B)
    n = A.rows
    let C be a new nXn matrix
    if n == 1
        c[1][1] = a[1][1] * b[1][1]
    else partition A, B, and C as in equations(4.9)
        S[1] = B[1][2] - B[2][2]
        S[2] = A[1][1] + A[1][2]
        S[3] = A[2][1] + A[2][2]
        S[4] = B[2][1] - B[1][1]
        S[5] = A[1][1] + A[2][2]
        S[6] = B[1][1] + B[2][2]
        S[7] = A[1][2] - A[2][2]
        S[8] = B[2][1] + B[2][2]
        S[9] = A[1][1] - A[2][1]
        S[10] = B[1][1] + B[1][2]
        P[1] = A[1][1] * S[1]
        P[2] = S[2] * B[2][2]
        P[3] = S[3] * B[1][1]
        P[4] = A[2][2] * S[4]
        P[5] = S[5] * S[6]
        P[6] = S[7] * S[8]
        P[7] = S[9] * S[10]
        C[1][1] = P[5] + P[4] - P[2] + P[6]
        C[1][2] = P[1] + P[2]
        C[2][1] = P[3] + P[4]
        C[2][2] = P[5] + P[1] - P[3] - P[7]
    return C

 4.2-3

添加一些全0的行列把矩阵的行列数补到2的幂,即可使Strassen算法适应矩阵规模n不是2的幂的情况。

证明:根据式(4.18)(描述Strassen算法运行时间T(n)的递归式),利用4.5节的主方法,对某个常数\varepsilon >0,有\Theta (n^2)=O(n^{\log_{2}{7}-\varepsilon }),则T(n)=\Theta (n^{\log_{2}{7}})=\Theta (n^{\lg{7}})

4.2-4

因为可以用k次乘法操作(假定乘法的交换律不成立)完成两个3X3矩阵相乘,所以T(n)=kT(n/3)+\Theta (n^2)。利用4.5节的主方法,比较n^{\log_{3}{k}}n^2的大小:

  • 如果\log_{3}{k}=2,则T(n)=\Theta (n^{2}\lg{n})。此时k=9T(n)=o(n^{\lg{7}})
  • 如果\log_{3}{k}<2,则T(n)=\Theta (n^2)。此时k<9T(n)=o(n^{\lg{7}})
  • 如果\log_{3}{k}>2,则T(n)=\Theta (n^{\log_{3}{k}})。此时k>9且当\log_{3}{k}<\lg{7}T(n)=o(n^{\lg{7}}),即k<3^{\lg{7}}\approx 21.85,所以最大的整数k为21。

所以满足这一条件的最大的k是21。此算法的运行时间是\Theta (n^{\log_{3}{k}})=\Theta (n^{\log_{3}{21}})=O(n^{2.80})(因为\log_{3}{21}\approx 2.77

4.2-5 

根据练习4.2-4,应该选择下面三个数中最小的那个:\log_{68}{132464}\approx 2.795128,\log_{70}{143640}\approx 2.795122,\log_{72}{155424}\approx 2.795147,所以用143640次乘法操作完成70X70的矩阵相乘会得到最佳的渐进运行时间。

4.2-6

用Strassen算法作为子进程来进行一个kn\times n矩阵和一个n\times kn矩阵相乘,最快需要花费\Theta (k^{2}n^{\lg{7}})时间。对两个输入矩阵规模互换后,最快需要花费\Theta (kn^{\lg{7}})时间。 

4.2-7

plural_multiple(a, b, c, d)
    A = (a + b)(c + d)
    B = ac
    C = bd
    return B - C, A - B - C

4.3 用代入法求解递归式

4.3-1

证明:对某个恰当选出的常数c> 0,假定T(n)\leqslant cn^{2}对所有正数m<n都成立,特别是对于m=n-1,有T(n-1)\leqslant c(n-1)^{2}。将其代入递归式,得到T(n)\leqslant c(n-1)^{2}+n=cn^{2}-(2c-1)n+c\leqslant cn^{2}。其中,只要c\geqslant 1,最后一步都会成立。

4.3-2

证明:对某个恰当选出的常数c> 0,假定T(n)\leqslant c\lg{(n-2)}对所有正数m<n都成立,特别是对于m=\left \lceil n/2 \right \rceil,有T(\left \lceil n/2 \right \rceil)\leqslant c\lg{(\left \lceil n/2 \right \rceil-2)}。将其代入递归式,得到T(n)\leqslant c\lg{(\left \lceil n/2 \right \rceil-2)}+1\leqslant c\lg{(n/2+1-2)}+1=c\lg{(n-2)}-c\lg{2}+1\leqslant c\lg{(n-2)}。其中,只要c\geqslant 1,最后一步都会成立。

4.3-3 

证明:对某个恰当选出的常数c> 0,假定T(n)\geqslant c(n+2)\lg{(n+2)}对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\geqslant c(\left \lfloor n/2 \right \rfloor+2)\lg{(\left \lfloor n/2 \right \rfloor+2)}\geqslant c(n/2-1+2)\lg{(n/2-1+2)}。将其代入递归式,得到T(n)\geqslant 2c(\left \lfloor n/2 \right \rfloor+2)\lg{(\left \lfloor n/2 \right \rfloor+2)}+n\geqslant 2c(n/2-1+2)\lg{(n/2-1+2)}+n=c(n+2)\lg{(n+2)}-c(n+2)\lg{2}+n\geqslant c(n+2)\lg{(n+2)}+(1-c)n-2c\geqslant c(n+2)\lg{(n+2)}。其中,只要0<c<1,最后一步都会成立。

所以:递归式T(n)=2T(\left \lfloor n/2 \right \rfloor)+n的解为\Theta (n\lg{n})

4.3-4

证明:对某个恰当选出的常数c> 0,假定T(n)\leqslant cn\lg{n}+n对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\leqslant c\left \lfloor n/2 \right \rfloor\lg{(\left \lfloor n/2 \right \rfloor)}+\left \lfloor n/2 \right \rfloor。将其代入递归式,得到T(n)\leqslant 2c\left \lfloor n/2 \right \rfloor\lg{(\left \lfloor n/2 \right \rfloor)}+2\left \lfloor n/2 \right \rfloor+n\leqslant cn\lg{(n/2)}+2n=cn\lg{n}-cn\lg{2}+2n\leqslant cn\lg{n}+(2-c)n\leqslant cn\lg{n}。其中,只要c\geqslant 1,最后一步都会成立。此时,边界条件T(1)\leqslant c1\lg{1}+1=1成立。

4.3-5

证明:

  • 对某个恰当选出的常数c>0,假定T(n)\leqslant c(n-2)\lg{(n-2)}对所有正数m<n都成立,特别是对于m=\left \lceil n/2 \right \rceil,有T(\left \lceil n/2 \right \rceil)\leqslant c(\left \lceil n/2 \right \rceil-2)\lg{(\left \lceil n/2 \right \rceil-2)},以及对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\leqslant c(\left \lfloor n/2 \right \rfloor-2)\lg{(\left \lfloor n/2 \right \rfloor-2)}。将其代入递归式,得到T(n)\leqslant c(\left \lceil n/2 \right \rceil-2)\lg{(\left \lceil n/2 \right \rceil-2)}+c(\left \lfloor n/2 \right \rfloor-2)\lg{(\left \lfloor n/2 \right \rfloor-2)}+dn\leqslant c(n/2+1-2)\lg{(n/2+1-2)}+c(n/2-2)\lg{(n/2-2)}+dn\leqslant 2c(n/2-1)\lg{(n/2-1)}+dn\leqslant c(n-2)\lg{(n-2)}+(d-c)n+2c\leqslantc(n-2)\lg{(n-2)}。其中,只要c>d,n>2c,最后一步都会成立。所以:递归式T(n)=O(cn\lg{n})
  • 对某个恰当选出的常数c>0,假定T(n)\geqslant c(n+2)\lg{(n+2)}对所有正数m<n都成立,特别是对于m=\left \lceil n/2 \right \rceil,有T(\left \lceil n/2 \right \rceil)\geqslant c(\left \lceil n/2 \right \rceil+2)\lg{(\left \lceil n/2 \right \rceil+2)},以及对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\geqslant c(\left \lfloor n/2 \right \rfloor+2)\lg{(\left \lfloor n/2 \right \rfloor+2)}。将其代入递归式,得到T(n)\geqslant c(\left \lceil n/2 \right \rceil+2)\lg{(\left \lceil n/2 \right \rceil+2)}+c(\left \lfloor n/2 \right \rfloor+2)\lg{(\left \lfloor n/2 \right \rfloor+2)}+dn\geqslant c(n/2+2)\lg{(n/2+2)}+c(n/2-1+2)\lg{(n/2-1+2)}+dn\geqslant 2c(n/2+1)\lg{(n/2+1)}+dn\geqslant c(n+2)\lg{(n+2)}+(d-c)n+2c\geqslantc(n+2)\lg{(n+2)}。其中,只要c<d,n>2c,最后一步都会成立。所以:递归式T(n)=\Omega (cn\lg{n})

所以:归并排序的“严格”递归式(4.3)的解为\Theta (n\lg{n})。 

4.3-6

证明:对某个恰当选出的常数c>0,假定存在常数a使得T(n)\leqslant c(n-a)\lg{(n-a)}对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor+17,有T(\left \lfloor n/2 \right \rfloor+17)\leqslant c(\left \lfloor n/2 \right \rfloor+17-a)\lg{(\left \lfloor n/2 \right \rfloor+17-a)}。将其代入递归式,得到T(n)\leqslant 2c(\left \lfloor n/2 \right \rfloor+17-a)\lg{(\left \lfloor n/2 \right \rfloor+17-a)}+n\leqslant 2c(n/2+17-a)\lg{(n/2+17-a)}+n\leqslant c(n+34-2a)\lg{(n+34-2a)}+n\leqslant c(n-a)\lg{(n-a)}。其中,只要c>1,n\geqslant 2a-34,a\geqslant 34,最后一步都会成立,所以:T(n)=2T(\left \lfloor n/2 \right \rfloor+17)+n的解为O(n\lg{n})

4.3-7

  1. 对某个恰当选出的常数c>0,假定T(n)\leqslant cn^{\log_{3}{4}}对所有正数m<n都成立,特别是对于m=n/3,有T(n/3)\leqslant c(n/3)^{\log_{3}{4}}=(cn^{\log_{3}{4}})/4。将其代入递归式,得到T(n)\leqslant 4\cdot (cn^{\log_{3}{4}})/4+n=cn^{\log_{3}{4}}+n。这并不意味着对任意c都有T(n)\leqslant cn^{\log_{3}{4}}
  2. 对某个恰当选出的常数c>0,假定T(n)\leqslant cn^{\log_{3}{4}}-3n对所有正数m<n都成立,特别是对于m=n/3,有T(n/3)\leqslant c(n/3)^{\log_{3}{4}}-3\cdot n/3=(cn^{\log_{3}{4}})/4-n。将其代入递归式,得到T(n)\leqslant 4\cdot (cn^{\log_{3}{4}})/4-4n+n=cn^{\log_{3}{4}}-3n。其中,只要c>0,最后一步都会成立,得证。

4.3-8

  1. 对某个恰当选出的常数c>0,假定T(n)\leqslant cn^2对所有正数m<n都成立,特别是对于m=n/2,有T(n/2)\leqslant cn^{2}/4。将其代入递归式,得到T(n)\leqslant 4\cdot cn^{2}/4+n=cn^{2}+n。这并不意味着对任意c都有T(n)\leqslant cn^{2}
  2. 对某个恰当选出的常数c>0,假定T(n)\leqslant cn^2-n对所有正数m<n都成立,特别是对于m=n/2,有T(n/2)\leqslant cn^{2}/4-n/2。将其代入递归式,得到T(n)\leqslant 4\cdot cn^{2}/4-4\cdot n/2+n=cn^{2}-n。其中,只要c>0,最后一步都会成立,得证。

4.3-9

m=\lg{n},得到T(2^{m})=3T(2^{m/2})+m。现在重命名S(m)=T(2^{m}),得到新的递归式:S(m)=3S(m/2)+m。利用4.5节的主方法,得到S(m)=\Theta (m^{\log_{2}{3}})。再从S(m)转换回T(n),得到T(n)=T(2^{m})=S(m)=\Theta (m^{\log_{2}{3}})=\Theta (\lg^{\log_{2}{3}}{n})

4.4 用递归树方法求解递归式

4.4-1

T(n)=\sum _{i=0}^{\log_{2}{n}-1}{(\frac{3}{2})^{i}cn}+\Theta (n^{\log_{2}{3}})=\frac{1-(\frac{3}{2})^{\log_{2}{n}}}{1-\frac{3}{2}}cn+\Theta (n^{\log_{2}{3}})=n\Theta (n^{\log_{2}{3}-1})+\Theta (n^{\log_{2}{3}})=\Theta (n^{\log_{2}{3}})

对某个恰当选出的常数c>0,假定T(n)\leqslant cn^{\log_{2}{3}}-2n对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\leqslant c(\left \lfloor n/2 \right \rfloor)^{\log_{2}{3}}-2\left \lfloor n/2 \right \rfloor。将其代入递归式,得到T(n)\leqslant 3c(\left \lfloor n/2 \right \rfloor)^{\log_{2}{3}}-3\cdot 2\left \lfloor n/2 \right \rfloor+n\leqslant 3c(n/2)^{\log_{2}{3}}-3\cdot 2n/2+n=3c\frac{n^{\log_{2}{3}}}{2^{\log_{2}{3}}}-2n=cn^{\log_{2}{3}}-2n。所以:递归式T(n)=\Theta (n^{\log_{2}{3}})

4.4-2

T(n)=\sum _{i=0}^{\log_{2}{n}-1}(\frac{1}{4})^in^{2}+1<n^{2}\sum _{i=0}^{\infty }(\frac{1}{4})^{i}+1=n^{2}\frac{1}{1-1/4}+1=\Theta (n^{2})

对某个恰当选出的常数c>0,假定T(n)\leqslant cn^{2}对所有正数m<n都成立,特别是对于m=n/2,有T(n/2)\leqslant c(n/2)^{2}。将其代入递归式,得到T(n)\leqslant c(n/2)^{2}+n=(c/4+1)n^{2}\leqslant cn^{2}。其中,只要c\geqslant \frac{4}{3},最后一步都会成立,所以:递归式T(n)=\Theta (n^{2})

4.4-3

T(n)=\sum _{i=0}^{\lg{n}-1}{(2^{i}n+2^{1-i})}+\Theta (n^{2})=\frac{2^{\lg{n}}-1}{2-1}+2\sum _{i=0}^{\lg{n}-1}({\frac{1}{2}})^{i}+\Theta (n^{2})\leqslant n-1+2\sum _{i=0}^{\infty }{(\frac{1}{2})^{i}}+\Theta (n^{2})=n-1+2\frac{1}{1-1/2}+\Theta (n^{2})=\Theta (n^{2})

对某个恰当选出的常数c>0,假定T(n)\leqslant cn^{2}+2n对所有正数m<n都成立。将其代入递归式,得到T(n)\leqslant 4c(n/2)^{2}+2\cdot n/2+n= cn^{2}+2n。所以:递归式T(n)=\Theta (n^{2})

4.4-4

T(n)=\sum _{i=1}^{n}{1}=\Theta (n)

对某个恰当选出的常数c>0,假定T(n)\leqslant cn对所有正数m<n都成立,特别是对于m=n-1,有T(n-1)\leqslant c(n-1)。将其代入递归式,得到T(n)\leqslant c(n-1)+1=cn+1-c\leqslant cn。其中,只要c\geqslant 1,最后一步都会成立,所以:递归式T(n)=\Theta (n)

4.4-5

对某个恰当选出的常数c>0,假定T(n)\leqslant c2^{n}-4n对所有正数m<n都成立,特别是对于m=n-1,有T(n-1)\leqslant c2^{n-1}-4(n-1),以及对于m=n/2,有T(n/2)\leqslant c2^{n/2}-4(n/2)。将其代入递归式,得到T(n)\leqslant c2^{n-1}-4(n-1)+c2^{n/2}-4(n/2)+n=c(2^{n-1}+2^{n/2})-5n+4\leqslant c2^{n}-4n。其中,只要n\geqslant 4,最后一步都会成立,所以:递归式T(n)=O(2^{n})

4.4-6

在递归树中具有最小深度的叶节点的深度为\log_{3}{n},前\log_{3}{n}层每层的代价为cn,所以递归式T(n)大于等于cn\log_{3}{n},即T(n)=\Omega (n\lg{n})

4.4-7

T(n)=\sum _{i=0}^{\log_{2}{n}-1}{2^{i}cn}+\Theta (n^{2})=cn(n-1)+\Theta (n^{2})=\Theta (n^{2})

  • 对某个恰当选出的常数d>0,假定T(n)\leqslant dn^{2}-cn对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\leqslant d(\left \lfloor n/2 \right \rfloor)^{2}-c(\left \lfloor n/2 \right \rfloor)。将其代入递归式,得到T(n)\leqslant 4d(\left \lfloor n/2 \right \rfloor)^{2}-4c(\left \lfloor n/2 \right \rfloor)+cn\leqslant 4d(n/2)^{2}-4c(n/2)+cn=dn^{2}-cn。所以:递归式T(n)=O(n^{2})
  • 对某个恰当选出的常数d>0,假定T(n)\geqslant d(n+2)^{2}-cn对所有正数m<n都成立,特别是对于m=\left \lfloor n/2 \right \rfloor,有T(\left \lfloor n/2 \right \rfloor)\geqslant d(\left \lfloor n/2 \right \rfloor+2)^{2}-c\left \lfloor n/2 \right \rfloor。将其代入递归式,得到T(n)\geqslant 4d(\left \lfloor n/2 \right \rfloor+2)^{2}-4c\left \lfloor n/2 \right \rfloor+cn\geqslant 4d(n/2+1)^{2}-4c(n/2)+cn=d(n+2)^{2}-cn。所以:递归式T(n)=\Omega (n^{2})

4.4-8

T(n)=\sum _{i=o}^{n/a}{c(n-ia)}+(n/a)ca=cn^{2}/a-\Theta (n)+\Theta (n)=\Theta (n^{2})

4.4-9

T(n)=\sum _{i=0}^{\log_{1/\alpha }{n}}{cn}+\Theta (n)=cn\log_{1/\alpha }{n}+\Theta (n)=\Theta (n\lg{n})

4.5 用主方法求解递归式

4.5-1

a.a=2,b=4,f(n)=1,因此n^{\log_{b}{a}}=n^{\log_{4}{2}}=n^{1/2}。由于f(n)=O(n^{\log_{b4}{2}-\epsilon }),其中\epsilon =1/2,因此应用情况1,从而得到解T(n)=\Theta (n^{1/2})

b.a=2,b=4,f(n)=\sqrt{n},因此n^{\log_{b}{a}}=n^{\log_{4}{2}}=n^{1/2}。由于f(n)=\Theta (n^{\log_{b}{a}})=\Theta (n^{1/2}),因此应用情况2,从而得到解T(n)=\Theta (n^{1/2}\lg{n})

c.a=2,b=4,f(n)=n,因此n^{\log_{b}{a}}=n^{\log_{4}{2}}=n^{1/2}。由于f(n)=\Omega (n^{\log_{4}{2}+\epsilon }),其中\epsilon =1/2,因此应用情况3,从而得到解T(n)=\Theta (n)

d.a=2,b=4,f(n)=n^{2},因此n^{\log_{b}{a}}=n^{\log_{4}{2}}=n^{1/2}。由于f(n)=\Omega (n^{\log_{4}{2}+\epsilon }),其中\epsilon =3/2,因此应用情况3,从而得到解T(n)=\Theta (n^{2})

4.5-2

  1. 当应用情况3时,应有a<16。此时T(n)=\Theta (n^{2})
  2. 当应用情况2时,应有a=16。此时T(n)=\Theta (n^{2}\lg{n})
  3. 当应用情况1时,同时为渐进快于Strassen算法,应有\log_{4}{a}<\log_{2}{7}即a<49。此时T(n)=\Theta (\log_{4}{a})

综上,a的最大整数值应是48。 

4.5-3

a=1,b=2,f(n)=\Theta (1),因此n^{\log_{b}{a}}=n^{\log_{2}{1}}=n^0=1。由于f(n)=\Theta (\log_{b}{a})=\Theta (1),因此应用情况2,从而得到解T(n)=\Theta (\lg{n})

4.5-4

a=4,b=2,f(n)=n^{2}\lg{n},因此n^{\log_{b}{a}}=n^{\log_{2}{4}}=n^{2}。由于对任意正常数\epsilon,比值f(n)/n^{\log_{b}{a}}=(n^{2}\lg{n})/n^{\log_{b}{a}}=\lg{n}都渐进小于n^{\epsilon }。因此,递归式落入了情况2和情况3之间的间隙,主方法不能应用于此递归式。

4.5-5

T(n)=\sum _{i=0}^{\log_{2}{n}-1}{n^{2}\lg{n/2^{i}}}+\Theta (n^{2})=n^{2}(\sum _{i=0}^{\log_{2}{n}-1}{\lg{n}}-\sum _{i=0}^{\log_{2}{n}-1}{i\lg{2}})+\Theta (n^{2})=n^{2}\frac{\lg{n}(\log_{2}{n}+1)}{2}+\Theta (n^{2})=\Theta (n^{2}\lg^{2}{n})


思考题

4-1

a.a=2,b=2,f(n)=n^{4},因此n^{\log_{b}{a}}=n^{\log_{2}{2}}=n。由于f(n)=\Omega (n^{\log_{2}{2}+\epsilon }),其中\epsilon =3,因此应用情况3,从而得到解T(n)=\Theta (n^{4})

b.a=1,b=10/7,f(n)=n,因此n^{\log_{b}{a}}=n^{\log_{10/7}{1}}=n^{0}=1。由于f(n)=\Omega (n^{\log_{b}{a}+\epsilon }),其中\epsilon =1,因此应用情况3,从而得到解T(n)=\Theta (n)。 

c.a=16,b=4,f(n)=n^{2},因此n^{\log_{b}{a}}=n^{\log_{4}{16}}=n^{2}。由于f(n)=\Theta (n^{\log_{b}{a}})=\Theta (n^{2}),因此应用情况2,从而得到解T(n)=\Theta (n^{2}\lg{n})

d.a=7,b=3,f(n)=n^{2},因此n^{\log_{b}{a}}=n^{\log_{3}{7}}=O(n^{1.78})。由于f(n)=\Omega (n^{\log_{b}{a}+\epsilon }),其中\epsilon \approx 0.22,因此应用情况3,从而得到解T(n)=\Theta (n^{2})。 

e.a=7,b=2,f(n)=n^{2},因此n^{\log_{b}{a}}=n^{\log_{2}{7}}=O(n^{2.81})。由于f(n)=O(n^{\log_{b}{a}-\epsilon }),其中\epsilon \approx 0.81,因此应用情况1,从而得到解T(n)=\Theta (n^{\log_{2}{7}})。 

f.a=2,b=4,f(n)=\sqrt{n},因此n^{\log_{b}{a}}=n^{\log_{4}{2}}=n^{1/2}。由于f(n)=\Theta (n^{\log_{b}{a}})=\Theta (n^{1/2}),因此应用情况2,从而得到解T(n)=\Theta (\sqrt{n}\lg{n})

g.T(n)=\sum _{i=0}^{n/2}{(n-2i)^{2}}=n^{2}\sum _{i=0}^{n/2}{1}+4\sum _{i=0}^{n/2}{i^{2}}-4n\sum _{i=0}^{n/2}{i}=\frac{n^{3}}{2}+\frac{1}{3}(2n^{3}+6n^{2}+4n)-\frac{1}{2}(n^{3}+2n^{2})=\frac{2}{3}n^{3}+n^{2}+\frac{4}{3}n=\Theta (n^{3})

4-2

a.BINARY-SEARCH

  1. T(n)=T(n/2)+\Theta (1)=\Theta (\lg{n})(主方法情况2)。
  2. T(n)=T(n/2)+\Theta (N)=\sum _{i=0}^{\log_{2}{n}-1}{\Theta (N)}=\Theta (N)\log_{2}{n}=\Theta (N\lg{n})
  3. T(n)=T(n/2)+\Theta (n)=\Theta (n)(主方法情况3)。

b.MERGE-SORT

  1. T(n)=2T(n/2)+\Theta (n)=\Theta (n\lg{n})(主方法情况2)。
  2. T(n)=2T(n/2)+\Theta (n)+\Theta (N)=\sum _{i=0}^{\log_{2}{n}-1}{(\Theta (n)+2^{i}\Theta (N))}=\Theta (n)\log_{2}{n}+\Theta (N)(n-1)=\Theta (nN)
  3. T(n)=2T(n/2)+\Theta (n)+\Theta (n)=2T(n/2)+\Theta (n)=\Theta (n\lg{n})(主方法情况2)。

4-3

a.a=4,b=3,f(n)=n\lg{n},因此n^{\log_{b}{a}}=n^{\log_{3}{4}}=O(n^{1.27})。由于f(n)=O(n^{\log_{3}{4}-\epsilon }),其中\epsilon \approx 0.27,因此应用情况1,从而得到解T(n)=\Theta (n^{\log_{3}{4}})

b.T(n)=\sum _{i=0}^{\log_{3}{n}-1}{\frac{n}{\lg{(n/3^{i})}}}+\Theta (n)=n\sum _{i=0}^{\log_{3}{n}-1}{\frac{1}{\lg{n}-i\lg{3}}}+\Theta (n)=\Theta (n\lg{\lg{n}})

c.a=4,b=2,f(n)=n^{2}\sqrt{n},因此n^{\log_{b}{a}}=n^{\log_{2}{4}}=n^{2}。由于f(n)=\Omega (n^{2+\epsilon }),其中\epsilon = 1/2,因此应用情况3,从而得到解T(n)=\Theta (n^{2}\sqrt{n})

d.忽略-2项,则a=3,b=3,f(n)=n/2,因此n^{\log_{b}{a}}=n^{\log_{3}{3}}=n。由于f(n)=\Theta (n^{\log_{b}{a}})=\Theta (n),因此应用情况2,从而得到解T(n)=\Theta (n\lg{n})

e.T(n)=\sum _{i=0}^{\log_{2}{n}-1}{\frac{n}{\lg{(n/2^{i})}}}+\Theta (n)=n\sum _{i=0}^{\log_{2}{n}-1}{\frac{1}{\lg{n}-i\lg{2}}}+\Theta (n)=\Theta (n\lg{\lg{n}})

f.T(n)\geqslant \sum _{i=0}^{\log_{8}{n}-1}{(\frac{7}{8})^{i}n}+\Theta (n^{\log_{8}{3}})=8n\left [ 1-(\frac{7}{8})^{\log_{8}{n}} \right ]+\Theta (n^{\log_{8}{3}}),所以T(n)=\Omega (n)T(n)\leqslant \sum _{i=0}^{\log_{2}{n}-1}{(\frac{7}{8})^{i}n}+\Theta (n^{\log_{2}{3}})=8n\left [ 1-(\frac{7}{8})^{\log_{2}{n}} \right ]+\Theta (n^{\log_{2}{3}}),所以T(n)=O(n)。综上T(n)=\Theta (n)

g.T(n)=\sum _{i=0}^{n-1}{\frac{1}{n-i}}+\Theta (1)=\sum _{i=1}^{n}{\frac{1}{i}}+\Theta (1)=\Theta (\lg{n})

h.T(n)=\sum _{i=0}^{n-1}{\lg{(n-i)}}+\Theta (1)=\sum _{i=1}^{n}{\lg{i}}+\Theta (1)=\lg{n!}+\Theta (1)\leqslant\lg{n^{n}}+\Theta (1)=n\lg{n}+\Theta (1)=\Theta (n\lg{n})

i.T(n)=\sum _{i=0}^{n/2-1}{\frac{1}{\lg{(n-2i)}}}+\Theta (1)=\sum _{i=1}^{n/2}{\frac{1}{\lg{2i}}}+\Theta (1)=\Theta (\lg{\lg{n}})

j.m=\lg{n},得到T(2^{m})=2^{m/2}T(2^{m/2})+2^{m}。现在重命名S(m)=T(2^{m}),得到新的递归式:S(m)=2^{m/2}S(m/2)+2^{m}。令R(m)=\frac{S(m)}{2^{m}},得到新的递归式:R(m)=R(m/2)+1。利用4.5节的主方法,得到R(m)=\Theta (\lg{m}),则S(m)=\Theta (2^{m}\lg{m})。再从S(m)转换回T(n),得到T(n)=T(2^{m})=S(m)=\Theta (2^{m}\lg{m})=\Theta (n\lg{\lg{n}})

4-4

a.证明:z+z\mathcal{F}(z)+z^{2}\mathcal{F}(z)=z+z\sum _{i=0}^{\infty }{F_{i}z^{i}}+z^{2}\sum _{i=0}^{\infty }{F_{i}z^{i}}=z+\sum _{i=1}^{\infty }{F_{i-1}z^{i}}+\sum _{i=2}^{\infty }{F_{i-2}z^{i}}=z+F_{0}z+\sum _{i=2}^{\infty }{(F_{i-1}+F_{i-2})z^{i}}=0+z+\sum _{i=2}^{\infty }{F_{i}z^{i}}=\mathcal{F}(z)

b.证明:

  1. 由a得:\mathcal{F}(z)=z+z\mathcal{F}(z)+z^{2}\mathcal{F}(z)\Rightarrow (1-z-z^{2})\mathcal{F}(z)=z\Rightarrow \mathcal{F}(z)=\frac{z}{1-z-z^{2}}
  2. (1-\phi z)(1-\hat{\phi }z)=(1-\frac{1+\sqrt{5}}{2}z)(1-\frac{1-\sqrt{5}}{2}z)=1-(\frac{1+\sqrt{5}}{2}+\frac{1-\sqrt{5}}{2})z+\frac{1+\sqrt{5}}{2}\cdot \frac{1-\sqrt{5}}{2}z=1-z-z^{2}
  3. \frac{1}{\sqrt{5}}(\frac{1}{1-\phi z}-\frac{1}{1-\hat{\phi }z})=\frac{1}{\sqrt{5}}\cdot \frac{(1-\hat{\phi }z)-(1-\phi z)}{(1-\phi z)(1-\hat{\phi }z)}=\frac{1}{\sqrt{5}}\cdot \frac{(\phi -\hat{\phi })z}{(1-\phi z)(1-\hat{\phi }z)}=\frac{1}{\sqrt{5}}\cdot \frac{(\frac{1+\sqrt{5}}{2} -\frac{1-\sqrt{5}}{2})z}{(1-\phi z)(1-\hat{\phi }z)}=\frac{z}{(1-\phi z)(1-\hat{\phi }z)}

c.证明:因为当\left | x \right |<1时,\frac{1}{1-x}=\sum _{x=0}^{\infty }{x^{k}}。所以\mathcal{F}(z)=\frac{1}{\sqrt{5}}(\frac{1}{1-\phi z}-\frac{1}{1-\hat{\phi }z})=\frac{1}{\sqrt{5}}(\sum _{i=0}^{\infty }{\phi ^{i}z^{i}}-\sum _{i=0}^{\infty }{\hat{\phi }^{i}z^{i}})=\sum _{i=0}^{\infty }{\frac{1}{\sqrt{5}}(\phi ^{i}-\hat{\phi }^{i})z^{i}}

d.证明:由c得:F_{i}=\frac{1}{\sqrt{5}}(\phi ^{i}-\hat{\phi }^{i})=\frac{\phi ^{i}}{\sqrt{5}}-\frac{\hat{\phi }^{i}}{\sqrt{5}}。因为当i>2时,\left | \hat{\phi }^{i} \right |<0.5

4-5

a.证明:令有g(g<n/2)块芯片是好的。在坏芯片中的某g块可以合谋起来,他们将彼此报告成好的,将其余的报告成坏的。因为好的g块芯片也会这么做,这两组芯片在逐对检测操作时的结果是对称的,所以使用任何基于这种逐对检测操作的策略,教授都不能确定哪些芯片是好的。

b.证明:先将芯片分成两组,然后每次从两组中各取一个进行检测。如果测试结果是第一种(两片都是好的,或都是坏的),则从这两块芯片中移除一块,此时移除的那块芯片可能是好的也可能是坏的。如果测试结果不是第一种,则将这两块芯片都移除,此时移除的两块芯片中至少一块是坏的。进行\left \lfloor n/2 \right \rfloor次逐对检测后,至多剩下\left \lceil n/2 \right \rceil块芯片,其中超过一半的芯片是好的,此时已将问题规模减半。

c.证明:T(n)=T(n/2)+\left \lfloor n/2 \right \rfloor。a=1,b=2,f(n)=\left \lfloor n/2 \right \rfloor,因此n^{\log_{b}{a}}=n^{\log_{2}{1}}=n^{0}=1。由于f(n)=\Omega (n^{0+\epsilon }),其中\epsilon =1,因此应用情况3,从而得到解T(n)=\Theta (n)

4-6

a.证明:

  1. 对行使用归纳法:当k=i+1时,A[i,j]+A[k,j+1]\leqslant A[i,j+1]+A[k,j]。假设对于k=i+n,A[i,j]+A[k,j+1]\leqslant A[i,j+1]+A[k,j]成立。当k=k+1=i+n+1时,因为A[i,j]+A[k,j+1]\leqslant A[i,j+1]+A[k,j]A[k,j]+A[k+1,j+1]\leqslant A[k,j+1]+A[k+1,j],两边相加得A[i,j]+A[k,j+1]+A[k,j]+A[k+1,j+1]\leqslantA[i,j+1]+A[k,j]+A[k,j+1]+A[k+1,j]\RightarrowA[i,j]+A[k+1,j+1]\leqslant A[i,j+1]+A[k+1,j]
  2. 对列使用归纳法:当k=j+1时,A[i,j]+A[i+1,k]\leqslant A[i,k]+A[i+1,j]。假设对于k=j+n,A[i,j]+A[i+1,k]\leqslant A[i,k]+A[i+1,j]成立。当k=k+1=i+n+1时,因为A[i,j]+A[i+1,k]\leqslant A[i,k]+A[i+1,j]A[i,k]+A[i+1,k+1]\leqslant A[i,k+1]+A[i+1,k],两边相加得A[i,j]+A[i+1,k]+A[i,k]+A[i+1,k+1]\leqslantA[i,k]+A[i+1,j]+A[i,k+1]+A[i+1,k]\RightarrowA[i,j]+A[i+1,k+1]\leqslant A[i+1,j]+A[i,k+1]

b.

37232432
216710
53343031
321396
4321158

c.证明:假设\exists i,j\in [1,m],i<j1\leqslant f(j)<f(i)\leqslant nA[i,f(j)]>A[i,f(i)]>A[i,f(i)],A[j,f(j)]<A[j,f(i)]\RightarrowA[i,f(j)]+A[j,f(i)]>A[i,f(i)]+A[j,f(j)],不符合Monge阵列的定义,所以不存在这样的i,j。

d.f(i)表示第I行的最左最小元素的列下标,且当i<1时,f(i)=1;当i>m时,f(i)=n。因为f(2a-2)\leqslant f(2a-1)\leqslant f(2a),计算f(2a-1)需要O(f(2a)-f(2a-2)+1)。在偶数行的最左最小元素已知的情况下,计算奇数行的最左最小元素需要\sum _{i=1}^{\left \lceil m/2 \right \rceil}{f(2i)-f(2i-2)+1}=O(m+n)

e.证明:T(m)=T(m/2)+O(m+n)=\sum _{i=0}^{\log{m}-1}{cn}+\sum _{i=0}^{\log{m}-1}{\frac{cm}{2^{i}}}=O(m+n\log{m})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值