4-1
a
因此根据第三个条件,可以构造出 ,最终
b
因此根据第三个条件,可以构造出 ,最终
c
因此根据第二个条件,得到 ,最终
d
因此根据第二个条件,得到 ,最终
e
因此根据第三个条件,可以构造出 ,最终
f
因此根据第一个条件,
g
因此根据第二个条件,得到 ,最终
h
令 ,可以知道, 。
那么有:
4-2
。因此根据第二个条件,得到 ,最终 。
。因此根据第三个条件,可以构造出 ,最终 。
。因此根据第二个条件,得到 ,最终 。
。
。因此根据第一个条件, 。
。因此根据第一个条件, 。
4-3
a
代入 。那么可以写成 。
再代入 ,那么有 。
b
。因此根据第二个条件,得到 ,最终 。
c
由于 ,回代 ,即 ,得到 。
d
可以发现,整个递归树一共只有 层。
如图所示,最终有 。
e
代入 。那么可以写成 。
再代入 ,那么有 。
。因此根据第一个条件, 。
回代 ,即 ,得到 。
f
代入 。那么可以写成 。
再代入 ,那么有 。
回代 ,即 ,得到 。
4-4
a
考虑使用主定理,那么有
因此根据第一个条件,
b
由于 。
那么使用题目 4.6-3 的结论,得到 。
c
考虑使用主定理,那么有
因此根据第三个条件,可以构造出 ,最终 。
d
根据 4-3 节的结论,常数附加项不会对递推式的渐进结果产生影响。
因此令 ,那么 。
考虑使用主定理求解 ,那么有
因此根据第二个条件,得到 ,最终 。
也就是说, 。
e
由于 。
那么使用题目 4.6-3 的结论,得到 。
f
考虑使用 Akra-Bazzi 方法。
由于 ,因此 。如果精确解方程 ,那么可以得到 。并且由于 。那么有
g
h
i
本题目答案参考了此页面 的内容,并且更加严谨了一些。
可以发现, 可以写成如下分段等式:
接下来证明
当 为偶数时,有 不难发现在这种情况下有
当 为奇数时,有 不难发现在这种情况下有
因此综上所述,
接下来证明 以下变换基于 的假设进行。
当 为偶数时,有
当 为奇数时,有
因此,令 。那么可以写成
当 时,不难得到不等式 。故此有
因此综上所述,
最终有
j
令 。将 代入到原式,那么得到
令 。将 带入到上式,那么得到
根据主定理的第二个条件,可以得到 。
回代到 中,得到 。
因此有 。
4-5
a
将一次项和常数项目全部分离出来,那么等式右边三项可以写成:
三项相加,得到 。
代入 ,最终这个式子可以写成 ,也就是 。
b
将 a 的结论整理得到 ,提取 公因式,得到 ,最终得到:
由于 ,那么得到 。
由于 ,因此 还可以写成:
由于有如下变换:
因此 还可以写成: .
c
d
由题目 c 得到的等式,代入题目求和项中的 ,有 。
可以发现,对于 均成立。因此, 最接近的整数即为 。
e
考虑式子 的值。那么有
由于 ,因此 ,即有 。
4-6
a
假设好的芯片一共有 个,其中满足 。
那么从这 个坏芯片中选择出 个坏芯片。这 个坏芯片的策略是:如果另一个芯片是好芯片,那么显示为坏结果如果另一个芯片是坏芯片,那么显示为好结果。
按照这种策略,只要从这 个芯片中取出任意 个芯片检测,那么教授旧无法区分哪 个芯片是好的,哪 个芯片是坏的,因为两个芯片互相检测结果总是一致的,
b
现在题目的假设是:好芯片严格 多于坏芯片。
整个策略如下:首先,如果当前芯片个数 是奇数,那么均匀随机选择一个芯片留下,对剩下的 个芯片进行递归操作,等操作完成再回头考虑这个被留下的芯片;否则什么都不用做。在一轮中,每次随机取出 个芯片进行测试。如果 个芯片的测试结果是 “ 个都是好芯片”,那么丢弃其中 个芯片,另 个芯片留到下一轮测试;否则 个芯片都丢弃。这个过程由算法 GET-GOOD
描述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // 子程序`TEST(c1, c2)`表示对芯片c1, c2进行测试的结果。用True表示全好的报告,用False表示存在1个芯片是坏的报告。 GET-GOOD(chips) if chips.size == 0 return NIL else if chips.size == 1 return chip[0] else if chips.size % 2 == 0 let C be new array for i = 0 to chips.size - 1 by 2 if TEST(chips[i], chips[i + 1]) == True INSERT(C, chips[i]) return GET-GOOD(C) else // chips[0]是保留的那个芯片。 let C be new array for i = 1 to chips.size - 1 by 2 if TEST(chips[i], chips[i + 1]) == True INSERT(C, chips[i]) now = GET-GOOD(C) if now == NIL return chips[0] else return now
因此在一轮测试中,需要进行 次测试。在一轮测试完成后,最多剩下 个芯片。
接下来说明:经过一轮的测试后,剩下的芯片仍然满足:好芯片仍然严格 多于坏芯片。
可以知道,如果算法 GET-GOOD
传入的芯片中,好坏的个数相同,那么最终这个算法的递归终点将是第 2 行的 NIL
。因为在第 7 行的 for
循环完成后,得到的 C
数组中,好芯片和坏芯片的个数仍然相同。最终随着递归的进行,每一对好坏芯片都将被抵消,最终找不到任何一个好芯片。
如果算法 GET-GOOD
传入的芯片中,好芯片要比坏芯片多,那么在这一轮测试中,假设芯片的个数为 ,那么考虑如下 个情况:
如果 是偶数,在这 次测试中,有 次是拿出了 个好芯片进行测试,有 次是拿出了 个好芯片, 个坏芯片进行测试,有 次是拿出了 个坏芯片进行测试,需要注意的是,在测试的过程中, 的值是无法被统计。那么可以知道好芯片的个数为 ,坏芯片的个数为 。按照假设,有 ,即得出 。在 次不同好坏芯片的测试中,所有芯片都丢弃; 次全好芯片测试中,将会恰好 保留 个好芯片;在 次全坏芯片测试中,将会至多 保留 个坏芯片(因为两个坏芯片同样会有可能报告对方是坏的)。由于 ,因此这一轮测试完成后,保留的好芯片必然严格 多于坏芯片。最终递归终止时,所有坏芯片将会被丢弃,通过第 4 行的代码找到一个好芯片。
如果 是奇数,那么有如下 种情况进行讨论,注意需要随机留出一个芯片,假设为 chips[0]
。
1
如果算法 GET-GOOD
传入的芯片中,好芯片要比坏芯片多出 个或以上,那么无论留下来的是好芯片还是坏芯片,按照偶数时的情况,第 16 行代码中,变量 now
必定是一个好芯片,直接返回。
2
如果算法 GET-GOOD
传入的芯片中,好芯片要比坏芯片多出恰好 个,那么有如下 情况讨论。
如果留下来的是好芯片,那么剩下的 个芯片中,好坏的个数相同。上面 13 行的 for
循环完成后,数组 C
的好坏芯片个数相同。按照上面的结论,第 16 行代码对数组 C
进行递归调用后,得到的必定是 NIL
。那么返回留下的好芯片 chips[0]
即可。
如果留下来的是坏芯片,那么剩下的 个芯片中,好芯片多于坏芯片。按照偶数时的结论,第 16 行代码中,变量 now
必定是一个好芯片,直接返回。
故在好芯片严格 多于坏芯片的情况下,算法 GET-GOOD
总能找到一个好芯片。
c
根据题目 4-6-b 的结论,假设 个芯片的比较次数为 ,那么可以给出下列不等式:
根据主定理的第二个条件,不难得到 。
d
由于找出一个好的芯片需要 次比较,那么使用这个好的芯片对其它芯片进行测试就能够找到所有好芯片,总共需要 次比较。
因此,最终找到所有好芯片的次数为 次。
4-7
a
充分性:
令 ,那么得到等式 。充分性成立。
必要性:
由 通过移项,得到:
。
令函数 ,那么对于 ,由上面的等式,发现 是一个递增函数。因此, ,都有 成立。即有 都成立。
同理,可以得出 ,都有 。
最终根据传递性,总有 成立,因此必要性成立。
b
c
本题使用反正法进行证明。
假设存在 满足 ,有 。
根据 函数的定义: 是第 行中最左 的最小元素的列下标,可以得到: ,注意此式子不能取等号;还可以得到 .
根据这两条不等式可以得到 ,与 Monge 矩阵的定义矛盾。
因此 ,都有 。
d
由于目前已经知道 的值,并且由于已知 。为了计算 的值,假设 ,有:
e
为了解决整个求解问题,可以写出 。
由于 ,那么可以假设
因此 。