算法导论学习笔记[0] #20210706

这篇博客主要介绍了为何研究算法和性能的重要性,详细探讨了插入排序和归并排序的渐近分析。插入排序的最坏情况复杂度为O(n^2),而归并排序的复杂度为O(nlogn)。通过递归树方法解释了归并排序的时间复杂度分析。
摘要由CSDN通过智能技术生成


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] > keyA[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 nN+,j=1,,n,有 m j 2 ≤ a n , j ≤ M j 2 mj^2\le a_{n,j}\le M j^2 mj2an,jMj2一致成立(即 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:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值