很多人一听到“算法复杂度”就头大,觉得这是程序员才要懂的东西。其实它没那么玄乎,就像你点外卖时看配送时间一样——有的30分钟到,有的要等一小时,差别在哪?算法复杂度说的就是这个“快慢”的问题。
什么是算法复杂度?
简单说,就是衡量一段代码运行需要花多少时间和空间。比如你要从100个数字里找最大值,一种方法是逐个比一遍,那数据越多,花的时间就越长。这种“随数据增长而变慢”的程度,就是复杂度。
我们常用大O符号表示,比如 O(n)、O(log n)、O(n²)。别被这些符号吓到,它们只是描述“增长趋势”的工具。
O(n) 是什么概念?
想象你在一条队伍里找穿红衣服的人,只能一个一个看过去。如果队列有n个人,最坏情况要看n次。这就是 O(n),叫线性复杂度。
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
每多一个人,最多多查一次,成正比,很直观。
O(log n) 呢?
这就像是查字典。你想找“算”字,不会一页页翻,而是打开中间,发现是“王”字,知道要往前面找,再对半切。每次都能砍掉一半数据。
哪怕数据从100涨到100万,查找次数也不会翻几倍,只多一点点。这种效率很高,叫对数复杂度。
什么时候会遇到 O(n²)?
两个嵌套循环,比如班上有n个学生,每个人都要和别人握手一次。第一人握n-1次,第二人再握n-1次……总共大约 n×n 次。
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println("Hello");
}
}
当n变成原来的2倍,运行时间可能变成4倍。数据一大,程序就卡了。这也是为什么我们要避免“双重循环”处理大数据。
空间复杂度又是啥?
不只是时间,程序跑起来还要占内存。比如你读一个文件,如果一次性全加载进内存,那文件越大,吃掉的内存越多,这就是 O(n) 空间复杂度。
但如果你一行一行读,不管文件多大,内存只用一点点,空间复杂度就是 O(1),也就是“常数级”,最省资源。
普通人需要懂多深?
不是每个人都得推导公式,但了解基本概念能帮你判断:为什么有些功能反应快,有些总卡?为什么数据一多就崩溃?这背后往往就是复杂度在作怪。
比如你做个小商城后台,用户少的时候没问题,订单一上万突然变慢。很可能就是用了 O(n²) 的写法去处理订单列表。提前知道这些,就能早点优化。
算法复杂度听起来专业,其实本质是“效率思维”。学会看一眼代码就知道它能不能扛住压力,就像学会看营养表选食品一样,慢慢就成了日常技能。