-简单算法 Lecture 3 - Simple Algorithms

官方信息技术老师·12 页·深入(追求细节与边界)·0 次浏览·3 天前
二分搜索排序算法复杂度递归

-简单算法 Lecture 3 - Si

搞清线性与二分搜索、冒泡归并排序的实现差异与复杂度边界,从此按场景选算法

按 空格/→ 演示下一步

1 / 12 页

全部页面点击任意一页,跳回舞台从这页播放

二分搜索排序算法复杂度递归

-简单算法 Lecture 3 - Si

搞清线性与二分搜索、冒泡归并排序的实现差异与复杂度边界,从此按场景选算法

1第 1 页 · -简单算法 Lecture 3 - Si

Lecture 3 Introduction

上一节我们认识了程序的基本骨架——变量、循环、条件。今天开始让程序'找东西、算东西、排序东西',这些动作背后都有一个共同的名字:简单算法。

什么是算法
有限步内解决问题的明确指令序列
本课三大主题
查找类、统计类、初步排序类
前置工具
变量、if/else、for/while 已就位
照食谱做菜对应 →照算法写程序

食谱每步明确无歧义;同样的食材同样的做法,每次做出同样的菜

2第 2 页 · Lecture 3 Introduction

Iteration

在 Excel 里给 1000 个数都加 1,手动改几乎不可能,写一条「重复执行」的指令让电脑跑——这就是迭代的核心思路:把同一段动作反复做下去。

概念定义
重复执行一段代码,由终止条件控制何时退出
三要素
起点初始化、终止条件、迭代更新,缺一就出 bug
形式选择
for 已知次数 / while 条件驱动 / do-while 至少一次
边界陷阱
死循环、差一错误、循环不变量未保持三种典型坑
绕操场跑圈对应 →循环迭代

每跑一圈是一次迭代,规定圈数就是终止条件;忘了数圈就会一直跑(死循环)

3第 3 页 · Iteration

Guess and Check Algorith

上页我们学了用 for/while 做机械重复。但循环只是在搬砖——Guess and Check 才是把循环变成「解题」的第一个套路。它朴素却强大,是后续所有高效算法的出发点。

猜-检循环
遍历候选解,对每个候选做 check;命中即返回
两个构件
guess 造候选、check 验条件,两件事解耦
可枚举
候选空间能有序遍历时(整数、列表)才能用
cube root 例
从 0..step..ans 逼近,是 MIT 6.0001 经典案例
代价与动机
最坏扫遍整空间,规模一大就慢;引出 bisection
试钥匙开锁对应 →Guess and Check

逐把插锁孔试转,对应逐个候选 check;命中即停

4第 4 页 · Guess and Check Algorith

Loop Mechanisms

上次我们讲了 Iteration 和 Guess and Check——一个猜数字的程序会反复尝试直到猜对。但「反复」背后到底怎么实现?为什么有些循环跑 5 次就停,有些要跑百万次?这一页拆开看。

while 循环
由布尔条件守卫,每轮迭代前检查;次数不定,由条件变化决定何时停止
for 循环
由计数器驱动,迭代次数在进入前已知;适合遍历序列或固定重复
循环变量更新
每轮迭代必须推进状态:递增、递减或重新赋值,否则条件永不改变
终止性证明
必须存在单调递减的非负整数指标,证明循环终将停止——正确性的前提
绕操场跑步对应 →while vs for 循环

while 像「跑到喘不过气就停」——条件驱动;for 像「我决定跑 10 圈」——计数驱动

5第 5 页 · Loop Mechanisms

Floating Point Accuracy

上一讲我们用 abs(guess**2 - x) < epsilon 判断猜测是否够准。有人会问:为什么不直接 == 0?因为计算机里的 0.1 其实不是 0.1——这就是浮点精度问题。

二进制小数
计算机用二进制存小数,0.1 写成二进制是无限循环的 0.0001100…
存储截断
64 位浮点只存约 16 位有效数字,多余位被舍入,产生微小误差
误差累积
百万次迭代后,每次 1e-16 的误差会被放大成肉眼可见的偏差
禁用 ==
两个本应相等的浮点数可能差 1e-16,== 判断几乎永远为假
epsilon 容差
用 abs(a-b) < epsilon 判断「足够接近」,epsilon 通常取 1e-9
十进制写 1/3对应 →二进制写 0.1

1/3 在十进制写不完,0.1 在二进制也写不完——某些数在当前进制下必然无限循环

6第 6 页 · Floating Point Accuracy

Approximation Methods

上一节我们看到浮点数天生有误差——很多真实答案根本存不进去。但工程上我们往往不需要完美答案,够用就行。怎么在有限精度里找到「够好的值」?

