算法分析与设计第二次上机笔记
1.前两次上机的真题说明
1.1 排序算法的时间复杂度
(1)归并排序在最好,平均,最坏情况下的时间复杂度均为: n l g ( n ) nlg(n) nlg(n)
(2)归并排序的时间复杂度是 O ( 1 ) O(1) O(1)----------------------------------------------------------------------------------------------(×)
(3)**优先队列的extract-maximum()
**的时间复杂度是
O
(
l
g
(
n
)
)
O(lg(n))
O(lg(n))
(4)堆排序在==最好情况下的时间复杂度==是 n l g ( n ) nlg(n) nlg(n),平均 n l g ( n ) nlg(n) nlg(n),最坏情况下的时间复杂度为 n l g ( n ) nlg(n) nlg(n)
(5)堆排序的空间复杂度是 O ( 1 ) O(1) O(1)------------------------------------------------------------------------------------------------- (√)
(6)写出堆排序的适用条件(写出两点即可)
- n n n比较大的情况
- 部分排序:前k位
- 实时应用 realtime application
(7)确保一个堆的是大顶堆的算法是maxheapify()
,其时间复杂度是:O(lg(n))
(8)构建一个堆的算法build_heap()
,其时间复杂度是:O(nlg(n))
错,应该是
O
(
n
)
O(n)
O(n)
(9)快排在最坏 n 2 n^2 n2,最好 n l g ( n ) nlg(n) nlg(n)和平均情况下 l g ( n ) lg(n) lg(n)的时间复杂度
1.2 排序算法的稳定性
五个排序算法:归并排序,堆排序,快排,插入排序,计数排序。
答案分别是稳定,不稳定,不稳定,稳定,稳定
【查考题型】题目给出若干个排序算法,问时间复杂度,空间复杂度,稳定性和适用条件。
1.3 快排比较次数
(1)如果待排序的n个元素有相同的值,那么快排总共需要比较多少次?
- 判断题
- 简答题
答案: C n 2 = n ( n − 1 ) 2 C_n^2 = \frac{n(n-1)}{2} Cn2=2n(n−1)
(2)快排最坏情况列举两个实例
- 所有元素相等
- 序列有序(已经排好序了)
动态规划【重点复习】比例大,甚至占50%,最近提高分治法的比例
1.4 矩阵链乘【DP计算题重点】
(1)计算矩阵链乘的加括号方式
Matrix-chain product. The following are some instances.【建议矩阵链乘最后做,计算量很大】
(a) < 3, 5, 2, 1,10>
((A1(A2A3))A4)
b) <2, 7, 3, 6, 10>
(((A1A2)A3)A4)
© <10, 3, 15, 12, 7, 2>
(A1(A2(A3(A4A5))))
(d) <7, 2, 4, 15, 20, 5>
(A1(((A2A3)A4)A5))
用时间长的大题:(不一定是最后一道题)
- DP类大题,如矩阵连乘
- 递推树求解递推式,代换法证明(要不要减去低阶项?,只有一年不用减去低阶项)
- 算法设计题(答题技巧下次讲)
(2)写出矩阵链乘的递推式
M [ i , j ] = { 0 i f i = j m i n { M [ i , k ] + m [ k + 1 , j ] + p i − 1 p k p j } M[i,j] =\begin{cases}0\qquad if\ i=j\\ min\{M[i,k]+m[k+1,j]+p_{i-1}p_kp_j\}\end{cases} M[i,j]={0if i=jmin{M[i,k]+m[k+1,j]+pi−1pkpj}
所有的递推式都要会默写。二三次上机报告中递推式需要写出。
(3)矩阵链乘的开销与时间复杂度
被完全加上括号的开销等于计算矩阵 a i a i + 1 . . . a k + a k + 1 . . . a j a_ia_{i+1}...a_{k} + a_{k+1}...a_{j} aiai+1...ak+ak+1...aj之和。--------------------------------------------------(×)
矩阵链乘的核心算法的时间复杂度 matrix_chain_order
:
O
(
n
3
)
O(n^3)
O(n3)
思考题:
矩阵链乘一共有多少个子问题,每个子问题有多少种选择?
m [ i ] [ j ] m[i][j] m[i][j]数组被填的个数
i − j i-j i−j
(4)辅助数组
m [ i , j ] m[i,j] m[i,j]和 s [ i , j ] s[i,j] s[i,j]的作用是什么?存储空间有多大?
- m [ i , j ] m[i,j] m[i,j]表示计算 a i . . . a j a_i...a_j ai...aj需要的最小标量乘法次数,给出了子问题的最优解值,存储空间是 Θ ( n 2 ) \Theta(n^2) Θ(n2)
- s [ i , j ] s[i,j] s[i,j]记录 a i . . . a j a_i...a_j ai...aj最优的分裂位置,即k值,存储空间是 Θ ( n 2 ) \Theta(n^2) Θ(n2)
1.5 LCS问题
(1)默写LCS的递推表达式
c [ i , j ] = { c [ i − 1 , j − 1 ] + 1 i f i , j > 0 a n d x i = y j m a x ( c [ i − 1 , j ] , c [ i , j − 1 ] ) o t h e r w i s e c[i,j] = \begin{cases}c[i-1,j-1]+1\qquad\qquad\qquad if \ i,j>0\ and \ x_i=y_j\\ max(c[i-1,j],c[i,j-1])\qquad\qquad\qquad otherwise\end{cases} c[i,j]={c[i−1,j−1]+1if i,j>0 and xi=yjmax(c[i−1,j],c[i,j−1])otherwise
(2)时间复杂度
- 若两个序列的长度分别是m和n,那么算法LCS的主算法时间复杂度是多少?
O ( m n ) O(mn) O(mn)
- 子问题的个数是多少?
O ( m n ) O(mn) O(mn)
- 输出LCS的时间复杂度
O ( m + n ) O(m+n) O(m+n)
1.6 maxSum
(1)默写maxSum的递推表达式
b [ i ] = { a [ i ] b [ i − 1 ] < 0 b [ i − 1 ] + a [ i ] b [ i − 1 ] > = 0 b[i] = \begin{cases}a[i]\qquad\qquad\qquad\ b[i-1]<0\\ b[i-1] + a[i] \qquad b[i-1]>=0\end{cases} b[i]={a[i] b[i−1]<0b[i−1]+a[i]b[i−1]>=0
或者写成:
b
[
j
]
=
m
a
x
(
b
[
j
−
1
]
+
a
[
j
]
,
a
[
j
]
)
1
≤
j
≤
n
b[j]= max(b[j-1]+a[j], a[j])\qquad 1\leq j\leq n
b[j]=max(b[j−1]+a[j],a[j])1≤j≤n
1.7 算法设计题
本次上机的最短路径题,用动态规划题设计
Dijkstra是贪心,不是动态规划 -----------------------> 转换成装配线问题
note:2022年卷子的最后一题也是这么干的,转换成三个类似装配线的方程。当时大部分同学用的都是暴搜,标准答案应该是用的这个思路