算法的优劣~DS笔记②

算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的五个基本特性:输入、输出、有穷性、确定性、可行性。?

  • 输入:算法具有零个或多个输入。
  • 输出:算法至少有一个或多个输出。
  • 有穷性:指算法在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受时间内完成。
  • 确定性:算法的每一步骤都具有确定含义,不会出现二义性。
  • 可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。

正确性:算法至少应具有输入、输出和加工处理无歧义性、能正确反映问题需求、能得到问题正确答案。
四个层次:?

  1. 算法程序没有语法错误。
  2. 算法程序对于合法的输入数据能够产生满足要求的输出结果。
  3. 算法程序对于非法的输入数据能够产生满足规格说明的结果。
  4. 算法程序对于精心选择的,甚至刁难的测试数据能有满足要求的输出结果。

可读性:算法设计的另一目的是为了便于阅读、理解和交流。
健壮性:当输入数据不合法时,算法也能做出相关处理,
而不是产生异常或莫名其妙的结果。

示例:请写出一个求1+2+3+…+100结果的程序。
最容易想到的应该是下面这个版本:

int sum=0,n=100;  	//执行1次
for(int i=1;i<=n;i++)  	//执行n+1次
{
sum=sum+i;   		//执行n次
}
printf("%d",sum);  	//执行1次

但应用等差数列的知识,我们就可以写出下面代码:

int i,sum=0,n=100;  	//执行1次
sum=(1+n)*n/2;  	//执行1次
printf("%d",sum);  	//执行1次

结果可想而知,第一个执行了与for循环的循环次数n相关的1+(n+1)+n+1次,时间复杂度为O(n)。
第二个每个语句都执行一次,即时间复杂度为O(1)。

时间复杂度计算规则:在实际计算时间复杂度时,我们往往忽略掉最高项系数以及所有低次项,而只保留最高次项,因为低次项、最高项系数不会对结果造成跨数量级的误差。

时间复杂度表示方法:由大写字母O和括号组成,括号中写最高次项。如O(n)、O(n^2)。
常用的时间复杂度所耗费时间从小到大依次是:

常数阶O(1)<对数阶O(logn)<线性阶O(n)<nlogn阶O(nlogn)<平方阶O(n2)<立方阶O(n3)<阶乘阶O(n!)<指数阶O(2^n)

平行运行时间往往是我们期望的运行时间。
最坏运行时间即运行时间不可能更坏,这是一种重要的需求。

而我们一般计算时间复杂度都按最坏运行时间计算,一方面是考虑全面,以防万一,但另一方面还有一点点心理上的因素。
也就是这个东西: 墨菲定律
如果事情有变坏的可能,不管这种可能性有多小,它总会发生。
所以,还是用心优化代码吧~ (:з)∠)
谢观:)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值