0_时间复杂度的计算

算法复杂度

算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。

时间复杂度是学习算法的基石,因此在学习算法之前,必须要知道如何去计算一段代码的时间复杂度,下面就根阿导一起来看看吧。

如何计算一个程序的时间复杂度

如下面一段代码,如何计算它的时间复杂度呢?


    int a= 10;
    
    int b= 10;
    
    System.out.println(a+b);
    

这个应该是很简单的,一眼就能看出来,其时间复杂度是 O(1),那接下来稍微来个复杂一点的


    int a = n;
    int b = 0;
    for(int i = 0 ; i < a ; i++){

        b++;

    }


有经验的程序员都知道上面的代码时间复杂度为 O(n),那么时间复杂度究竟是如何推导出来的呢?下面请允许阿导娓娓道来。

假定每一句执行的时间都是 k,下面我将上述按照执行时间来划分,如下图所示

时间划分执行代码语句

红色代码代码部分执行时间为 3k,原谅色代码部分执行时间为 (n+1)k,蓝色代码部分执行时间为 2nk。

那么上述代码执行时间可表示为 f(n) = (3n+4)k,明显这就是一个函数式,下面会涉及到一个量级的概念,就是将 n 趋近无穷大,然后得出最终渐进结果即为该段代码的时间复杂度,怎么理解呢,如下表所示:

nf(n) = (3n+4)k
17k
100304k
1000030004k
100000000300000004k
1000000000000000030000000000000004k

你会发现,当 n 变成无穷大的时候,系数的影响微乎其微,我们只关注函数结果影响最大的项,因此上段代码我们会将其复杂度表示为 O(f(n))~O(n)。

既然引出量级的概念,那么在计算复杂度的时候,存在不同的量级就会舍去低的量级,下面给出数学中量级比较关系,如下图所示

数学中量级比较

小结

笔至此处,已渐尾声,下面我将计算复杂度的流程整理一遍。

  • 先假定每一句执行代码时间为 k

  • 然后分析代码语句,并得出执行时间的数学表达式

  • 接下来就是简化数学表达式,首先将 k 至为 1

  • 将所有常数替换成 1

  • 只保留高阶项(也就是量级最大的一项)

  • 去掉系数,得出最终结果即为时间复杂度

不知各位看官是否已明了,如有疑问,欢迎留言,如有不当之处,请多多包涵和指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值