一、算法定义:
对特定问题纠结步骤的一种描述;它是指令的有限序列,其中每条指令表示一个或多个操作
二、5个重要特性:
- 有穷性
一个算法必须总是(对任何合法的输入)在执行有穷步后结束,且每步都可以在有穷时间内完成。
- 确定性
算法中的每条指令必须有确切的含义,读者理解时不会产生二义性。并且在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
- 可行性
一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次实现。
- 输入
一个算法有零个或多个输入,这些输入取自某个特定的对象的集合。
- 输出
11.png一个算法有一个或多个的输出,这些输出是同输入有着特定的关系的量。
三、算法设计的要求
1、正确性
算法应当满足具体问题的需求,能够通过特定的问题测试。
2、可读性
算法主要是为了人的阅读与交流,其次才是机器的执行
3、健壮性
当输入非法的数据时,算法也能狗适当做出反应或进行处理,而不会产生莫名奇妙的输出结果
4、效率与低存储量需求
效率指算法运行的时间,执行时间短效率高;存储量需求是指算法执行过程中所需的最大存储空间。
二者都与问题的规模相关,同时也要根据实际需求决择,要效率,还是要节省空间,或者折中。一般情况二者不可得兼,要么用空间换时间,要么用时间换空间。
四、算法的好坏评定标准
时间复杂度 :T(n)
根据算法写成的程序在执行时 耗费时间的长度。这个长度往往也与输入数据的规 模有关。时间复杂度过高的低效算法可能导致我们 在有生之年都等不到运行结果。
空间复杂度 :S(n)
根据算法写成的程序在执行时 占用存储单元的长度。这个长度往往与输入数据的 规模有关。空间复杂度过高的算法可能导致使用的 内存超限,造成程序非正常中断。
耗费空间的的算法实例:
使用递归调用打印N个连续的数字:由于递归会不断存储上一个函数的状态与地址等信息,会不断地申请空间,可能会将空间占满
耗费时间的算法实例:
在求多项式的算法设计中,直接的按照公式的设计的算法由于引入了大量的幂次运算,增加了计算机的运算量(计算机更加愿意做加减法运算),改进算法利用提取公因式的方式(秦九韶公式),大大减少了乘法运算
五、分析算法好坏:主要关心最坏情况复杂度,其次关心平均复杂度
最好情况、最坏情况 和 平均情况
- 某个特定的数据集能让算法的执行情况极好,这就是最「最好情况」
- 而另一个不同的数据会让算法的执行情况变得极差,这就是「最坏情况」
- 不过在大多数情况下,算法的执行情况都介于这两种极端情况之间,也就是「平均情况」
因此要理解好不同情况之间的差别,不要被极端情况迷惑。
- 「最优情况」:没有什么大的价值,因为它没有提供什么有用信息,反应的只是最乐观最理想的情况,没有参考价值。
- 「平均情况」:是对算法的一个全面评价,因为它完整全面的反映了这个算法的性质,但从另一方面来说,这种衡量并没有什么保证,并不是每个运算都能在这种情况内完成。
- 「最坏情况」:它提供了一种保证,这个保证运行时间将不会再坏了,所以一般我们所算的时间复杂度是最坏情况下的时间复杂度,做事要考虑到最坏的情况是一个道理。
常见数量级函数
注:
平常设计算法过程中,养成分析算法复杂度的习惯,看看是否能够优化,比如设计了一个n^2 的算法,应立刻想到能否优化到 nlogn 的数量级。
如何分析算法的复杂度:
推荐文章——循序渐进带你学习时间复杂度和空间复杂度
网友评论