时间复杂度 计算_一个算法的时间复杂度为

时间复杂度 计算_一个算法的时间复杂度为时间复杂度分析、计算时间复杂度的速度

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1. 时间复杂度分析

1.1 概述

试分析如下两个方法,分别执行了多少次?
在这里插入图片描述

分析:
func2里的i < n执行了n+1次,因为包括一次不通过的判断

说明:
为了方便我们的书写表达,我们一般使用T(n)表示程序的总执行次数,n是输入数据的大小或输入数据的数量,T是当输入数据为n时,某段代码的总执行次数。

在这里插入图片描述
问题说明:
        作为衡量代码的执行速度的依据,当代码比较多的时候,使用T(n)就有点麻烦了,我们还需要一条条语句去数,而且函数调用函数的时候,运算起来也很麻烦。所以算法一般使用T(n)简化的估算值,来衡量代码执行的速度。这个简化的估算值叫做时间复杂度

1.2 根据T(n)得出时间复杂度

结论1:
        当T(n)的值为:常数,那么时间复杂度可以直接估算为1。
在这里插入图片描述
结论2:
        当T(n)的值为:常数*n + 常数,那么时间复杂度的计算为:

  1. 去掉常数项,因为随着n的增大,第一部分的值不断变大,而第二部分对于第一部分无任何影响
  2. 去掉第一部分的系数,或者理解为将第一部分常数估算为1

在这里插入图片描述
结论3:
        当T(n)的值为:多项式,那么时间复杂度的计算为:

  1. 保留n的最高次项,因为随着n的增大,后面的项远远不如最高次项的增长大,所以可以直接省略低次项
  2. 去掉最高次项的系数

在这里插入图片描述

补充:
上诉表示的时间复杂度并不完整,我们还需要加上大写字母O,也叫大O表示法
在这里插入图片描述
总结:
在这里插入图片描述

1.3 常见代码的时间复杂度

说明:
为了更快求出时间复杂度,我们需要学习一些常见代码的时间复杂度

案例1:

没有循环、没有判断,只有一条条的语句
在这里插入图片描述

案例2:

只有一重循环
在这里插入图片描述

案例3:

多重循环
在这里插入图片描述
说明:
printf()本身执行一次,但是在里层循环的作用下,执行了1*n次,然后在外层循环的作用下,整体执行了(1*n)*n

案例4:

多个循环
在这里插入图片描述
说明:
我们需要以运行时间最长的循环作为时间复杂度的依据
所以时间复杂度取n的最高次幂

案例5:

存在if判断语句
在这里插入图片描述
还是以运行时间最长的循环作为时间复杂度的依据
所以时间复杂度取n的最高次幂

1.4 常见且特别代码的时间复杂度

案例1:

在这里插入图片描述
分析:
此案例中内循环的条件在不断变化,每当 i 增加1,里层循环就会少执行1次。
将每个执行次数相加可得出总执行次数的不精确结果!
最后得出的时间复杂度结果为:
在这里插入图片描述

案例2:

在这里插入图片描述
分析:
此案例中 i 每次都成2倍的变化,我们先假设 n = 8 和 n = 16 进行讨论:

  1. 通过假设能够得出printf()的执行次数为3和4
  2. 3和4只是printf()执行的次数,完整的次数应加上判断,相乘,初始化的次数
    在这里插入图片描述
  3. 在简化成时间复杂度的时候,都会省略掉
    在这里插入图片描述
  4. 对执行次数主要的影响来源于 i *= 2,通过观察可以发现:
    在这里插入图片描述
  5. 通过对数法则可得T(n):
    在这里插入图片描述
  6. 不过上面只是统计了printf的次数,写完整一点:
    在这里插入图片描述
  7. 由于时间复杂度需要去掉系数和常数,所以时间复杂度为:
    在这里插入图片描述
  8. 最后对数的底数和系数是一样的,也需要去掉,所以最后的结果为:
    在这里插入图片描述

2. 时间复杂度的速度(重要!)

说明:时间复杂度使用来描述一个算法的快慢程度的,所以我们有必要了解时间复杂度的速度

2.1 常见的时间复杂度

说明:
横坐标代表数据大小或数量,纵坐标代表时间复杂度
通过图示能够发现随着数据量增大,时间复杂度呈现何种变化

