一个数组只有100个元素时,随便写个双重循环排序,毫秒级响应。用户量涨到10000,同样的代码直接让服务器崩溃。这不是硬件问题,是时间复杂度选错了。

Big O Notation(大O表示法)是工程师在写第一行代码之前,用来预判性能的通用语言。它不测实际运行秒数,只回答一个核心问题:当输入规模n膨胀时,你的算法会怎么表现?

打开网易新闻 查看精彩图片

O(1):常数时间,与数据量无关

索引取数组第一个元素,永远是1步操作。无论数组里有10个还是1000万个整数,耗时不变。这是哈希表查询、数组随机访问的底气。

Go代码示例:getFirst函数直接返回arr[0],标注为O(1)。

O(n):线性时间,随数据量正比增长

遍历整个数组找最大值,循环次数等于元素个数。n翻10倍,操作量翻10倍。这种可预测性让它成为大多数场景的安全选择——至少不会突然爆炸。

Go代码示例:findMax函数用单循环扫描,标注为O(n)。

O(n²):平方时间,规模杀手

嵌套循环是典型的n²结构。n=100时,1万次操作,眨眼完成。n=1000时,100万次操作,开始吃力。n=10000时,1亿次操作,用户已经关闭页面。

冒泡排序就是这种结构:外层循环n轮,内层循环n-i轮,总操作量逼近n²。教学演示可以,生产环境慎用。

Go代码示例:bubbleSort函数的双重循环,标注为O(n²)。

三种复杂度的实战边界很清晰:O(1)追求极致响应,O(n)承担常规流量,O(n²)仅限小数据量或离线任务。选错类别,功能在测试环境完美通过,上线即超时。

这篇文章只覆盖了最基础的三个。O(log n)和O(n log n)才是搜索和排序的工业级解法——二分查找、归并排序、快速排序都建在这之上。下一篇拆解。