算法:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的五个基本特性:输入、输出、有穷性、确定性、可行性。?
- 输入:算法具有零个或多个输入。
- 输出:算法至少有一个或多个输出。
- 有穷性:指算法在执行有限步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受时间内完成。
- 确定性:算法的每一步骤都具有确定含义,不会出现二义性。
- 可行性:算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。
正确性:算法至少应具有输入、输出和加工处理无歧义性、能正确反映问题需求、能得到问题正确答案。
四个层次:?
- 算法程序没有语法错误。
- 算法程序对于合法的输入数据能够产生满足要求的输出结果。
- 算法程序对于非法的输入数据能够产生满足规格说明的结果。
- 算法程序对于精心选择的,甚至刁难的测试数据能有满足要求的输出结果。
可读性:算法设计的另一目的是为了便于阅读、理解和交流。
健壮性:当输入数据不合法时,算法也能做出相关处理,
而不是产生异常或莫名其妙的结果。
示例:请写出一个求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)
平行运行时间往往是我们期望的运行时间。
最坏运行时间即运行时间不可能更坏,这是一种重要的需求。
而我们一般计算时间复杂度都按最坏运行时间计算,一方面是考虑全面,以防万一,但另一方面还有一点点心理上的因素。
也就是这个东西: 墨菲定律
如果事情有变坏的可能,不管这种可能性有多小,它总会发生。
所以,还是用心优化代码吧~ (:з)∠)
谢观:)