初始猜测
先随便猜一个起点,哪怕离真相很远也没关系
迭代改进
用上一步的猜测,按规则算出一个更好的新猜测
逐步收敛
每迭代一次,新值都更接近真实答案
停止准则
变化足够小,或达到最大迭代步数时停下来
牛顿迭代
经典实现:用一行公式就能快速逼近平方根等
蒙眼找人喊「近了/远了」对应 →近似法

每次得到反馈(远近),据此调整下一步方向,最终定位目标

xn+1=12(xn+axn)x_{n+1} = \frac{1}{2}\left(x_n + \frac{a}{x_n}\right)
7第 7 页 · Approximation Methods

Bisection Search

上一页的猜数字游戏,如果对方只回「大了」或「小了」——最聪明的策略不是从 1 试到 100,而是每次把范围砍掉一半。

核心策略
在有序区间内取中点,根据反馈排除一半,循环至命中或区间为空
有序前提
数据必须有序,或答案关于猜测单调,否则「砍半」会砍错边
对数复杂度
每步搜索空间减半,n 个元素最多 ⌈log₂n⌉ 步即可定位
典型应用
有序数组查找、字典查词、猜数字、单调函数数值求根
边界细节
浮点用误差阈值终止;整数用 low>high 判搜空;mid 写法防溢出
字典里查单词对应 →二分查找

不逐页翻,翻到中间看首字母决定往前还是往后,每次砍掉一半

log2n\lceil \log_2 n \rceil
8第 8 页 · Bisection Search

Demo: Bisection Search

上页说 bisection 每步砍一半。这次玩个游戏:你心里想 1 到 100 的整数,我最多几次猜中?答案会让你意外——只要 7 次。

单调性前提
搜索区间必须单调有序,否则无法判断保留左半还是右半
折半判定
取中点比目标,丢弃不可能的一半,新区间规模 = n/2
收敛速度
O(log n) 步必收敛,n=100 时至多 7 步(因 2⁷=128≥100)
终止策略
精确匹配 or 容忍窗口 ε;浮点求根(如 √2)常用后者
字典里查生词对应 →bisection search

翻到中间 → 看首字母决定留前半还是后半 → 再翻中间 → 直到定位

kmax=log2nk_{\max} = \lceil \log_2 n \rceil
9第 9 页 · Demo: Bisection Search

Newton-Raphson Root Find

二分法像对半猜——稳但慢。如果知道函数在某点的斜率,就能'看清方向',一步到位附近。这就是 Newton-Raphson 的思路。

切线近似
在当前点画切线,与 x 轴的交点作为新的猜测值
迭代公式
x_new = x_old - f(x)/f'(x),每步如此更新
二次收敛
接近根时精度按平方增长,远比二分法快
需要导数
必须能计算 f'(x),复杂函数可能写不出
可能发散
导数为零或起点不好时,可能飞出去找不到根
下山时看坡度选方向对应 →Newton-Raphson 每步更新

切线斜率=山坡坡度;横截距=下一步落脚点

xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
10第 10 页 · Newton-Raphson Root Find

本节要点

  • 迭代本质是用重复逼近真相,不是穷举所有可能
  • 二分法慢但鲁棒,牛顿法快但依赖初值与连续性
  • 浮点精度划定算法边界,停止条件必须含容差
  • 猜-检是搜索类算法的骨架,for/while 选择看终止条件是否已知
  • 好算法=收敛速度、稳定性、实现复杂度三者的折中
延伸主题:收敛阶与复杂度分析牛顿法的病态初值递归与迭代的等价性
11第 11 页 · 本节要点

课后思考

先独立思考再对照参考答案。三个问题对应记忆、应用、迁移三个层次。

1二分查找要求区间两端函数值异号。如果两端同号会发生什么?为什么牛顿法没有这个限制?

参考答案二分法依赖介值定理,异号才能保证区间内有零点。牛顿法靠导数做线性逼近逐步迭代,不依赖区间假设,所以适用范围更广但对初值敏感。

2用牛顿法求根时,若初始猜测离真实根很远,可能出现什么情况?举一个现实场景说明好初值为何关键。

参考答案牛顿法可能发散或收敛到别的根。例如金融模型估算内部收益率时,若初值偏离真实利率太远,迭代可能跳出合理区间。工程上常先用二分粗定位,再用牛顿加速。

3二分查找终止条件通常用 |high - low| < ε。如果改成"函数值接近零就停",浮点精度问题会怎样影响结果?

参考答案浮点无法精确表示许多小数,函数值可能永远不严格为零,会导致死循环。用区间宽度判断更可靠——区间足够小时根必在其中,精度可控可量化。

12第 12 页 · 课后思考