1.定义
通常把算法中基础操作重复执行的次数(频度)作为算法的时间复杂度
2.解释
算法的增长率越大,重复执行次数越多,时间复杂程度越大,
算法增长率越小,重复执行次数越少,时间复杂程度越小
所以往往时间复杂程度低的算法更优。
T(n)=O(f(n))
T(n)则是算法执行总次数
T(n)的导数就是函数的增长率
n是问题规模
T(n)的数量级=O(n)
看的是算法执行时间的增长率,而不是看算法每次能够执行的数值。
假如A算法每次执行次数是1000,但是增长率是10
B算法每次执行次数是100,但是增长率是1000,肯定是B算法的增长率高。但是B的算法就没有A的算法效率高
关键需要知道执行次数=时间
把cpu每次执行的次数称为单位时间
- 这样的用大写的O()来提现算法时间复杂度的计法,称之为大O记法。
- 一般情况下,随着输入规模n的增大T(n)增长最慢的算法为最优算法。
3.推导大O阶方法
- 用常数1取代运行时间中的所有加法常数。
- 如果最高阶项存在且不是1,则去除这个项相乘的常数。
- 得到最后的结果就是大O阶
例题平方阶
1.请问下面代码的大O是多少
int sum =0,n=100;
printf("66666\n");
printf("66666\n");
printf("66666\n");
printf("66666\n");
printf("66666\n");
sum = (1+n)*n/2
其中随着n的增大,除了只有一个是关于n的计算(最后一个),其他都是常数计算,所以答案:O(1)
2.嵌套循环判断大O
int i,j,n=100;
for(i = 0;i < n; i++)
{
for(j = 0;j < n; j++)
{
printf("6666\n");
}
}
其中内外嵌套循环,外部执行一次,内部执行n次,外部执行n次,内部执行n*n次
所以答案:O(n^2)
int i,j,n=100;
for(i = 0;i < n; i++)
{
for(j = i;j < n; j++)
{
printf("6666\n");
}
}
对数阶例题
int i=1,n=100;
while(i < n)
{
i = i * 2;
}
分析可知
i = 1时 i = 2
i = 2时 i = 4
i = 4时 i = 8
以此类推
当 i = n时,循环结束
设x个2相乘等于n,则有
2^x = n
则有x=log(2)n
时间复杂度为O(logn)