10 12章参考答案

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

第十章

1. (1) N=11 时的哈希表为:


地址 0 1 2 3 4 5 6 7 8 9 10
关键字 22 41 30 1 53 46 13 67
平均检索长度为(1+1+1+1+2+2+2+6)/8=2
(2) N=10 时的哈希表为:
地址 0 1 2 3 4 5 6 7 8 9
关键字 30 13 67 41 1 22 46 53
平均检索长度为(1+1+1+1+1+3+2+2)/8=1.5,相比(1)变少
注意题目问对表中数据等概率查找,因此只需要考虑成功查找

2. (1) 𝑗 = ℎ(𝑘) + ∑ 𝑙 mod 𝑚 = ℎ(𝑘) + 𝑖 + 𝑖 mod 𝑚, 𝑐 = 𝑐 =

(2) 先证每次探查的位置不同。反证假设对𝑖 ≠ 𝑖 有𝑗 = 𝑗 。此时有:


1 1 1 1
ℎ(𝑘) + 𝑖 + 𝑖 = ℎ(𝑘) + 𝑖 + 𝑖 (mod m)
2 2 2 2
2𝑚 | 𝑖 + 𝑖 − 𝑖 − 𝑖
2𝑚 | (𝑖 − 𝑖 )(𝑖 + 𝑖 + 1)
2𝑚 | 𝑖 − 𝑖 或2𝑚 | 𝑖 + 𝑖 + 1
由于0 ≤ 𝑖 < 𝑚,故−𝑚 < 𝑖 − 𝑖 < 𝑚,1 ≤ 𝑖 + 𝑖 + 1 < 2𝑚,
所以2𝑚 | (𝑖 − 𝑖 )(𝑖 + 𝑖 + 1)当且仅当𝑖 = 𝑖 ,与假设矛盾。
故最坏情况下(例如散列表满时的失败检索)需要探查表中的每一个位置。

3. (1) 二分答案 mid,按以下方法统计矩阵中<=mid 的数的数量:设 B[i]表示第 i 行最靠


右的<=mid 的数的列下标(设数组行列下标从 1 开始标号) ,则∑B[i]就是统计结果。
注意到 B[i]关于 i 是不增的:假设有 i<j 且 B[i]<B[j],则 A[j][B[j]]<=mid,由题目
给出的单调性条件知 A[i][B[j]]<=mid,与 B[i]是第 i 行最靠右的<=mid 的数的列下标
矛盾。
因此只需要从 1 到 N 枚举 i 的同时维护 B[i]的值。B[1]初始化为 N,B[i](i>1)初始化
为 B[i-1],减 1 直到 A[i][B[i]]<=mid。
(2) 统计时,枚举 i 是 O(N)的,减 1 不会超过 N 次,也是 O(N)的,时间复杂度为 O(N)。
统计共要进行 O(log(max(A)-min(A)))次, 总时间复杂度为 O(N log(max(A)-min(A)))。
由 max(A)-min(A)<<2^N,可将时间复杂度进一步写成 O(N^2)。

4. 设 N=10^7,M=10^8,参考两种主要的做法:
①快速排序,排好后扫一遍,相邻两个数之间的值都是没有出现过的。时间复杂度 O(N
log N),空间复杂度 O(N);
②用桶或 bitmap 把这些值的位置标记上 1,存好后扫一遍,值为 0 的桶或 bit 就是没出
现过的。时间复杂度 O(M),空间复杂度 O(M)。
第十一章

1. 3 次
回顾课本 P308,第十一章课件 P47。
题目要求推导过程,最好不要写节点数量随层数的变化,而写关键码数量的变化,或者
要写清楚关键码数量和节点数量之间的关系,然后再写节点数量随层数的变化。
参考:42 阶 B 树各层极限结点和关键码数目
最少结点 最少关键码 最多结点 最多关键码
第0层 1 1 1 41
第1层 2 2×20=40 42 41×42=1722
第2层 2×21=42 2×20×21=840 42×42=1764 41×42×42=72324
第3层 2×21×21=882 2×20×21×21=17640
可关注勘误表教材勘误表第 27 行、课件勘误表第 49 行。

2. (1)

(2)
3. 不一定一样。具体说明举出一个一样的例子、一个不一样的例子即可。最好不要仅仅用
抽象的文字描述。注意检查初始的树满足红黑树所有性质。可参考:

(by 王嘉林)

4. 注意提到左右旋互逆
参考答案:执行一次右旋会让二叉搜索树少一个左儿子、多一个右儿子。因为任意左儿
子都可以右旋,所以任意二叉搜索树不断右旋直到不能执行时,树里没有左儿子,这时
树是一条向右的链。右旋次数不会超过原先树中左儿子的数量,不会超过 n。这样证明
了任意二叉搜索树通过 O(n)次右旋均可转化成向右的链。
考虑到右旋和左旋是互逆的,右旋之后对新成为右儿子的结点左旋即可恢复到右旋之前。
因此通过 O(n)次左旋可以把向右的链转化成任意二叉搜索树。
所以,任意二叉搜索树通过 O(n)次旋转可以转化为同样元素构成的任意二叉搜索树。

5. (1) 每个节点上时间复杂度为𝑂(𝑡),树高𝑂(log 𝑛),时间复杂度为𝑂(𝑡 log 𝑛)。注意以 t


为底。
(2) 每个节点上时间复杂度为𝑂(log 𝑡),时间复杂度为𝑂(log 𝑡 log 𝑛) = 𝑂(log 𝑛)。
第十二章

1.

2. 开 N 个链表,初始为空,顺序枚举三元组(i, j, A[i][j]),将(j, i, A[i][j])存入第


j 个链表尾。最后依次把第 1-N 个链表中的三元组顺序取出即可。依次拼接 1-N 的链表
确保了转置后行号递增,在每个链表中顺序取出三元组确保了行相同列号递增。时间复
杂度 O(N+M),空间复杂度 O(N+M)。
另外还有直接计算转置后每个三元组在一维存储结构中下标的做法,相对复杂一些。

3. (1)每次插入都选择右子树,时间复杂度O(𝑛 )
(2)左右子树大小最多差 1。时间复杂度O(𝑛𝑙𝑜𝑔𝑛)。
(3)该方法树高不会增长,时间复杂度O(𝑛)。
(4)最坏情况下与(1)相同为O(𝑛 )。期望情况下时间复杂度O(𝑛𝑙𝑜𝑔𝑛),因为出现一个深
度为𝑑的节点(设根节点深度为0)需要连续𝑑次随机全和之前某一个节点的随机相同。
设每个结点有1个随机序列,一共有𝑛个,所以一个随机序列前𝑑次随机与之前某个随机

序列前𝑑次随机完全相同的概率不会超过 ,期望上界为:

𝑛 𝑑 1
3𝑛𝑙𝑜𝑔𝑛 + 𝑛·𝑑· ≤ 3𝑛𝑙𝑜𝑔𝑛 + ≤ 3𝑛𝑙𝑜𝑔𝑛 + ≤ 3𝑛𝑙𝑜𝑔𝑛 + 2
2 𝑛2 2

为O(𝑛𝑙𝑜𝑔𝑛)级别。

4. 将字符串依次插入 Trie 树,一次 DFS(在每个节点处按字典序从小到大枚举字符)即得


排序结果。设字符串长度之和为 L,时间复杂度 O(αL),空间复杂度 O(αL),α为字符
集大小。

5. 最佳二叉搜索树的前序序列为 EBH,除了检索 E 长度为 1 之外,其他检索长度均为 2,


平均检索长度为 16/9。可参考课本 P354 计算公式,注意外部结点不需要+1。

You might also like