目录
复习时间
幂函数
指数函数
对数函数
编辑
时间复杂度
推导阶的原则
常见的时间复杂度举例
常数阶 O(1)
对数阶 O(logn)
平方阶 O(n^2)
图像表示
空间复杂度
常见的空间复杂度举例
常数阶 O(1)
线性阶 O(n)
平方阶 O(n^2)
一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
复习时间
幂函数
指数函数
对数函数
时间复杂度
为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。因此,总运行时间和算法的操作单元数量最多相差一个常量系数。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
简单理解就是一个算法或是一个程序在运行时,所消耗的时间(或者代码被执行的总次数)。
在下面的程序中:
int sum(int n) {
① int value = 0;
② int i = 1;
③ while (i <= n) {
④ value = value + i;
⑤ i++;
}
⑥ return value;
}
假设n=100,该方法的执行次数为①(1次)、②(1次)、③(100次)、④(100次)、⑤(100次)、⑥(1次)
合计1+1+100+100+100+1 = 303次
则:f(n) = 3n+3
即:T(n) = O(3n+3)
O()括号里面的数更多的表达的是这个算法的量级,并不是准确的执行次数。
推导阶的原则
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项系数存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
推导过程
- 3n+3 =用1替代加法常数=> 3n+1
- 如果是 n^2+3n 则只保留 n^2 ,此处没有所以为 3n
- 3n =去除系数=> n
最终结果:时间复杂度为 O(n)
常见的时间复杂度举例
常数阶 O(1)
public void Function(int n)
{
for (int i = 0; i < 100; i++)
{
n++;
}
}
不管n为多少,程序始终执行100次,f(n) = 100 => O(1)
对数阶 O(logn)
public void Function(int n)
{
for (int i = 1; i < n; i *= 2)
{
//...
}
}
最终 2^x >= n 结束,次数 x = log2 n,简写为O(logn)
平方阶 O(n^2)
public void Function(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
//...
}
}
}
循环内代码执行次数为 n*n,这种嵌套多少层就是指数就是多少
图像表示
空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
常见的空间复杂度举例
常数阶 O(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
线性阶 O(n)
int[] m = new int[n];
int j = 0;
for (int i = 1; i <= n; ++i)
{
j = i;
j++;
}
注意:这里为 O(n) 是因为new了一个长度为n的数组,循环内并没有分配新空间。
平方阶 O(n^2)
int[,] Arr = new int[n, n];