算法特性
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。简单的说算法就是某个问题的解题思路,算法的五个重要特性如下:
- 有穷性。一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
- 确定性。算法中的每一条指令必须有确切的含义,理解时不会产生二义性。并且在任何条件下,算法只有唯一的一条行路径,即对于相同的输入只能得出相同的输出。
- 可行性。一个算法是可行的,即算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
- 输出。一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
表示算法的方法
常用的表示算法的方法有自然语言、流程图、程序设计语言和伪代码等。
- 自然语言。其最大的优点是容易理解,缺点是容易出现二义性,并且算法通常很冗长。
- 流程图。其优点是直观易懂,缺点是严密性不如程序设计语言,灵活性不如自然语言。
- 程序设计语言。其优点是能用计算机直接执行,缺点是抽象性差,使算法设计者拘泥于描述算法的具体细节,忽略了“"好”算法和正确逻辑的重要性。此外,还要求算法设计者掌握程序设计语言及编程技巧。
- 伪代码。伪代码是介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,同时结合自然语言来表达。计算机科学家从来没有对伪代码的书写形式达成过共识。在伪代码中可以采用最具表达力的、最简明扼要的方法来表达一个给定的算法。
案例分析的算法题不仅考核算法设计和分析技术,还同时考核算法的C程序设计语言实现
算法的复杂度
算法的复杂度:
- 时间复杂度是指程序运行从开始到结束所需要的时间。
- 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小
常见的对算法执行所需时间的度量:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<0(2n)<0(n!)
O(1):程序从上到下只执行一遍
O(log2n):二分查找的时间复杂度
O(n):要执行n次循环
O(nlog2n):常见的快排,堆排
O(n2):2层嵌套循环
<O(n3):3层嵌套循环
上述的时间复杂度,经常考到,需要注意的是,时间复杂度是一个大概的规模表示,一般以循环次数表示,O(n)说明执行时间是的正比,另外,1og对数的时间复杂度一般在查找二叉树的算法中出现。渐进符号O表示一个渐进变化程度,实际变化必须小于等于O括号内的渐进变化程度。