-内存和查找 Lecture 10 - Memory and Search
-内存和查找 Lecture 10 -
看懂内存层级如何决定不同查找算法的实际速度
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
-内存和查找 Lecture 10 -
看懂内存层级如何决定不同查找算法的实际速度
Lecture 10 Introduction
你在手机相册翻一张旧照片,几秒就出;但同样的查找放在备份硬盘里可能要等几分钟。差距从哪来?——不是算法不够聪明,而是数据所在的「物理位置」决定了成本。
桌上=缓存(秒到)、阅览室=主存(几步路)、书库=磁盘(要上楼调档)
Search Algorithms
Search Algorithms:定义、要点与典型应用
Binary Search
上页我们看到二分查找是搜索家族里最快的成员。但它的快有代价——它有一条硬性前提,也藏着微妙的实现陷阱。今天我们把它彻底拆开看。
每次猜中点,根据'大了/小了'砍掉一半可能
Selection Sort
查找告诉我们「数据在哪」,排序则解决「数据怎么排」。我们从最直观的排序算法开始——选择排序。
每次扫一遍所有牌,把最小的抽出来放到手牌最左;剩下牌里再找最小,继续放左
Selection Sort Demo
上一页我们说选择排序的本质是「每轮挑一个最小值归位」。但挑是怎么挑的?归又是怎么归的?这页我们用动画把它拆开看。
每轮扫一遍剩余同学找最矮的,拎到当前空位,边界右推一位
Another Selection Sort D
上一页我们用随机数组演示了选择排序。这次换个更有挑战的输入——含有重复元素的数组,看看会发生什么,以及它暴露出选择排序哪些深层的性质。
每轮从剩余队伍里挑最矮的站到下一格;遇到两个一样高的,交换到前面时不保留谁先来的信息
Amortized Cost Analysis
Selection Sort 不管数据如何,每次都是 O(n²)。但有些操作偶尔极贵、大多数时候很便宜——比如动态数组扩容。这次需要新的衡量方式。
一次性大支出按月分摊,月供固定——关注每期平均价而非某次爆发性开销
Merge Sort
上页 Selection Sort 在最坏情况下是 O(n²),n 一大就跑不动。Merge Sort 走出另一条路:用分治思想把大问题拆成小问题。
每次比较两摞最上面那张牌,把较小的先放进结果,直到一摞空
Merge Sort Demo
上页我们说归并排序的核心是「分而治之」——但只看结论还是模糊。现在用一个具体的小数组,把拆分和合并两步完整走一遍,看清每一步究竟在做什么。
每次比较两摞最上面那张牌,把较小的抽走放到结果堆,直到一摞抽完再把另一摞全部倒入
Hashing
前面我们看到,线性查找要逐个扫、二分查找要折半——都和数组长度有关。有没有办法拿到键就直接知道它在哪儿?
取件码(key)→柜机算格子号(hash)→直接开门;两件同格挨着放或叠挂
本节要点
- ✓不同数据结构对应不同查询代价:数组 O(n)、哈希 O(1)
- ✓分治将 O(n²) 降到 O(n log n),关键在合并
- ✓摊还成本关注操作序列均值,非单次最坏
- ✓二分查找的隐性前提:输入必须已排序
- ✓哈希的常数时间代价是冲突处理与函数设计
课后思考
先自己思考,再对照参考答案——答案只是路径,不是终点。
参考答案数组支持随机访问 O(1) 取中点;链表只能顺序遍历取中点,整体退化到 O(n),得不偿失。
参考答案哈希表均摊 O(1) 但需哈希函数与额外空间;二分 O(log n) 无需额外空间但依赖有序与随机访问。
参考答案归并频繁申请新数组,缓存命中率低;快排原地操作局部性好,实际常数更小。