算法导论学习笔记[0] #20210706
lec 1
Lecture 1
Administrivia; Introduction; Analysis of Algorithms, Insertion Sort, Mergesort
Why study algorithms and performance?
Q0: 如何理解"Performance is the currency of computing."
A0: 实际中常常牺牲性能以获取其它方面的优点,即做"trade-off". 例如为了面向对象等等,我们使用Java而不使用C(即使C更快)。
Q1: 举例说明"Performance often draws the line between what is feasible and what is impossible."
A1: 离散傅里叶变换(DFT)的复杂度是 O ( N 2 ) O(N^2) O(N2),这在历史上曾经一度成为信号处理、物理等领域发展的瓶颈。
1965年,快速傅里叶变换(FFT)被发明,其复杂度仅为 O ( N l o g N ) O(NlogN) O(NlogN),大大推动了信号处理领域的发展。
插入排序(Insertion sort)与其渐近分析
Q0: 对于插入排序的伪代码
for j <- 2 to n
key <- A[j]
i <- j - 1
while i > 0 and {}
A[i+1] <- A[i]
i <- i-1
A[i+1] <- key
请在{}
中填写适当的判断条件,使得输出是递增的数列。
A0: A[i] > key
注:如果写成了<
,那么将得到递减的数列。
Q1: 接上,填写A[i] > key
和A[i] >= key
有何区别?
A1: 后者的开销恒大于前者,且会使得排序不稳定。
Q2: 分析算法时我们最常考察Worst-case,有时考察Average-case. 请提出一种新的合理的评判标准。
A2: 例如:算法以 1 − ϵ 1-\epsilon 1−ϵ概率在多少时间内运行完。(言之成理即可)
Q3: " T ( n ) T(n) T(n) (the expected time of algorithm of size n n n) is the average time over all inputs of size n n n."有何不准确之处?
A3: 需要对输入的统计分布做出假设。(实际中,可能是加权平均,而不是简单的求平均)
Q4: 在渐近分析中,常数有可能有什么实际意义?
A4: 不同设备的性能、不同运算(如乘法和加法)的开销、不同优化等级,等等。
Q5: 解释记号 ∑ j = 1 n Θ ( j 2 ) = Θ ( n 3 ) \sum_{j=1}^n\Theta(j^2)=\Theta(n^3) ∑j=1nΘ(j2)=Θ(n3).
A5: 如果对于一切 n ∈ N + , j = 1 , ⋯ , n n\in \mathbb N_+,j=1,\cdots,n n∈N+,j=1,⋯,n,有 m j 2 ≤ a n , j ≤ M j 2 mj^2\le a_{n,j}\le M j^2 mj2≤an,j≤Mj2一致成立(即 m m m和 M M M是相同的),则 ∑ j = 1 n a n , j = Θ ( n 3 ) \sum_{j=1}^na_{n,j}=\Theta(n^3) ∑j=1nan,j=Θ(n3).
注:其实 Θ \Theta Θ记号本身就要求了一致性。这里的 ∑ Θ \sum\Theta ∑Θ只不过把这种一致性的要求扩展到关于两个变量。
Q6: 利用Q5的记号分析插入排序。
A6:
Worst case: ∑ j = 2 n Θ ( j ) = Θ ( n 2 ) \sum_{j=2}^n\Theta(j)=\Theta(n^2) ∑j=2nΘ(j)=Θ(n2)
Average case: ∑ j = 2 n Θ ( j / 2 ) = Θ ( n 2 ) \sum_{j=2}^n\Theta(j/2)=\Theta(n^2) ∑j=2nΘ(j/2)=Θ(n2)(当然也可以写 ∑ j = 2 n Θ ( j ) = Θ ( n 2 ) \sum_{j=2}^n\Theta(j)=\Theta(n^2) ∑j=2nΘ(j)=Θ(n2))
归并排序(Merge sort)与其渐近分析
Q0: 从 T ( n ) = Θ ( 1 ) + 2 T ( n / 2 ) + Θ ( n ) T(n)=\Theta(1)+2T(n/2)+\Theta(n) T(n)=Θ(1)+2T(n/2)+Θ(n)这一形式上的表达式,你能回想起归并排序的步骤吗?
A0: 第一项 Θ ( 1 ) \Theta(1) Θ(1)是递归出口:如果 n = 1 n=1 n=1,则直接完成。第二项 2 T ( n / 2 ) 2T(n/2) 2T(n/2)是对数组的前半部分和后半部分分别(递归地)运用归并排序(这里略去了取整等细节,之后能证明这是没有影响的)。第三项是归并过程。
Q1: 简述递归树(Recursion tree)方法如何形式上对 T ( n ) = 2 T ( n / 2 ) + c n T(n)=2T(n/2)+cn T(n)=2T(n/2)+cn作渐近分析。
A1: