北京大学数院-856大数据-2024年
一、(15分) 甲、乙两人进行象棋比赛,每局甲胜的概率为 ,乙胜的概率为 . 若某一方获胜的局数比另一方多三局,我们则认为他获得了胜利. 求甲获胜的概率.
Solution: 何书元1.19, 考虑吸收壁问题.
设 表示第一局甲获胜, 表示甲比乙多胜 场下的最后获胜( 表示为少胜), 表示甲比乙多胜 场下的获胜概率, 表示甲比乙少胜(乙比甲多胜) 场下的获胜概.由全概率公式有
从而可以求得甲获胜的概率
Remark: 同样的, 如果是多胜 场,所求概率为
二、(15分)设 与 独立,都服从标准正态分布. 令 , 求出 的联合分布.
Solution: 的联合分布为
而
进而有 , 且可以发现 . 从而有
三、(15分) 设 独立同分布于 , 是对应的次序统计量 . 若 为已知常数, 且 , 这 个下标也已知. 求 .
Solution: 令 , 以及 , 可以发现 之间相互独立.
利用次序统计量的经典结论,我们有 , 以及 .
故有
进一步, 由Beta分布的性质有
Remark: 其实本质为 与 的独立性, 因此对于乘积形式的次序统计量我们会如下计算,
请好好体会这个式子的思想对于本题解题思路的启发和体现.
四、(15分) 若 取自总体 , 取自总体 , 其中 已知.
(1)(7分) 设 是 的无偏估计,求 的值使得 的方差最小.
(2)(8分)基于第一问求出的 , 给出 的 置信区间.
Solution: (1) 首先需要 , 从而约束为 . 而目标函数为
. 故问题可以写成
这里可以使用拉格朗日乘除法或者二次函数极值, 也可以直接使用柯西不等式有
等号当且仅当
时成立. 即 .
(2) 此时的 .
故 的 置信区间为
五、(15分)设回归模型为 , 其中 ,且 已知. 现在将模型修改为 , 记 和 分别为修改前和修改后的MLE.
(1)(5分) 请证明 ;
(2)(5分) 请求出 的分布;
(3)(5分) 请证明 与 独立.
Solution: (1) , 其似然函数为
从而其对数似然函数为
对其求偏导
同理, 令 , 只需要说明 即可. 这是显然的,因为.
但此时的 和 不一定相等, 除非 几乎处处为0. 因此可以发现这一问出错了, 我们只能得到. 只有在几乎处处为0时, 才有.
(2) 由于 和 都是正态分布随机变量的线性组合, 因此其分布还是正态分布. 我们只需要计算其期望和方差即可得到具体分布, 最终有
(3)茆书内容. 利用 , 从而 与 独立.
六、(7分) 根据关键码集台 画出建立AVL树的结果.
Solution:
1 | R----xal |
七、(8分) 给出一个从 开始到其他各点的最短路径的djikstra算法.
Solution:
1 | import sys |
输出样例结果
1 | Shortest distances: [0, 2, 5, 6, 7] |
八、(10分) 给定原点 ,试用Prim算法求最小生成树,给出结点访问顺序序列.
Solution:
1 | import sys |
输出样例结果
1 | Node visit order for MST: [0, 1, 2, 4, 3] |
九、(10分) 分别用栈和队列进行时空状态搜索并说明有什么不同.
Solution: 在进行状态空间搜索时,栈和队列作为数据结构的选择会导致两种不同的搜索策略:深度优先搜索(DFS)和广度优先搜索(BFS)。这两种策略在时间和空间的使用效率上有所不同,适用于不同类型的问题。
使用栈进行深度优先搜索(DFS)
-
工作原理:栈是一种后进先出(LIFO)的数据结构。在DFS中,栈用于存储待探索的节点。当探索一个节点时,该节点的子节点被推入栈中,并在下一步被探索。
-
时间和空间特性:
- 时间效率:DFS通常更快地遍历整个状态空间,但不保证找到最短路径或最优解。
- 空间效率:DFS通常使用更少的内存,因为它只需要存储一条从根到叶子的路径。
-
适用场景:DFS适用于解空间较深或需要遍历整个解空间的问题。
使用队列进行广度优先搜索(BFS)
-
工作原理:队列是一种先进先出(FIFO)的数据结构。在BFS中,队列用于存储待探索的节点。当探索一个节点时,该节点的所有子节点被加入队列的尾部,并依次被探索。
-
时间和空间特性:
- 时间效率:BFS通常更快地找到最短路径或最优解,但可能需要更长时间来遍历整个状态空间。
- 空间效率:BFS可能需要更多内存,因为它需要存储所有已生成但尚未探索的节点。
-
适用场景:BFS适用于需要快速找到最短路径的问题,尤其是在状态空间较广的情况下。
比较
- 搜索深度与广度:DFS深入到每个分支的最深处,而BFS逐层探索状态空间。
- 路径优化:BFS更有可能找到最短路径,而DFS可能会找到较长的解决路径。
- 内存使用:DFS在内存使用上更高效,尤其是在解空间非常深但每层分支较少的情况下。BFS在宽但浅的状态空间中效率较高。
- 实现复杂度:DFS的实现通常更简单,尤其是在递归形式的情况下。BFS的实现相对复杂一些,需要维护一个队列。
选择使用DFS还是BFS取决于具体问题的特点和需求。例如,DFS更适合解空间较深的问题,如解决方案可能在较深的层次中;而BFS更适合寻找最短路径或最优解的情况。
十、(10分) 什么是稳定性和适应性,并解释直接插入排序如何做到以上两点.
Solution: 在排序算法的上下文中,“稳定性”和“适应性”是两个重要的特性。
-
稳定性(Stability):
- 定义:如果排序算法保证相等的元素在排序前后保持原有的顺序,则该算法是稳定的。
- 举例:假设有一组记录
[A2, B1, A1, B2]
,其中字母代表值,数字代表原始位置。在稳定的排序算法下,排序后相同字母的记录会保持原来的相对位置,例如[A1, A2, B1, B2]
。
-
适应性(Adaptivity):
- 定义:如果排序算法对已经部分排序的输入数据进行排序时,能够提高其性能,则该算法是适应性的。适应性强的算法在处理部分排序的数据时更高效。
- 举例:如果输入数据是
[1, 2, 3, 5, 4, 6, 7]
,适应性强的算法会利用这种已经部分排序的特性来减少工作量。
直接插入排序
直接插入排序是一种简单的排序算法,具有稳定性和适应性。
-
实现稳定性:
- 在直接插入排序中,新元素总是插入到前面已排序部分的适当位置。
- 当遇到相等的元素时,新元素会被放置在相等元素的后面,从而保持了它们的相对顺序。
- 这种做法确保了具有相同值的元素在排序后仍然保持其原有的顺序,从而使算法是稳定的。
-
实现适应性:
- 直接插入排序的性能会随输入数据的初始排序程度而改变。
- 如果数据已经部分排序,算法会进行较少的比较和移动操作。例如,在最佳情况下(输入数据已经完全排序),直接插入排序只需要进行 (n-1) 次比较和0次移动操作。
- 这种对输入数据的初始排序状态敏感的特性使得直接插入排序具有适应性。
总结来说,直接插入排序因其能保持相等元素的原始顺序而具有稳定性,且能根据输入数据的部分排序状态调整其性能,从而具有适应性。这两个特性使得直接插入排序在某些情况下(如已部分排序的小数据集)非常有效。
十一、(10分)给定一个有16个关键码的字典.
(1)(5分) 使用二分查找搜索一个关键码时的比较次数.
(2)(5分) 用除余法定义散列函数并设置 , 用开放地址线性探查法建立散列表.
Solution: (1) 二分查找是一种在有序数组中查找特定元素的算法。针对16个元素的数组,最坏情况下的比较次数是确定的。在二分查找中,每次比较都会将搜索区间减半。因此,对于含有16个元素的数组,最多需要进行的比较次数可以通过计算 ( \log_2(16) ) 得出,等于4
(2)
1 | import random |
输出结果
1 | 散列表: [62, 31, 95, None, 97, 98, None, None, 39, 40, None, 73, 12, None, None, None, None, None, 80, 19, 20, 82, None, None, None, None, 57, None, None, 29, 60] |
十二、(10分) 树的先根遍历的递归和非递归.
Solution:
1 | class TreeNode: |
十三、(10分) 求整数列中最大连续子序列和.
Solution: 求解整数序列中最大连续子序列和的一个经典算法是Kadane算法。这个算法非常高效,能在线性时间内解决问题。
算法的基本思想是遍历数组,同时跟踪两个变量:当前位置的最大子序列和和到目前为止的最大子序列和。
1 | def max_subarray_sum(nums): |
输出样例结果
1 | 最大连续子序列和: 6 |