注意!!!!!本篇文章有错误或者错漏!!!!!请对照其他教程阅读
设计算法有难也有易,有复杂,也有简单的。有的算法需要很多步骤的执行,有的算法执行非常简单,但是卓有成效。当我们面对两种不同的算法,我们就需要一种方法来分析算法的复杂度。这篇文章便是我关于算法的复杂的分析这节课的笔记
算法的时间复杂度
算法的时间复杂度比较法,即衡量算法运行所需要的时间,但并不直接参照算法的运行时长,时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的关系,即是算法运行时间随着数据量变大时的增长趋势。
要计算时间复杂度,我们需要知道以下的变量
n:数据的规模
T(n):算法执行的时间
f(n):表示每行代码执行总次数
O:这个就代表算法的时间复杂度
常见的关系有:
↓↓↓越靠近这里的算法越好↓↓↓
常数阶 | O(1) |
线性阶 | O(n) |
平方阶 | O(n^2) |
立方阶 | O(n^3) |
K次方阶 | O(n^k) |
对数阶 | O(log(n)) |
线性对数阶 | O(nlog(n)) |
指数阶 | O(2^n) |
阶乘阶 | O(n!) |
看不懂?下方是我在网上找的一张图。原文地址点此访问
↑↑↑越靠近这里的算法越差 ↑↑↑
关于算法的时间的复杂度的计算,我们先来看下面的一串代码
int A(int n)
{
printf("%d", 0);
return 0;
}
int B(int n)
{
for (int i = 0; i < n; i++)
{
printf("%d", i);
}
return 0;
}
int C(int n)
{
for (int i = 0; i < n; i++)
{
printf("%d", i);
}
return 0;
}
上方有3个函数
函数A:算法运行时长不与输入的数据n成比例,其运行时长为一个常数,我们称之为常数阶
算法B:算法运行时长不与输入的数据n成正比,我们称之为线性阶段
算法B:算法运行时长不与输入的数据n成比例,虽然其运行时长比较长,但是其运行时长仍然为一个常数,仍然还是常数阶。
假如一个函数运行时长与输入数据的规模的函数差不多长这个样子:T = 66n^3 + 55n + 44,我们先将常数去掉,然后只保留最高的项数,最后把最高项的系数去掉,即该算法的O为立方阶。
假如想要更深的了解算法的时间复杂度,可以前往以下的两个链接了解更多
参考资料:hello算法,点此访问 io-wiki,点此访问
空间复杂度
时间复杂度与空间复杂度比较类似,只需要将相应的时间概念转化为储存空间即可,其用于衡量算法占用内存空间随着数据量变大时的增长趋势。与空间复杂度类比即可。