Problem 4-1
通过主定理。
g. 让d = m取2的模,我们很容易看出T(n)的精确值是
它的第一项是 n^3 / 6,所以T(n) ∈ Θ(n^3)。
Problem 4-2
a.描述出递归式 并 解递归式
b.
Problem 4-3
a.主定理,T(n) ∈ Θ(n ^ log3(4))。
b.先用代换法来证明,T(n) ≤ n lg(n)。
现在,我们证明
表明这是
等于表明
。
因为
这个不等式成立。因此,我们有n的函数是软θ,见3 - 5题
c.主定理,T(n) ∈ Θ(n ^ 2.5)。
d.Θ(nlg (n))。在T的参数内发生的减法不会改变解的渐近性,也就是说,对于较大的n,除法比减法的变化要大得多,它是唯一重要的部分。一旦我们去掉这个减法,解就会由主定理得到。
e.通过与第2部分相同的推理,函数是
对每一个
,所以是软的Θ(n),见问题3-5。
f.我们将通过替换来证明这是O(n)。我们想让k < n时T(k)≤c*k,那么,
所以≤cn,只要
当c≥8时发生。
g.回想一下,χA表示A的指示函数,那么,我们看到和是
然而,由于1/x是单调递减的,对于每个i∈Z,我们都有
所以,T(n)的表达式变成
我们处理误差项的方法是先去掉1和2之间的常数然后将误差项限定为
,其不定积分(通过部分分式法)为
。所以,
这就得到了T(n)∈Θ(lg(n))的最终答案。
我们清楚地看到我们有
与上面类似,我们将这个和与lg(x)的积分联系起来,
所以,
i.参照前两部分使用的方法,我们将得到
j.设i是最小的i,使得。回想之前的问题(3-6.e),这是lg(lg(n))。展开递归式,我们得到它是
![]()
Problem 4-4
a.当i≥2时,F0 = 0, F1 = 1, Fi = Fi−1 + Fi−2。然后我们有
b.利用(a)部分给出的方程得到F(z)−zF(z)−z^2 *F(z) = z,因式除法得到
用二次式对分母因式分解得到
,由部分分式分解得到最终等式。
c.从(b)部分和我们对几何级数的知识
d.由生成函数的定义可知,Fi是F(z)中
的系数。由(c)部分给出
,因为
,我们必须有
。最后,由于斐波那契数是整数,我们看到精确解一定是近似解
四舍五入到最接近的整数。
Problem 4-5
a.对于坏芯片的策略是,总是说其他坏芯片是好的,其他好芯片是坏的。这反映了优秀芯片使用的策略,因此,这是不可能区分的。
b.任意配对芯片。只看两个芯片都认为对方不错的那一对。因为我们至少有一半的芯片是好的,所以我们知道至少有一对这样的芯片声称另一对是好的。我们也知道,至少有一半声称两者都是好的,实际上是好的。然后,从每一对中任意挑选一个芯片,让这些芯片构成问题的子实例。
c.一旦我们确定了一个好的芯片,我们就可以用它来查询其他的芯片。从之前的递归测试中找到一个好的芯片的次数是
。
根据主定理,解为Θ(n)。所以,这个问题可以用O(n)个成对检验来解决。因为我们也必须要看至少一半的芯片,我们知道问题也是Ω(n)。
Problem 4-6
a.如果一个数组a是Monge,取k = i + 1, l = j + 1,那么它必须满足不等式。
现在假设A[i, j] + A[i + 1, j + 1]≤A[i, j + 1] + A[i + 1, j]。我们将对行和列使用归纳法来显示数组是Monge。每个基本情况都包含在给定的不等式中。
现在固定i和j,令r≥1,并设A[i, j]+A[i+1, j+r]≤A[i, j+r]+A[i+1, j]。通过运用归纳假设和已知不等式,我们得到
因此,我们可以扩展列并保持Monge性质。
接下来我们对行进行归纳。设 A[i, j] + A[k, l] ≤ A[i, l] + A[k, j]。
然后我们有
b.将7改为5。
c. 假设存在i和k,使得i < k但f(i) > f(k)。由于A是Monge,我们必须有A[i, f(k)] + A[k, f(i)]≤A[k, f(k)] + A[i, f(i)]。由于f(i)给出了第i行中最左边最小元素的位置,这意味着A[i, f(k)] > A[i, f(i)]。而且,A[k,f(k)] ≤ A[k, f(i)]。将它们与Monge不等式结合起来得到A[i, f(i)]+A[k, f(i)] < A[k, f(i)]+A[i, f(i)],这是不可能的,因为两边是相等的。因此,不存在这样的i和k。
d.线性扫描第1行索引1到f(2),查找第1行的最小元素并记录为f(1)。接下来线性扫描第3行的 索引f(2)到f(4),查找第3行的最小元素。一般来说,我们只需要扫描第2k + 1行的下标f(2k) 到f(2k + 2)就能找到第2k + 1行的最左边的最小元素。如果m是奇数,我们需要搜索索引 f(m−1)到n来找到第m行中最左边的最小值。通过(c)部分,我们知道最左边最小值元素的索 引是递增的,所以我们保证从扫描的索引中找到所需的最小值。第j列的一个元素将被扫描 Nj + 1次,其中Nj是i的个数,使得f(i) = j。由于
,比较的总数为m + n, 运行时间为O(m + n)。
e.设T(m, n)表示应用于m × n矩阵的算法的运行时间。对于某个常数cT(m, n) = T(m/2, n) + c(m + n),我们会证明T(m, n)≤c(m + n * log m) - 2cm。
通过归纳,我们得到T(m, n) = O(m + n * log m)