程序效率--空间复杂度和时间复杂度

一、概念

(1)时间复杂度

      我们为什么要引入这些个概念呢?因为我们想要的是执行一个算法耗费的时间,这个时间理论上可以得到,但是,要得到这个时间就必须要上机测试,但是有这个必要吗?我们需要知道的是哪一个算法需要的时间多,哪一个算法需要的时间少,这样就可以了。而且算法的耗时和语句的执行次数是成正比的,即语句执行越多,耗时越多,这也就是我们引入概念的原因。

      一般情况下,算法中基本操作重复执行的次数问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度

一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)

注意:时间频度与时间复杂度是不同的,时间频度不同但时间复杂度可能相同

(2)列举一些简单例子的时间复杂度

排序:O(1)<O(log n)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2^n)<

常数时间<次线性时间<线性时间<线性乘对数时间<平方时间。。。

快速排序:最坏情况运行时间是 O(n²),但期望时间是O(nlogn)

穷举法:比如求具有n个元素集合的所有子集的算法---2^n

全排列:O(n!) 比如求具有N个元素的全排列的算法

二分查找:O(logn) 一个算法如果能在每个步骤去掉一半数据元素,如二分检索

(3)最坏时间复杂度和平均时间复杂度  

       最坏时间复杂度: 一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。

       平均时间复杂度:平均时间复杂度也是从概率的角度看,更能反映大多数情况下算法的表现。当然,实际中不可能将所有可能的输入都运行一遍,因此平均情况通常指的是一种数学期望值,而计算数学期望值则需要对输入的分布情况进行假设。平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的。

二、求时间复杂度

1、根据定义,可以归纳出基本的计算步骤 
(1)计算出基本操作的执行次数T(n) 
    基本操作即算法中的每条语句的执行次数一般默认为考虑最坏的情况---找到执行次数最多的语句
(2)计算出T(n)的数量级 
    求T(n)的数量级,只要将T(n)进行如下一些操作:
    忽略常量、低次幂和最高次幂的系数
    令f(n)=T(n)的数量级

(3)用大O来表示时间复杂度 

三、综上

1、取决于执行次数最多的语句,如当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

2、如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)

3、算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。

大牛的博客:点击打开链接点击打开链接点击打开链接点击打开链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值