第二章:算法
是解决特定问题的求解步骤的描述,计算机指令的有限序列。
Algorithm特性:
有穷性、确定性、可行性、输入和输出;
算法的特性:
-
输入输出
至少一个输出、可以没有输入;例如print -
有穷性
算法执行步骤是有限的,自动结束而不会死循环。
且每一个步骤的执行时间都是可接受的。
边界性; -
确定性
算法的每一步都具有确定的含义,不会有二义性;
只有一条执行路径; -
可行性
算法的每一步都是可以在执行有限次数后完成;
可以得到结果;
算法的要求
- 正确性
能够正确的反映问题的需求,能够得到问题的正确答案;
具有输入、输出和加工处理无歧义;
正确的层次:
1. 没有语法错误
2. 算法对于合法的输入,可以产生满足要求的结果
3. 非法数据可以得出满足规格说明的结果
-
可读性
算法设计就是为了便于阅读、交流。 -
健壮性
当输入数据不合法时,也能做出相关处理。 -
时间效率高和存储量低
算法效率的度量
利用计算机的计时功能,计算不同算法的效率。
-
事后统计
利用设计好的测试程序和数据,对不同算法编制的程序的运行时间进行比较。
缺点:
必有得有程序代码,算法写的不好,程序毫无意义。
计算机环境造成结果差异
测试数据设计困难 -
事前分析
程序代码编写前,依据统计方法对算法进行估算。
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
分析程序运行时间,最重要的是把程序看成独立于程序设计语言的一系列步骤。
说白了: 就是程序执行一条指令的时间 乘以 程序的指令数 得到的就是程序运行时间。而分析一个算法的好坏就是 通过分析输入数据的量和运行时间的关系函数 得到一个时间效率问题。
都是一些简单数学问题,自己百度一下就明白。
算法的时间复杂度
定义(描述):随着算法的输入数据量n的增加,算法操作数f(n)随之增加,而时间量度T(n)也在正比增加。
最优算法,就是T(n)增加最慢的。
常用时间复杂度:
算法的空间复杂度
指计算算法的所需的存储空间。S(n)。
程序执行时,除了存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。
如果输入数据所占空间只取决于问题本省,和算法无关,则只需要分析该算法在实现时所需的辅助单元即可。如辅助单元空间相对于输入数据量而言是个常数,此算法空间复杂度为:O(1)。