你有没有过这样的经历?在超市买菜,前面两个人结账,一个只买了一瓶水,另一个却推着满满一车东西。收银员处理前者只用了10秒,后者却花了5分钟。你站在后面,心里直嘀咕:这差距也太大了。
其实这就是“复杂度”的日常版
写代码也一样。同样完成一件事,有的写法快如闪电,有的慢得像老牛拉车。我们用“算法复杂度”来衡量这种快慢。它不关心你电脑多贵、CPU多强,而是看:当数据变多时,程序要花多少时间和空间。
时间复杂度:别让程序“卡成PPT”
比如你要在一个列表里找某个数。最简单的方法是从头到尾一个个比。如果列表有 n 个元素,最坏情况要比较 n 次。我们说它的时间复杂度是 O(n)。
再比如,你有个排序好的列表,可以用“二分查找”——每次砍掉一半范围。100个数最多查7次,1000个数最多10次。它的增长非常慢,复杂度是 O(log n)。
常见的还有 O(1),表示不管数据多大,操作都是一下子完成。比如访问数组的第5个元素,不管数组有一百个还是一万个,都是直接读,不耽误事。
空间复杂度:别让内存“爆仓”
程序运行时要占内存。如果你处理100个数据,却创建了10000个临时变量,那空间复杂度就是 O(n²)。数据一大,手机或电脑直接卡死。
举个例子:
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println(i + ", " + j);
}
}
这段代码会打印 n×n 次结果,时间和空间都随 n 的平方增长。当 n=1000,就要处理一百万次——这时候你就该考虑优化了。
常见复杂度排行榜(从小到大)
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)
看到 O(2ⁿ) 或 O(n!) 基本就可以准备跑路了。比如算10个数的全排列,O(n!) 要算3628800次。数据再大点,等到天荒地老都出不来结果。
为什么显示调校也要懂点复杂度?
你在调屏幕色彩、刷新率、HDR效果时,背后都是算法在实时处理图像数据。如果算法太慢,哪怕只是延迟了几毫秒,画面就会出现撕裂或卡顿。尤其是高刷屏时代,每秒要处理120帧,每一帧都必须在8毫秒内搞定。这时候,一个 O(n²) 的滤镜算法可能直接压垮系统。
所以,哪怕你不写代码,了解复杂度也能帮你判断:某些“一键美化”功能是不是在忽悠人。真高效的调校工具,底层一定用了低复杂度算法。
下次看到“极速优化”“瞬间完成”,不妨想想:它背后的复杂度是多少?别让漂亮的宣传语,掩盖了低效的本质。