数据结构学习Day2——时间复杂度与空间复杂度
时间复杂度
时间复杂度记为 T(n)=O(f(n))
- 其中T(n)代表算法中所有语句的频度之和,它是该算法问题规模n的函数。时间复杂度主要分析T(n)的数量级。时间复杂度T(n)是问题规模n的函数。
- 时间复杂度公式的通俗理解: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,公式全称:算法的渐进时间复杂度。
- O的含义是T(n)的数量级。
- 算法的时间复杂度不仅依赖于问题规模n,也取决于待输入数据的性质(如输入数据的初始状态)。
- 在分析一个程序的时间复杂度时,有以下两条规则
1. 加法规则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
2. 乘法规则
T(n)=T1(n)*T2(n)=O(f(n)*O(g(n))=O(f(n)*g(n))
空间复杂度
空间复杂度记为 S(n)=O(g(n))
- 算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。
一个时间复杂度的例子
for (int i = 0; i < n; i++) { //执行n次
for (int j = 0; j < n; j++) { //执行n^2次
num++; //执行n^2次
}
}
这段代码的时间复杂度为O(n^2).
我的计算方法:
- 因为从0到n只需要操作n次,所以只需进行n次判断即可。设外层for循环为一个基本操作,需要的时间为T1(T1为执行一次
for (int i = 0; i < n; i++)
所需要的时间),由于外层for循环执行n次,所以运行时间就是n*T1。 - 接下来,设内层循环为一个基本操作,需要的时间为T2(T2为执行一次
for (int j = 0; j < n; j++)
所需要的时间),由于内层for循环执行n^2 次,所以运行时间为n^2*T2. - 之后,设num++为一个基本操作,需要的时间为T3(T3为执行一次
num++
所需要的时间)),由于num++执行了n^2 次,所以运行时间为n^2*T3。 - 最后,我们可以得出总的运行时间T=n* T1+n^ 2* T2+n^2* T3。在问题中n为用户输入,n会根据用户输入进行变化。当n越大,上式中的n^ 2越大,也就是说对式子影响最大的是n^ 2。所以,删掉其他部分得到T=O(n^2)。通过这种方法,可得知这段代码的运行时间与输入的n的平方成正比。
- O这个符号的意思可以理解为“忽略重要项以外的内容”。O(n^ 2)的含义就是“算法的运行时长最长也就是n^ 2的常数倍”。通过这种方法可以直观地了解算法的时间复杂度。