数据结构 算法的时间复杂度

前言

首先来解决一个问题:什么是算法?
算法是对特定问题求解步骤的一种描述,是指令的有限序列。


值得一提的是,只要是算法,一定具有以下五个特性:

  1. 有穷性:一个算法必须要在有限步后结束,且每步都在有限时间内完成;
  2. 确定性:一个算法只能有唯一的执行路径,对于相同输入只能得出相同的输出;
  3. 可行性:一个算法是可执行的;
  4. 输入 :一个算法有零个或多个输入;
  5. 输出 :一个算法有一个或多个输出。 (算法可以没有输入,但一定有输出。因为如果没有输出,算法再优秀也看不出结果,不能解决问题)

一、算法的时间性能分析

我们对算法的时间性能分析,主要是看这个算法占用CPU时间的多少
有个看似很简单直接的方法:编写算法对应的程序,运行一下不就能知道它占用多少时间了吗?!表面上看好像确实是这么回事儿,但是仔细一琢磨,这种办法的缺陷实在是太多了,下面来列举几点:首先,用不同计算机语言写出来的同一算法程序其运行时间不同,比如在大多情况下C语言肯定比Java快。其次,两个一模一样的程序放在不同的电脑上运行,其占用CPU的时间也可能不等,运算速度快的电脑肯定用时较少吧…当然还有更多的因素在其中充当着不稳定因子,就不赘述了。按照这种方式来衡量算法时间性能的叫做事后统计法
那么现在问题来了,我们怎么样不通过运行程序来判断不同算法占用CPU时间的多少呢?诶,我们换一个角度,不妨想一想,本质上是什么东西在影响算法的执行时间呢?我们知道计算机执行一个程序,实际上就是执行一个接着一个的指令,那执行的指令一少,执行时间不就变少了吗?!(这里认为所有指令的执行时间在一个数量级上,时间差距不大)这样的话对应到高级语言上也就是判断执行操作语句的数量咯,操作次数越少,执行时间肯定越少!按照这种原理来衡量算法时间性能的叫做事前估计法。显然,这种分析方法更合理。

二、算法的频度

一条语句的频度是指:该语句在算法执行完成后总共被执行的次数。

一个算法的频度是指:算法中所有语句的频度之和,用函数T(n)表示

举一个简单的例子:

void printString(int n){
   
	for(int i=0;i<n;i++){
                 //------语句一
		printf("Hello World!");        //------语句二
	}
}

在这个算法中,①循环变量i从0一直递增到n,当i=n不满足判断条件时才结束循环,故一共执行了n+1次,可以说语句一的频度是n+1;②循环体中的语句二显然一共执行了n次,可以说语句二的频度是n 。那么这个算法的频度T(n)=n+1+n=2n+1 。

三、算法的时间复杂度

如果每个算法的时间性能分析都要用算法的频度T(n)来表述,那么这个问题将会变得十分繁琐且没有意义。原因很简单,试想有个成百上千行的代码交给你做时间性能分析,按照这个原则你得一条语句一条语句

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值