计算

既是对象:规律、技巧
又是目标:高效、低耗
【数据结构】第零章

【数据结构】第零章

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:动态规划
【数据结构】第零章

逆向计算
【数据结构】第零章

【数据结构】第零章
【数据结构】第零章

相关文章: