1.9简单的算法分析和优化
(1) 复杂度
为了描述一个算法的优劣,我们引入算法时间复杂度和空间复杂度的概念。
时间复杂度:一个算法主要运算的次数,用大 O 表示。通常表示时间复杂度时,我们只保留数量级最大的项,并忽略该项的系数。
当然,如果有多个字母对算法的运行时间产生很大影响,就把它们都写进表达式。如对 m×n 的数组遍历
的时间复杂度可以写作 O(mn)。
空间复杂度:一个算法主要占用的内存空间,也用大 O 表示。
在实际应用时,空间的占用是需要特别注意的问题。太大的数组经常是开不出来的,即使开出来了,遍历的时间消耗也是惊人的。
(2) 常用算法的时空复杂度
1s 运算次数约为 5,000,000①。也就是说,如果把 n 代入复杂度的表达式,得数接近或大于 5,000,000,
那么会有超时的危险。
常见的数量级大小:O(1)<O(logn)<O(n)<O(nlogn)<O(n的二次方)<O(n的三次方)<O(2n)<O(n!)
(3) 简单的优化方法
1. 时间的简单优化方法
时间上的优化在于少做运算、做耗时短的运算等。有几个规律需要注意:
整型运算耗时远低于实型运算耗时。
位运算速度极快。
逻辑运算比四则运算快。
+、-、*运算都比较快(-、*比+慢一点点,可以忽略不计)。
/运算比+、-、*慢得多(甚至慢几十倍)。
取余%和除法运算速度相当。
调用函数要比直接计算慢(因为要入栈和出栈)