算法设计是指设计一系列解决问题的清晰指令,通过系统的方法描述解决问题的策略与机制。算法能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
(1)有穷性:算法将在执行又穷步后结束,且每一步的运行时间是有穷的。
(2)确定性:算法只有唯一的一条执行路径,即输入相同,输出将相同。
(3)可行性:算法中描述的操作能通过已经实现的基本运算执行有穷次来实现。
(4)输入:一个算法可能有零个或多个输入。
(5)输出:一个算法可能有一个或多个输入。
算法的时间复杂度和空间复杂度是衡量一个算法效率高低的重要指标。在算法设计过程中,可以通过时间来换取空间,也可以通过空间来换取时间,算法的时间复杂度分析主要是分析算法的运行时间。
常用的表示算法的方法有自然语言、流程图、程序设计语言和伪代码等。各类表示方法的特点如下:
(1)自然语言虽然容易理解,但也容易出现二义性,并且描述起来比较冗长。
(2)程序设计语言的优点是计算机直接执行,但和具体语言相关,抽象性较差,要求算法设计者掌握程序设计语言及编程技巧。
(3)流程图优点是直观易懂,但严密性不如程序设计语言。
(4)伪代码介于自然语言和程序设计语言之间,能够比较简明扼要的表达算法设计。
流程图和伪代码都是比较常用的算法表示方式。
随着问题规模n的不断增大,算法的时间复杂度不断增大,执行效率会降低。常见的时间复杂度有:
(1)常数阶O(1):表示算法的运行时间为常量,与问题规模n无关。
(2)对数阶O(log2n):表示算法的运行时间与问题规模n是对数相关,如二分查找。
(3)线性阶O(n):表示算法的运行时间与问题规模n是线性相关。
(4)线性对数阶O(nlog2n):表示算法的运行时间与问题规模n是线性对数相关。
(5)平方阶O(n2):对数组机型排序的各种简单算法,如选择排序。
(6)立方阶O(n3):如两个n阶矩阵的乘法运算。
(7)k次方阶O(nk)。
(8)指数阶O(2n)等。
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、k次方阶O(nk)、指数阶O(2n),一般情况下,如果选用指数阶的算法,问题规模不应大于10。否则,应去分析该算法是否合理,是否有复杂度较低的其他算法。
在许多情况下,算法设计遵循了人类求解问题的一般方法和思路。如“从部分到整体”和“从整体到部分”。在算法设计中,由于问题本身的复杂性与需要考虑程序实现的方便性等因素,算法设计者不得不在各种制约因素之间取得平衡,如算法的空间要求与时间要求间的平衡、算法结果的最优性与算法效率的平衡等。