这里告诉你如何计算算法的时间复杂度(大O阶)!

关于时间复杂度:

在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串>的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦>即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完>毕,那么它的渐近时间复杂度是 O(n3)。
------来源:https://zh.wikipedia.org/wiki/%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6

为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。因此,总运行时间和算法的操作单元数量最多相差一个常量系数。
Step:
1、用常数1替代语句频度中所有的加法项
2、在(1)的结果中,只保留数的最高项
3、最高阶项若系数不为1,则去除系数(或是改为1)

如果你没看懂,那继续往下看,笔者以例子与你详细介绍:
例子1:

for(int sum=0,i = 0;i < N;i++)  //1、
    for(int j = 0;j <N;j++)     //2、
        sum=sum+i*j;           //3、

我们以一个语句记为1次,来:
1、1+ (N+1)+N (这里定义两个变量共一次,而中间循环 理论是判断是N次,但是实际上应该是N+1 最后等于N时还有判断1次 0~N 故为N+1,循环变量的递增一共是N次)
2、N+N(N+1)+NN(这里由第一个循环进入第二个循环,一共是N次,那么将会定义N次,单独分析判断语句它将会像第一层循环一样,一个判断N次 再算上 第一次循环进入第二次循环共有N次 故 为N(N+1) 后面类似 NN )
3、NN(第二层循环进入最里面语句 N次 第一层循环进入第二层循环 共N次 故实际为NN次)
那么累加一下:
1+(N+1)+N+N(N+1)+NN+NN 保留最高项 N*N
故算法的时间复杂度为O(N^2)
例子2:

int j = 0;
for(int sum = 0,i = 1;i < N;i = i*2)   //1、
        sum = sum+i*j;             //2、

看到这程序片段,你是不是一眼就得出答案了?如果你不注意的话,你的答案肯定是O(N),对了吗?
先告诉你答案为O(log(N)) 不是这个答案的,你可以试试代个确切的N值进去 看一下次数,自己体会一下,那么下面我和大家一起分析下:
1、1+log(N)+1+log(N)
2、log(N)
其实这里做判断的时候,应该看一下循环变量的递增方式,这里它是i=i*2 也就是 2^x=N 那么X=log2(N) x就是次数,在计算复杂度里面,一般省略底数,也就是直接写log(N),其他的计算方法与上面的解释一致。
例子3:

for(int sum=0,i = 0;i<N;i++)        //1、
    for(int j = 1;j < N;j = j*2)     //2、
        sum=sum+i*j;                //3、

答案分析:
1、1+N+1+N
2.N+N(log(N)+1)+Nlog(N)
3、Nlog(N)
时间复杂度O(Nlog(N))
如果你认真从上看下来,这里我相信你应该 能够理解如何去计算时间复杂度了,那么任何程序相信在你们自己的简单化下,应该都能分出它们的大致大O阶。
那么,关于算法的时间复杂度就描述到这里。

发布了19 篇原创文章 · 获赞 3 · 访问量 3812

猜你喜欢

转载自blog.csdn.net/weixin_42792088/article/details/100528959
今日推荐