1)对比:O(1)和O(log n)的变化
在这里插入图片描述
2)对比:O(n)和O(nlog n)和O(n2)的变化
将纵坐标放大到100
在这里插入图片描述
3)对比:O(n2)和O(n3)和O(2n)的变化
将纵坐标放大到10000
在这里插入图片描述

总结:上诉时间复杂度时间进行排序(由快到慢)
在这里插入图片描述

2.2 拓展

2015年NOIP普及组题目
在这里插入图片描述

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

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

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


相关推荐

  • 一文看懂Web后端开发「建议收藏」

    一文看懂Web后端开发「建议收藏」一文看懂Web后端开发前言由于网络上系统地介绍后端开发的文章实在太少,而最近有恰巧有许多同学问我“什么是后端开发?”、“你为什么喜欢后端开发?”、“做后端都需要学什么?”,那么我们就来讲一讲,到底什么才是后端开发。定义后端开发(Back-EndDevelopment,也称服务端开发、服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程序和资源合称为后端,即在服务器上运行的、不涉及用户界面的部分)的过程,是Web应用程序开发的一部分。后端开发者使用Java、Golang等语言及其衍生的各

    2022年6月29日
    25
  • php中的id是什么意思,itemId是什么意思「建议收藏」

    php中的id是什么意思,itemId是什么意思「建议收藏」1.Http://www.worldchineseweekly.com/weekly_cn/article/show.php?itemid=4433笔笔柔情、有力,而且清爽,不仅显示学院的扎实功底,且毫不拘泥。2.TheitemidwillbepassedtotheAssocReportandthusresultinjustpresentingrulesw…

    2022年10月9日
    3
  • 免费的mysql可视化工具_centos7安装oracle

    免费的mysql可视化工具_centos7安装oracle以前安装过几十次的mysql。今天还是遇到问题(虽然是因为是局域网ip不通无法远程连接),记录一个完整的安装过程。1.yum卸载yum安装之后如果需要卸载1.命令rpm-qa|grep-imysql或者yumlistinstalled|grepmysql查看安装的mysql安装包将查出来的安装包通过yumremove卸载yumremovemysql-comm…

    2022年9月23日
    3
  • 极限思想之芝诺悖论[通俗易懂]

    极限思想之芝诺悖论[通俗易懂]芝诺悖论是古希腊哲学家芝诺提出的一组悖论。芝诺是一个很有学问,同时也很好玩的人(淘气)。他如果在中国出生,估计很难大学毕业,只能跟池子(脱口秀演员~)一样,高中教室门外面站三年课,然后去讲脱口秀糊口。阿基里斯,大家都知道。古希腊神话中的战神。无论是力量,速度,耐力,格斗技巧,都是巅峰级别的。一夜睡三女,第二天依然可以血染特洛伊的男人。芝诺就提出:在跑步比赛中,如果跑得最慢的乌龟一开始领先…

    2022年6月18日
    37
  • matlab 插值出错,MATLAB插值问题

    matlab 插值出错,MATLAB插值问题一、一元函数插值已知函数y=f(x)在区间[a,b]上的n+1个不同点的函数值为,若存在一个简单函数F(x),使,称F(x)为f(x)在区间[a,b]上的插值函数,称(xi,yi)为插值节点。若F(x)为多项式,称为多项式插值(或代数插值);常用的代数插值方法有:拉格朗日插值,牛顿插值。n次代数插值:已知f(x)在n+1个点x0,x1,…,xn处的函数值为y0,y1,…,yn,求一个n…

    2022年6月4日
    29
  • 电商后台管理系统主页布局[通俗易懂]

    电商后台管理系统主页布局[通俗易懂]目录一点睛1整体布局1.1先上下划分,在左右划分。1.2菜单分两级,并且可以折叠。2通过接口获取菜单数据二代码1新增主页Home.vue2注册组件element.js3修改main.js4新增欢迎组件Welcome.vue5修改路由index.js三测试效果四代码参考一点睛1整体布局1.1先上下划分,在左右划分。1.2菜单分两级,并且可以折叠。2通过接口获取菜单数据通过ax…

    2022年5月22日
    49

发表回复

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

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