算法时间复杂度的计算

算法时间复杂度的计算一、算法时间复杂度定义在进行算法分析时候,语句总的执行次数T(n)是关于问题规模n的函数,进而分型T(n)随着n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间度量记作:T(n)=O(f(n)).它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度.其中f(n)是问题规模n的某个函数.简单来说T…

大家好,又见面了,我是你们的朋友全栈君。

一、算法时间复杂度定义

        在进行算法分析时候,语句总的执行次数T(n)是关于问题规模n的函数,进而分型T(n)随着n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间度量记作:T(n)=O(f(n)).它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度.其中f(n)是问题规模n的某个函数.

简单来说T(n)代表时间频度:一个算法中语句执行次数称为时间频度

时间复杂度就是:算法的时间复杂度描述的是T(n)的变化规律,计作:T(n) = O(f(n))。

这里用大写的O( )来体现算法时间复杂度的记法,我们称之为大O记法.

二、推导大O阶方法(游戏秘籍三部曲)

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项乘积的常数。

三、常数阶

let sum = 0, n = 100  //执行一次
sum = (1 + n) * n / 2  //执行一次
return sum //执行一次

这个算法的运行次数是f(n)=3,与n的大小无关
根据推导大O阶的方法,常数项3改为1,即时间复杂度为O(1)
对于分支结构(不含循环结构),无论真或假,执行的次数都是恒定的
不会随着n的变大而发生变化,其时间复杂度也是O(1)

四、线性阶

for(let i=0;i<n;i++){
   
   /* 这里是时间复杂度为O(1)的程序步骤序列*/

}

关键就是要分析循环结构的运行情况
上面这是一个for循环,那么它的时间复杂度又是多少呢?首先循环体就是一个执行一次的循环体,总共执行了n次,那么执行次数就是f(n) =n,启动我们的游戏攻略三部曲知道,时间复杂度就是为O(n).

五、对数阶

let count=1;
while(count<n){
    count=count*2
}

对数阶不是很好理解
每次count都会乘以一个2,他会距离n更近一步
这里详细解释一下
count=1时 1<n count=2 2的一次方
count=2时 2<n count=4    2的二次方
count=4时 4<n count=8    2的三次方

到2的x次方大于n的时候 循环就结束了
由2的x次方等于n –> x = logn,时间复杂度为O(logn)
常见的二分查找就是以上思路,时间复杂度为O(logn).

六、平方阶

for(let i=0;i<n;i++){
    for(let j=i+1;j<n;j++){
        
     /* 这里是时间复杂度为O(1)的程序步骤序列*/

    }
}

由于当i = 0时,内循环执行n此,当n = 1时, 执行了 n – 1 次, …当 i = n-1 时, 执行了1次,所以总的执行次数为:
n + (n -1) +( n -2 ) +… +1 = n(n +1)/2 = n^2/2 + n/2

根据我们的游戏秘籍的三部曲(保留最高阶,去除最高阶不是1的常数项),我们可以分析出来,时间复杂度为 O( n^2 ).

七、常见算法时间复杂度

算法时间复杂度的计算

 

笔者最近看《大话数据结构》,总结了一点,最后一张图网上找的。需要《大话数据结构》pdf高清电子版的铁汁留言,我在评论区发你!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146697.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • django的orm查询方法_查看django版本命令

    django的orm查询方法_查看django版本命令前言查找是数据库操作中一个非常重要的技术。查询一般就是使用filter、exclude以及get三个方法来实现。我们可以在调用这些方法的时候传递不同的参数来实现查询需求。在ORM层面,这些查询条件都

    2022年8月7日
    5
  • mysql8 安装启动报错[通俗易懂]

    注意点1my.ini配置,其中这两项一定要按这个格式,双引号及双反斜杠,否则初始化时会报下面的错basedir="D:\\tool\\MYSQL\\mysql-8.0.12-winx64"datadir="D:\\tool\\MYSQL\\mysql-8.0.12-winx64\\data"[mysqld]#Removeleading#andsettothe…

    2022年4月15日
    71
  • 计算机夏令营、预推免面试经验【北理cs,北航cs,复旦cs大数据,浙大cs】「建议收藏」

    计算机夏令营、预推免面试经验【北理cs,北航cs,复旦cs大数据,浙大cs】「建议收藏」这是一篇非寻常经验贴,因为今年疫情影响下的保研实在是太奇怪了,这里主要说说我了解到的一些学校的一些特点,可以做参考首先推荐一个计算机保研群,和各大机构的不一样,里边全是历届保研的同学们,大家都知道的很多,在这个群里我真的学到了不少,群主虎哥也很nice个人状况末流211物联网工程专业1/64夏令营入营:南方科技大学(优营)听说这个学校很有钱,这里有一个很好的老师,好像是搞,如果是冲老师去的可以报,但知名度实在不高,也没有牌子,自己权衡吧南开人工智能学院(杰出营员):感谢南开ai,是我梦开始

    2022年7月25日
    118
  • C++11新特性之线程操作

    C++11之前没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到

    2021年12月28日
    39
  • idea2021.4.14 永久激活码_通用破解码

    idea2021.4.14 永久激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    70
  • 级联下拉菜单的实现「建议收藏」

    级联下拉菜单的实现「建议收藏」级联下拉菜单的实现

    2022年4月25日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号