(d)算法分析
掌握大O与大Ω两端的分析工具,能为算法画出上下界,也能解释为何排序不可能更快。
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
(d)算法分析
掌握大O与大Ω两端的分析工具,能为算法画出上下界,也能解释为何排序不可能更快。
: 算法分析
前面我们认识了算法的定义与表示,但要真正选对算法,还需要量化它的'开销'。算法分析就是这套量化工具——回答的不是'这次跑了多久',而是'规模变大时会怎样'。
不是测一辆车过桥多久,而是看车流变密时桥的反应;最坏情况对应地震/超载
: 级数
上一节用大 O 衡量代码增长,但很多循环要先把 1+2+…+n 算出来才能下结论。这套求和工具,就叫级数。
阶梯轮廓是梯形,面积=(1+n)×n/2,正好是等差求和
: 循环
上节我们用级数描述算法总工作量,本节回到源头:这些级数从哪来?答案是循环。代码里绝大部分工作量都来自循环,所以分析复杂度,本质就是数迭代了多少次、每次做了什么。
传送带每转一圈加工一批,迭代变量记圈数,达标即停线——最直观的循环形象
: 实例:非极端元素+起泡
上页用等差级数收尾循环求和。这页把同一把刀落在真实算法上——起泡排序每趟都有一位「极端」选手一路冒到顶,其余「非极端」选手中途就被拦下。
冠军(极端)必须跑完全程才排第一,其他选手(非极端)只要被前面超过就停下
: 正确性的证明
起泡排序跑通了,但'跑通'≠'永远正确'。测试只是抽查,正确性证明才能对所有输入给出保证。
测试抽查几户,证明对照规格逐条核验所有情形
: 封底估算-1
证完正确性,紧接着会问'它跑得动吗'。与其列精确方程,不如先在封底粗算数量级——这就是封底估算。
不细到立方米,但能判断'一辆金杯够不够';够就不用细算,不够再上方程
: 封底估算-2
上一页讲了封底估算的核心思路——不求精确,只抓量级。这一页把它落到具体数字上:记住几个基准量、做几次单位换算,就能秒判一段代码是秒级还是天级。
距离÷平均速度≈时间;总操作数÷CPU 速度≈运行时间
本节要点
- ✓分析剥离实现层,揪住操作计数与增长趋势
- ✓正确性靠不变量,效率靠量级,二者不可互替
- ✓封底估算把抽象阶数落到具体数字与时间
课后思考
三道题没有标准答案。建议先遮住参考答案自己琢磨,再对比思路差异。
参考答案量级只看最高阶项的增长趋势;精确计数则保留每一项与常数。封底估算刻意丢掉细节,是用精度换速度。
参考答案把内层执行次数写成外层变量的函数,看它对求和贡献了哪种级数(等差、等比或其他),然后只保留量级最大的那一项。
参考答案当多个算法复杂度同阶但常数差距大,或'有效 n'很小时,常数会反过来主导性能,必须结合实测规模判断,不能只看书。