数据结构,邓俊辉老师
平台——学堂在线 https://www.xuetangx.com/course/THU08091000384/5883586?channel=learn_title
能够成为像呼吸一样对人而言的一种本能
—— 对大数学家欧拉称赞
剖析算法的两大任务
两个任务 = 正确性 + 复杂度
自:什么是正确性?—— 见本笔记后文
一种事实:
C++等高级语言的基本指令,均等效于常数条RAM的基本指令;在渐进意义下,高级语言的基本指令与RAM的基本指令数,可理解为等价
算法的灵魂,分支转向,goto
级数求和的能力+ 递归跟踪 + 猜测和验证
分解能力一:级数求和
代码复杂度,思维上对应矩形的面积
算数级数
最基本形式,算数级数
从某个数开始,以固定间隔为单位,不断线性递增
幂方级数
对于任何一个幂方次,无论2,3,4,5,我们都在算数级数基础上变成2次方,2三次方,2的四次方等等
在大O意义下,我们可以归纳
幂方级数的总和,应该比幂的次项高出一阶
+准确分析,幂方级数求和转化为0到n之间x的d次方的积分
几何级数
位数呈现几何式的增长,用大O记号渐近意义下,与级数末项同阶
自己思路:这里很好理解,也是“去粗存精”式的一种估算
收敛级数
每一项收敛足够快,总和不超过某一个上界
上界从渐近意义上讲,都可以视作为常数,从大O记号角度看,都可以记作O(1)
+问题,这类级数有必要讨论吗?
几何分布的一种情况
同样存在常数上界,大O记号下记作O(1)
+自己问题,认为描述几何分布级数求和应该为(1-lambda)(1+lanmbda^1 + lambda^2 + lambda^3+…)
+重点,调和级数和对数级数
这两种级数,后面会经常遇到
调和级数,它的界可以估计为logn,是确界
对数级数,对数的和=乘积的对数,渐进为nlogn
循环
具体实例1与2
二重循环,两个控制变量相互之间没有耦合
外循环要求内循环反复迭代n趟
+记忆,直观反馈,二维矩形
i和j两个控制变量,构成两个维度,矩形中每一个点,都对应于内部o1operation(i,j)操作的一次执行
具体实例2
与上述渐近阶次相等
具体实例3与4
内部循环j增长步长更大
依然构成算术级数,而我们在头脑里构成二维图景
因为步长更大,每一趟内循环长度缩减到 j/2013
具体实例4
外层循环不是线性增长,而是左移一位,每次乘以2
换而言之,内循环的长度i,将以2为倍数呈现出几何级数的形式
实例,取非极端元素 和 起泡排序
对于任何整数子集S,元素互异
找出一个元素a,既不是最大的又不是最小的
算法:从s中任取三个元素x,y,z,
—— 无论输入规模n有多大,算法的执行时间为一个固定不变的常数
一个算法正确性的证明
更一般的例子,起泡排序
给定n个对象,这里简化为整数,将它们按序排列
事实:任何序列中,任意/总有一对相邻元素顺序/逆序
策略:扫描交换
整个过程,可以精确描述成下方代码
典型的二重循环模式
外层,逐行扫描交换,直至完全有序
内层,逐对检查A[o, n)内各相邻元素
- 不变性:经过k轮扫描交换后,最大的k个元素必然就位
- 单调性:经过k轮扫描交换后,问题规模缩减至n-k
- 不变形与单调性推出——> 正确性:经至多n趟扫描后,算法必然终止,且能给出正确解答
+老师寄语,
学会在其他场合,运用不变形和单调性——> 正确性的方法
+了解
- 费米 Enrico Fermi 1901-1954 测定原子弹爆炸当量时,只用了一张纸(延申,当量表示产生同样能量所需的TNT炸药的重量)
- 埃拉托斯特尼 Eratosthenes 276~194
B.C. 得到早期测量地球周长的最准确结果
+老师寄语
抓住问题的主要方面
从而简洁得出问题总体规律,很自然运用到其他分析中
建立封底估算概念
1天 = 24h* 60min * 60sec 约为25 * 4000 = 10^5sec
1生 以1世纪算 = 100yr * 365 = 3* 10^4 day = 3* 10^9 sec
三生三世 = 300yr = 10^10
+概念建立,在三生三世中的一天,相当于一天中的一秒
宇宙大爆炸至今 = 10^21
改进算法的重要性
MergeSort的时间复杂度为nlog(n)
因此,使用MergeSort对算法进行改进,一个10^9数量级的问题可以使用普通PC机在30秒解决
迭代与递归,见后续课程笔记