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)

最后修改:2022 年 03 月 09 日
如果觉得我的文章对你有用,请随意赞赏