目录
进入时间和空间复杂度章节
时间复杂度的意义
对一个程序做测试时,其结果可能受限于测试数据、场景等情况,并不会很准确严谨,所以,自己用程序来验证分析是比较稳妥的,借此,可以将程序调整到效率最高
时间复杂度以大写字母O表示
常见的时间复杂度
常数:O(1),1表示常数,所有能确定的数字,都用O(1),哪怕一个程序执行了10W次,只要能确定,那就是O(1),因为我们在计算时间复杂度的时候,一般都是计算比较大,并且不确定的情况,已经确定了,那就是O(1)
对数:O(logn),举个例子
int n = 100000000;
int i = 1;
while(i <= n) {
i = i * 2;
}
假设n是未知的,求程序执行的次数,就可以有一个等式关系 2的x次方等于n,x就是执行的次数,所以x就等于log以2为底,n的对数
忽略掉参数,那就是log n
线性:O(n),举个例子
int num = 100000;
int count = 0;
for (int i = 0, i <= num, i++) {
count = count + 1;
}
假设num未知,也就是说num越大,程序执行次数越多,忽略掉参数,就是O(n)
线性对数:同样的,线性对数就是O(log n)
平方:O(n^2),比如从1加到n,就是一个等差数列求和,也就是 n*(n+1)/2,忽略参数,就是n^2
N次方:O(n^N)
时间复杂度的计算
从上面来看,整理下来,要计算一个时间复杂度,应该从最高阶计算,找运行最多的地方
1、找有循环的地方
2、找有IO的地方,包括网络请求,数据库的请求,磁盘交互
时间复杂度排序
O(1)>O(log n)>O(n)>O(n*log n)>O(n^2)>O(n^N)
优化的目标就是往O(1)的方向走,更直观点,可以画一个走势图来对比
空间复杂度
空间复杂度就比较清晰,直接找开辟了空间的地方,比如创建了一个集合,创建了一个数组,开了多少了,那就是占用了多少,集合就看放进去了多少数据