数据结构-随笔

1、时间复杂度:大o表示法:O()

重点:看循环次数

由于是估算算法的时间复杂度,相比而言,循环结构对算法的执行时间影响更大。所以,算法的时间复杂度,主要看算法中使用到的循环结构中代码循环的次数(称为“频度”)。次数越少,算法的时间复杂度越低。

例如:

a) ++x; s=0;

b) for (int i=1; i<=n; i++) { ++x; s+=x; }

c) for (int i=1; i<=n; i++) { for (int j=1; i<=n; j++) { ++x; s+=x; } }

上边这个例子中,a 代码的运行了 1 次,b 代码的运行了 n 次,c 代码运行了 n*n 次。

时间复杂度的表示

算法的时间复杂度的表示方式为:

O(频度)

这种表示方式称为大“O”记法。

注意,是大写的字母O,不是数字0。

对于上边的例子而言,a 的时间复杂度为O(1),b 的时间复杂度为O(n),c 的时间复杂度为为O(n2)。

如果a、b、c组成一段程序,那么算法的时间复杂度为O(n2+n+1)。但这么表示是不对的,还需要对n2+n+1进行简化。

简化的过程总结为3步:

去掉运行时间中的所有加法常数。(例如 n2+n+1,直接变为 n2+n)

只保留最高项。(n2+n 变成 n2)

如果最高项存在但是系数不是1,去掉系数。(n2 系数为 1)

所以,最终a、b和c合并而成的代码的时间复杂度为O(n2)。

常用的时间复杂度的排序

列举了几种常见的算法时间复杂度的比较(又小到大):

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)对数加线性

2、空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,记做 S(N)=O(f(N))。

相对的,算法的时间复杂度就记为 T(N) = O(f(N))。

因为 S 是 Space(空间)的首字母,T 是 Time(时间)的首字母。

在计算算法的空间复杂度的时候,我们其实也不知道算法所消耗/占用的具体的内存大小(内存是以字节(Byte)为单位),我们计算的是算法所使用的(数据)结构的数量级。

比如说你使用 N 个大小为 N 的数组,那么其空间复杂度为 O(N2)。

我们只考虑算法在最坏情况下的复杂度

你可能感兴趣的:(数据结构-随笔)