| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 走进算法和数据结构(三)——算法绪论(三) -> 正文阅读 |
|
[数据结构与算法]走进算法和数据结构(三)——算法绪论(三) |
14天阅读挑战赛
下面,我们分开学习,先来看时间复杂度。
这种用大写的O来表示时间复杂度的记法叫做大O记数法。?O为键盘上I、P之间的那个字母,不是0、1、2、3、4中的0。 随着n的增大,T(n)增大最慢的那个一般就是最优算法。
我们分别介绍以上几类时间复杂度。 常数阶:先来看一段代码
每个语句都执行了一次,则函数f(n)=3,用大O表示就是O(3),但在表示时间复杂度时,如果遇到的是常数,则用常数1代替运行中所有的其他常数,于是,上面这个程序的时间复杂度记为O(1)。
以上代码执行了14次,则函数为f(n)=14,根据上面我们所说的大O记法规则,O(14)应该记为O(1)。 因此,上面这种,能用常数计数的算法复杂度,统统记为O(1),称为常数阶。 线性阶:先看一段代码
我们看到,函数f(n)=n+1+1,根据上一节的知识,常数可以忽略不计,于是1+1我们忽略不计,函数f(n)=n,因此,上面代码的时间复杂度为O(n)。 f(n)=n是线性函数,因此,这种形式的时间复杂度也被称为线性阶。 多项式阶:根据上一节的内容,我们有以下多项式的理论:
看一段代码:
?为了更准确地分析,我们去掉了到代码中其他的元素,只拿出来关键的循环来分析。 x=x+1从一次循环中,我们执行了一次,从内到外函数f(n)便可以表示为: 根据多项式的理论,我们知道,这段代码的时间复杂度为O()。 这段代码我们可以看到,有时候,复杂度其实转化为了一个数学问题,只要有一定的数学基础,复杂度的计算并不难。 对数阶:下面的代码又该如何处理呢?
运行1次:i=,在判断完i<n时候才结束; 运行2次:i=; 运行3次:i=; …… 运行x次:i=。 运行第x次便是i=n时,于是n=,解得:。 通常,我们在算出并写对数复杂度时,把底数2或者其他数值省略,仅表明这是个对数便可以了,于是上面的代码时间复杂度为O(),这便是对数阶。 指数阶:简单举例一个代码
通过上面多项式阶的计算,我们可以很快知道,这段代码的复杂度函数为,因此,这段代码的时间复杂度为O()。 当然常见的其他时间复杂度还有很多,我们整理为:
我们可以看到,从左向右,当到了O()时,当n稍微大一点,结果将是个大的数字,因此,在日常考试等设计中,一般我们最多用到?O(),当然,在实际操作中可能会用到更大的数量级。
我们还可以得出:
?当然,根据代码段有时候我们是不能直接计算运行次数的,如下面的代码段:
因为这个代码段中,运行次数依赖于数组a[n]中x所在的位置,如果在一个位置,那查找一次就能完成,如果在最后一个位置,那需要执行n次,如果按照概率中的平均来说,那需要次。因此有些算法,可能需要用最好、最差、平均时间复杂度来衡量,但是,对于实际运用有意义的是最坏时间复杂度。 以上便是时间复杂度的主要内容,下一节我们将一起学习空间复杂度和算法绪论中其他几个零散知识点。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:43:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |