
Summary 当你你手里有一本厚厚的电话簿,要找"张伟"这个名字。你会从第一页一页页翻——还是会直接翻到中间,看看翻到的是"李"还是"王":姓氏排在"张"前面就往后翻,排在后面就往前翻。每翻一次,剩下要找的范围就少一半。一千页的电话簿,最多翻十次就能定位。 这就是二分查找的全部思想:在一个有序的范围里,每次砍掉一半...

Summary 当你你手里有一本厚厚的电话簿,要找"张伟"这个名字。你会从第一页一页页翻——还是会直接翻到中间,看看翻到的是"李"还是"王":姓氏排在"张"前面就往后翻,排在后面就往前翻。每翻一次,剩下要找的范围就少一半。一千页的电话簿,最多翻十次就能定位。 这就是二分查找的全部思想:在一个有序的范围里,每次砍掉一半...

Summary 排序看起来是个"把一堆数从小到大摆好"的小学生问题,但是它是算法入门里性价比最高的一站。 学习这个算法需要建立三种直觉: 分治(把大问题切成小问题再合并) 复杂度(为什么有的 O(n²) 有的 O(n log n),差在哪) 稳定性(相等元素的相对顺序会不会被打乱)。 这三样东西后面到处都用得上——快...

Summary 时间大概是我们最熟悉又最陌生的东西。每个人手腕上、手机里、墙上都有钟,但很少有人能答上来这些问题:一秒到底是怎么定义的?为什么全世界几十亿部手机显示的时间几乎分毫不差——背后是谁在给它们对表?“公元 2026 年"里的"公元"是从哪算起的?为什么会有闰秒这种东西,它又怎么在 2012 年宕掉了半个互联...

Summary 前面讲队列的时候,规则是"先进先出"——排队买票,来得早的先走。但现实里大量场景不讲先来后到,只讲谁最急:医院急诊室按病情严重程度排,操作系统按优先级调度进程,定时任务按到期时间触发。 这类需求抽象出来是同一个操作:在一堆动态变化的数据里,随时取出"最小(或最大)的那一个"。堆就是为这个操作而生的结构...

Summary 前面的数组、链表、栈、队列都是"一条线"——每个元素最多一个前驱、一个后继。但现实世界大量是层次关系:文件系统的目录树、公司的组织架构、HTML 的 DOM、区块链的 Merkle 树。树就是描述这种"一对多"层次关系的结构。更重要的是,树把查找从线性结构的 O(n) 压到了 O(log n)——这是...