| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> (二)算法分析 -> 正文阅读 |
|
[数据结构与算法](二)算法分析 |
专栏:数据结构与算法分析 上一篇: (一)数据结构绪论 下一篇: 文章目录??算法(algorithm) 是对特定问题的求解步骤的一种描述,是指令的有限序列,其中一条指令表示一个或多个操作。 ??根据算法编制的程序最终是要运行在计算机上,由计算机执行程序最终得出结果。所以我们需要考虑的是程序执行完毕得出结果需要多少时间,以及占用了多少资源(通常指占用内存)。
1. 估计算法资源消耗所需??估计算法资源消耗所需,通常有两种方法,分别是实验统计和理论分析。 1.1 实验统计
??这种方式虽然可以得到较为准确的运行时间和占用空间数据,但是需要由算法编写出相应的程序并在机器上运行,比较费时间。对于同一个算法,使用不同的编程语言编写或者同一个编程语言使用不同的实现也会对运行时间造成影响。同时,计算机硬件配置不同,运行速度有快有慢,得到的数据也只能作为参考,并不说明在其它机器上也消耗这么多资源。 1.2 理论分析
??理论分析的方法仅仅是得到资源消耗与问题规模大小之间的关系,并非是实际时间数据,因此,要估算出算法所需的资源消耗,还需要在计算机上运行实际程序,得到输入在某个规模大小时对应时间值和占用空间大小,以此推算出算法在不同问题规模下所需的相应资源消耗。
1.3 实验统计与理论分析??实验统计和理论分析方法各有优势。理论分析较为简便,通用性好,但无法得到实际数据,只能估算。实验统计方法耗时久,受环境因素影响大,但针对性强。 2. 算法复杂度??算法复杂度 即算法所需资源与数据规模之间的增长关系,分为 时间复杂度 和 空间复杂度。 2.1 时间复杂度 (Time complexity)??算法总是假定运行在计算机上,但是并不指定计算的性能。为了便于分析,我们把计算机执行一条简单指令或执行由数条简单指令构成的复合指令的时间都定为1。
??下面我们尝试对一个实现的简单算法分析其运行时间与数据规模大小之间的关系。 2.1.1 一个简单的例子??这里是一个计算通项公式为 a i = i 3 a_i = i^{3} ai?=i3 的数列的前 N N N项和 S ( N ) = 1 3 + 2 3 + 3 3 + ? + N 3 S(N) = 1^{3} + 2^{3} + 3^{3} + \cdots + N^{3} S(N)=13+23+33+?+N3 的简单程序片段:
??函数中的代码一共4句,由于我们将语句的运行时间计算简化,所以对于有固定数量指令组成的顺序语句(第1句和第4句),运行时间都算作1,而循环语句我们则根据其执行的次数计算。
??按照以上的分析,运行时间
T
(
N
)
=
1
+
(
N
+
1
)
+
N
+
1
=
2
N
+
3
T(N) = 1 + (N+1) + N + 1 = 2N+3
T(N)=1+(N+1)+N+1=2N+3。
??通过由数据绘制成的散点图可以看到,这些点布大致分布在一条直线上,和之前的结论一致,并且由线性关系可以得到数据规模变为原来的两倍,则运行时间也变为原来的两倍。 2.1.2 不同复杂度之间的对比??我们试着画出其中的几个复杂度,分别是 O ( N ) , O ( log ? N O(N), O(\log N O(N),O(logN可以看到,在 N N N 值较小时,各复杂度差别不大。
??随着规模的增大,不同复杂度之间的差距越来越大,规模仅仅到100,指数阶 O ( 2 N ) O(2^N) O(2N) 已遥遥领先,其它复杂度所引起的时间增长几乎可以忽略不计,这就是为什么我们之前在对 T ( N ) = a N + b T(N) = aN+b T(N)=aN+b做粗略估计时,只看最高的线性阶,而不管常数 b b b 的值,因为当规模达到一定大小时,低阶项所带来的影响微乎其微。 ??我们可以进行一个简单的计算,当数据规模增长为原来的1000倍时,复杂度为线性阶 O ( N ) O(N) O(N) 的算法运行时间增长为原来的1000倍,而平方阶 O ( N 2 ) O(N^2) O(N2)则增长为原来的一百万倍,指数阶 O ( 2 N ) O(2^N) O(2N) 的增长已经超过 1 0 300 10^{300} 10300倍,对数阶 O ( log ? N ) O(\log N) O(logN)仅仅为原来的 10 10 10 倍,常数阶 O ( 1 ) O(1) O(1) 则不变。 2.2 空间复杂度(Space complexity)??空间复杂度 主要关心随着问题规模的增大,占用内存空间的增长率,记作 S ( N ) S(N) S(N)。
??和时间复杂度类似,同样有线性阶 O ( N ) O(N) O(N),平方阶 O ( N 2 ) O(N^2) O(N2) ,对数阶 O ( log ? N ) O(\log N) O(logN) 和常数阶 O ( 1 ) O(1) O(1) 等,最常见的是常数阶和线性阶。 专栏:数据结构与算法分析 上一篇: (一)数据结构绪论 下一篇: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 23:36:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |