时间复杂度与计算机硬件有关,时间复杂度计算

时间复杂度计算

算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单操作次数的乘积。通常把算法中包含简单操作次数的多少叫做“算法的时间复杂性”。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程序的执行时间通常有以下两种方法:

① 一种是“事后统计”的方法。因为很多计算机内部都有计时功能,有的甚至可精确到毫秒级,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种“事前分析估算”的方法。

“事前分析估算”的方法基于:一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

a、依据的算法选用何种策略。不同算法、不同策略所消耗的 CPU 时间显然是不同的;

b、 问题的规模。例如求

100 以内还是 1 000 000 以内的素数;

c、书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低;

d、编译程序所产生的机器代码的质量:编译器的区别、版本会有所不同;

e、机器执行指令的速度。

显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算法的效率是不合适的。撇开这些与计算机硬件、软件有关的因素,可以认为一个特定算法“运行工作量”的大小,只依赖于问题的规模(通常用整数量

n 表示),或者说,它是问题规模的函数。

一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。

例如,在如下所示的两个

N*N 的矩阵相乘的算法中,“乘法”运算是“矩阵相乘问题”的基本操作。整个算法的执行时间与该基本操作(乘法)重复执行的次数 n 3

成正比,记作

T ( n ) =O ( n^ 3 )。

for i:=1 to n

do

for j:=1 to

n do

begin

c[i , j]:=

0;

for k:=1 to

n do c[i , j]:= c[i , j]+a[i , k] * b[k , j]

end;

一般情况下,算法中基本操作重复执行的次数是问题规模 n

的某个函数 f ( n ),算法的时间量度记作:

T ( n ) = O ( f ( n ))

它表示问题规模 n 的增大、算法执行时间的增长率和 f ( n

)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

显然,被称作问题的基本操作的原操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下它是最深层循环内的语句中的原操作,它的执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数,例如:在下列三个程序段中,

x:=x+1

for i:=1 to n

do x:=x+1;

for j:=1 to n

do

for k:=1 to

n do x:=x+1

含基本操作“ x 增 1 ”的语句 x:=x+1 的频度分别为

1 , n 和 n^2 ,则这三个程序段的时间复杂度分别为 O ( 1 ), O ( n ), O ( n^2

),分别称为常量阶、线性阶和平方阶。算法还可能呈现的时间复杂度有:对数阶 O ( log n ),指数阶 O ( 2^n )等。在 n

很大时, 不同数量级时间复杂度显然有 O ( 1 ) < O ( n^3 )

一般情况下,对一个问题 ( 或一类算法 )

只需选择一种基本操作来讨论算法的时间复杂度即可,有时也需要同时考虑几种基本操作,甚至可以对不同的操作赋以不同权值,以反映执行不同操作所需的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。

由于算法的时间复杂度考虑的只是对于问题规模 n

的增长率,则在难以计算基本操作执行次数 ( 或语句频度 ) 的情况下,只需求出它关于 n

的增长率或阶即可,一般可忽略常数项、底阶项、甚至系数。

例如,在下列程序段中 :

for i:=2 to n do

for j:=2 to i-1 do x:=x+1

语句 x:=x+1 执行次数关于 n 的增长率为 n 2 ,它是语句频度表达式 (n-1)(n-2)/2

中增长最快的一项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、数据结构部分 考点1. 算法复杂度分析问题:能够给出特定算法用大O表示的时间或空间复杂度 考点2. 线性表的存储结构对比问题:链式存储和顺序存储的优缺点对比,各使用于那种应用场合 考点3. 树、二叉树和森林的相互转换问题:树<->二叉树<->森林之间的转换问题,注意树的左孩子右兄弟表示法 考点4. 二叉树的构造与遍历问题:给定二叉树,能给出相应的前中后序遍历序列;给定一个中序遍历序列,再给出一个前序或后序遍历序列,构造出二叉树 考点5. Huffman树的构造与Huffman编码:节点的权值,根到叶子节点的路径长度;给定一组数据的出现频率,构造相应的Huffman码 考点6. 图相关的定义问题:有向图,无向图,连同,强连通等概念的对比 考点7. 图的最小生成树问题:Prim算法和Kruskal算法的具体步骤,给定一个图,能使用给定的算法构造相应的最小生成树 考点8. 图的关键路径问题:给定一个图,能求出相应的关键路径,并且能给出求关键路径所需的中间表格 考点9. 二分查找算法的基本方法:给定一组数据和需要查找的关键字,能够给出二分查找经过的节点序列 考点10. 排序算法的特征问题:给定一组数据的初始状态和经过若干论排序后的状态,能推断出所使用的排序算法 二、计算机组成原理部分 考点1. 计算机硬件系统与冯诺依曼体系结构:五大件、存储执行、顺序执行、数据与操作有相同存储方式 考点2. 补码运算:补码的加减乘除法;给定两个数,能给出相应的计算过程和结果 考点3. ALU的结构与并行进位加法:并行进位加法公式的推导等 考点4. DRAM的刷新问题:三种刷新方式刷新效率的计算 考点5. Cache替换算法与写方法:各种不同替换算法的原理,写直达与写回 考点6. Cache与虚存的效率问题:使用Cache和虚存对存取效率提高的比率计算 考点7. 常见的寻址方式:各种寻址方式的寻址过程,使用到的硬件设备 考点8. 时序系统:三级时序系统之间相互的关系 考点9. I/O设备相关指标及计算问题:访问速率,存储容量,访问周期等指标的计算 考点10. 指令执行过程与CPU控制信号传输过程:取指令,分析指令,执行指令,不同指令指令周期中各个微操作以及相应的微指令序列 一、数据结构部分   考点1. 线性表的基本操作问题:顺序表,单链表,带头结点的单链表,双向链表上的增删改操作   考点2. 稀疏矩阵的压缩存储问题:稀疏矩阵的三元组表示,特殊矩阵的压缩存储,矩阵中元素下标的计算   考点3. 特殊线性表的性质问题:栈的FILO和队列的FIFO性质及其在实际问题中的应用   考点4. 基于二叉树性质的计算问题:计算二叉树的层数,节点总数,叶节点数等   考点5. 二叉排序树的构造与基于其的查找问题:给定数据序列,能给出相应的二叉排序树   考点6. 图的存储结构问题:图的矩阵表示,链表表示等表示方法的特点,以及不同的图,不同的应用问题中存储方法的选择   考点7. 图的最短路径问题:Dijkstra算法,给定一个图,能够按照Dijkstra算法逐步找到单源最短路径   考点8. 散列查找的特点与散列表的构造问题:不同散列函数的使用,不同散列存储方式的特征   考点9. 排序算法的选择问题:根据给定的数据序列的特点,选择相应的高效排序算法   考点10. 排序算法的应用问题:在解决特定的应用问题时,使用合适的排序算法先对数据进行处理,可以简化问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值