不到一周看了看算法设计的书,所谓燕过留痕也,就从算法设计与分析第一部分开始,进行总结。
1算法的基本概念
1.1算法及其重要特性
算法被公认为是计算机技术的基石。通俗的讲,算法是解决问题的方法,现实生活中关于算法的实例不胜枚举,如一道菜谱、一个安装转椅的操作指南等,再如四则元算、算盘的计算口诀等。严格的说,算法是对特定问题求解步骤的一种描述,是指令的优先序列。此外,算法还具有以下五个特性:
输入(input):一个算法有零个或者多个输入(即算法可以没有输入),这些输入取决于特定对象集合。
输出(output):一个算法有多个暑促(即是算法必须有输出),通常输出与输入有着某种特定的关系。
有穷性(finiteness):一个算法必须总是在执行有穷步骤之后结束,且都在有穷时间内完成。
确定性(determinism):算法中的每一条指令必须有确切的含义,不存在二义性。并且,在任何条件下,对于相同的输入只能得到相同的输出。
可行性(feasibility):算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
1.2 算法的其他特性
正确性:一个算法正确才有存在的价值和意义(也就是这个算法能解决特性的问题)。
健壮性:算法对输入的抵抗能力,即对于错误的输入,算法应能识别并作出处理,而不是产生错误动作或陷入瘫痪,一个没有良好健壮性的算法就行一颗等待的炸弹,这决不是危言耸听,而是我们有大量的例子,比如就是因为一个参数问题导致长途电话瘫痪9小时。
可理解性:算法容易理解和实现,算法首先是为了人的阅读和交流,,其实是为了程序的实现,因此算法要易于被人理解,易于转换。一些晦涩难懂的算法隐藏一些不易发现的逻辑关系。
抽象分级:算法是由人阅读、理解、使用和修改的,而研究发现,对大多数人来说,人的认识限度是7+(-)2的。如果算法的操作步骤太多,就会增加算法的理解难度,因此,必须用抽象分级来组织算法的思想。换言之,如果算法的步骤太多,可以将求解步骤抽象一个较抽象的处理,而不用描述相应的处理细节。
高效性:算法的效率包括时间和空间效率,时间效率显示了算法运行的有多快,而空间效率显示了算法需要多少额外的存储空间。一个好的算法应该是较短执行过程并占用较少辅助空间。
1.3 算法的描述方法
我们如何将现实世界的一个问题,或者解决这个问题的步骤抽象到计算机的世界中呢?我们就是利用算法描述工具,首先第一步把算法抽象为第一个层次,我们用一些算法描述工具来对算法进行描述。
自然语言:
可以用语言描述算法,这是现实世界的第一层表示。
程序流程图:
用图的形式来描述问题和解决这个问题的过程,这是对现实世界第一层的抽象。
伪代码:
用伪代码来解决这个问题,伪代码就是程序员教容易看懂,但是计算机上不能执行的代码。
程序设计语言:
经过分析伪代码可以解决这个问题,我们再把伪代码转换成为相应的语言。
Donald Knuth曾经说过:程序就是蓝色的诗,如果真的是这样,那么,算法就是这首诗的灵魂。
第一节完毕,下一节算法分析基础