把复杂度想成“当数据量 n 越来越大时,程序要跑多少步”。
O(log n) 与 O(n) 的核心区别,用一句大白话:
O(log n) 每翻一倍数据,只多跑一步;
O(n) 每翻一倍数据,得多跑一倍步数。
1 先抓直觉:电话簿翻名字
-
O(n):从第一页开始逐页扫描,3000 页就要看 3000 行。
-
O(log n):电话簿已按字母排序,你直接对半翻、再对半翻——最多翻 log₂3000 ≈ 12 次就能找到。
数据量翻 10 倍到 30 000 页,也只再多 3~4 次翻开而已。
2 数学图像
把 n 从 1 涨到 100 万:
| 数据量 n | O(log n) 步数 | O(n) 步数 |
|---|---|---|
| 1 000 | ≈10 | 1 000 |
| 1 000 000 | ≈20 | 1 000 000 |
O(log n) 曲线几乎躺平;O(n) 是45° 直线往上冲。
3 代码层面怎么一眼识别
-
一层循环把问题“砍掉一半” → O(log n)
例:二分查找、平衡二叉树查找、堆的插入/删除。while lo <= hi: # 区间每轮减半 mid = (lo + hi) // 2 ... -
一层循环把问题“逐个扫一遍” → O(n)
例:数组求和、链表遍历、顺序查找。for x in arr: # 每个元素都碰一次 s += x -
两层嵌套,每层都几乎扫 n → O(n²)
例:冒泡排序、暴力两数之和。
4 速记口诀
“折半砍 = log n,挨个扫 = n,套两层 = n 方。”
记住电话簿例子,以后看到“区间减半”“树往下走”就条件反射:
哦,这是 **O(log n)**,数据再大也不慌!

被折叠的 条评论
为什么被折叠?



