***数据结构与算法之时间复杂度“一”***
以T(n)线性阶复杂度为例引入:(小白都能看懂!因为我就是小白)
//算法1--逐步递增型爱你(例题采集于王道论坛)
#include <iostream>
#include <cstdio>
using namespace std;
void LoveYou(int n) {//n为问题规模
步数 1:int i = 1;
步数 2:while (i <= n)
{
步数 3: i++;//i的程度每次+1;
步数 4: printf("I Love You %d\n", i);
}
步数 5: printf("I Love You More Than %d\nTimes",n);
}
int main()
{
int n=0;
cin >> n;
LoveYou(n);
return 0;
}</cstdio></iostream>
以void函数为例分析,
语句频率:
1: --1次
2: --3001次(循环判断进行n+1次后跳出)
3、4: --3000次
5: --1次;
so: 时间复杂度表示:T(n)=1+3001+2*3000+1 ;即T(n)=3n+3
(时间开销与问题规模n的关系)
那么问题来了,当出现如递归算法这样的疯狂压栈操作(有兴趣的朋友不妨查找有关递归的时间空间复杂度及其底层数据处理方式)或其他更大规模开销时,该如何计算时间复杂度呢?
例如:
1. T(n)=
2. T(n)=
3. T(n)=
若
则
......当n接近无穷大时,可相对忽略低阶“小数“。
这时候我们引入大O表示法表示“同阶同等数量级”。即:当n趋向于无穷大时,二者之比为常数:T(n)=O(N)
其中N为n的不同阶任意多项式;
1、大O(n)的加法规则:多项式相加,只保留最高阶的项,且其系数变为 1(吸收律,吸收低阶的项式)
如: O(n^2)+O(n)结果为O(n^2)。
2、大O(n)的乘法规则:多项相乘,都保留
如:O(n)*O(n^2)结果为O(n^3)。
常见的时间复杂度按数量级递增排列依次为:
下面转载https://www.cnblogs.com/lfxiao/p/10695875.html
当你的算法能够以阶级递减复杂度时,那么恭喜你,你是伟大的创造师!
加油!