计算
既是对象:规律、技巧
又是目标:高效、低耗
Hailstone序列无法确定有穷还是无穷,因此不能算是算法(但可以写出程序)
程序≠算法
好算法最重要的是:效率
计算模型
图灵机
RAM模型
好处:能够客观度量算法时间(通过计算步骤次数)
大O记号(考虑最坏情况下)
不断放大,直至可以用常数表示
另外两种记号
高效解
不含转向(循环、调用、递归等),必顺序执行,即是O(1)
但也要具体问题具体分析
这个属于高效解,因为无限接近于O(1)
有效解
难解
指数形式为intractable,与多项式有明显分界
增长速度
要放眼长远
算法分析
封底估算
直观感受时间
迭代与递归
迭代特点:
变成一个可以轻易解决的平凡问题,和与原问题类似的子问题
递归跟踪:
递推方程:
分而治之:
减而治之的算法中,递归实例分别是:1个规模为n的实例、1个规模为n-1的实例、1个规模为n-2的实例、…,共有n个。
分而治之的算法中,递归实例分别是:1个规模为n的实例、2个规模为n/2的实例、4个规模为n/4的实例、…,共有1+2+4+8+…+n个。
递归跟踪与递推方程都是用于计算时间复杂度
递归跟踪直接忽略递归式,计算每一个递归里面的时间,再乘上递归的个数
递推方程需要列出递推式(n与n-1关系),再递推到n与1的关系,得到n的式子
二分递归:
动态规划
递推方程:
fib数列时间复杂度计算过程
封底估算:
递归跟踪:
用递归跟踪的方式分析为什么计算速度慢:大量递归实例被重复计算
迭代:
用新的方法计算fib
最长公共子序列:
LCS:递归
减而治之的思路求解LCS
情况1为一个递归基
分而治之
LCS:理解
LCS:复杂度
大量雷同的子情况导致复杂度高
LCS:动态规划
逆向计算