注:
本题解为个人完成,难免有疏漏,请勿抄袭,仅供参考,同时欢迎留言指正。
## 19.1
决策树每个节点进行比较,最坏情况就是决策树从根到叶的最长路径L,显然
19.3
- 最多有一个逆序对意味着逆序只可能出现在相邻两个元素之间,那么所有非相邻的元素都不是逆序对
- 只要找到这个相邻逆序对,调换位置即可完成排序,说明
次操作确实可以完成排序 - 为了便于理解,可以用图的方式刻画这个过程,即n个元素是n个点,比较一次的结果可以确定两个点之间边的方向,可以根据两个点之间的可达性判断逆序情况
- 假设某算法A自认为可以用不到
次比较,就判断出逆序对是 个还是 个 - 对手先采取这样的策略:输入数据设置为无逆序,这样算法A的每次比较都返回不是逆序对,最终一定返回无逆序对
- 进行了不到
次比较,说明至少有一对相邻的节点 之间是没有边的 - 此时
在图中相互不可达,思考为什么 - 如果此时添加一条从
到 的边,图不会出现圈,思考为什么 - 对手可以按图当前表示的顺序关系重新构造输入数据,算法A有可能还是输出无逆序对,之所以说有可能是考虑到随机算法。
- 说明该算法有可能出错,从而得出矛盾,故比较次数的下界是
19.5
(1)
算法思路 + 利用锦标赛的方式,
正确性 因为每轮必然会淘汰元素,而被淘汰的元素都不是对应组里5个元素的最大值,当然不可能是所有中的最大值,那么所有轮比完后剩下的最后一个元素,必然是最大值,因为其他元素都被淘汰了。
最优性 算法每次
(2)
算法思路 + 锦标赛的轮数是
正确性 + 选最大的元素时,没有和最大值比过就被淘汰的一定不是第二大 + 在所有可能的第二大中选出最大的那个,显然就是第二大的元素
最优性 +
证明最优性,就是证明不存在一个算法最坏情况比我们的代价小 +
我们可以构造一个输入的生成方式(对手策略),使得对于任何算法,在该输入下代价都大于等于我们算法的代价。即找到对手策略,使得对任何算法,在最大者选出后,和最大者比赛输的第二名元素的总数不小于
19.6
(1)
- 我们只考虑
是大于 的整数,等于 或 的情况意义不大 - 每次任意取数组中两个从没取过的数
, 进行比较 - 如果返回结果是"相同",则继续循环取
- 如果返回结果是"不相同",说明
, 中有且只有一个是特殊元素,那么把 和数组任意非 元素比一下即可,如"不相同",则特殊元素是 ,否则是 - 如果数组只剩1个元素可取,则该元素是特殊元素
- 如果数组剩2个元素
, 可取,说明 , 中有且只有一个是特殊元素,那么把 和数组任意非 元素比一下即可,如"不相同",则特殊元素是 ,否则是 - 说明算法为什么不超过
(2)
假设
(3)
- 为了证明方便,可以让对手设置
,即为偶数 - 假设某算法A自认为需要最多需要
次就能找到特殊元素 - 对手可以采取这样的策略:控制输入数据,使得
为偶数,且算法A的每次比较都返回"相同" - 该算法最多比较
次,故比较次数用完时,必然存在至少2个元素从未参与比较 - 这样算法A无法判断特殊元素是哪一个,无论判断为哪个,对手都可以调整输入数据使得算法出错
- 故特殊元素问题最坏情况复杂度下界是
注:其实证偶数情况会让算法A出错已经足够了,为了思考的完整性,下面提一下奇数情况怎么整:
+ 对手控制输入为奇数时,调整输入数据,使得算法