一、算法 (算法+数据结构=程序)
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。算法有五个重要特征:
1)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都可在有穷时间内完成。
2)确定性:算法中每一条指令必须有确切的含义,无二义性,并且在任何条件下,算法只有唯一的一条执行路径,即对相同的输入只能得到相同的输出。
3)可行性:一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基础运算执行有限次来实现。
4)输入:一个算法有零个或多个输入。
5)输出:一个算法有一个或多个输出。
二、算法设计
设计一个“好”的算法应考虑达到以下目标:
1)正确性:算法应满足具体问题的需求。
2)可读性:便于阅读和交流。
3)健壮性:当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
4)效率与低存储需求:通俗地说,效率指的是算法执行时间;存储量需求指算方法执行过程中所需要的最大存储空间。
三、算法分析
算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。
四、算法的表示、
常用的表示算法的方法有自然语言、流程图、程序设计语言和伪代码等。
1)自然语言:最大的优点是容易理解,缺点是容易出现二义性,并且算法通常很冗长。
2)流程图:有点是直观易懂,缺点是严密性不如程序设计语言,灵活性不如自然语言。
3)程序设计语言:优点是能够用计算机直接执行,缺点是抽象性差,使算法设计者拘泥于描述算法的具体细节,忽略了“好”算法和正确逻辑的重要性。此外,还要求算法设计者掌握程序设计语言及编程技巧。
4)伪代码:伪代码是介于自然语言和程序设计语言之间的方法,它采用某一种程序设计语言的基本语法,操作指令可以结合自然语言来设计。计算机科学家从来没有对伪代码的书写形式达成过共识。在伪代码中,可以采用最具表现力的、最简明扼要的方法来表示一个给定的算法。
五、时间复杂度
算法的时间复杂度分析主要是分析算法的运行时间,即算法所执行的基本操作性。
即使对相同的输入规模,数据分布不同也决定了算法执行不同的路径,因此所需要的执行时间也不形同。根据不同的输入,将算法的时间复杂度分为三种情况。
1)最佳情况:使算法执行时间最少的一种输入。一般情况下,不进行算法在最佳情况下的时间复杂度分析。
2)最坏情况:使算法执行时间最多的一种输入。一般会进行算法在最坏时间复杂度的分析,因为最坏情况是在任何输入下运行时间的一个上限,它给我们提供一个保障,情况不会比这更糟糕。另外,对于某些算法来说,最坏情况还是相当频繁的。而且大致上看,平均情况通常与最坏情况的时间复杂度一样。
3)平均情况:算法的平均运行时间,一般来说,这种情况很难分析,可按如下三个步骤进行:
①将所有的输入按其执行时间分类
②确定没类输入发生的概率
③确定每类输入的执行时间
常见的时间复杂度
①常数阶 O(1)
②对数阶 O(log2n)
③线性阶 O(n)
④线性对数阶 O(nlog2n)
⑤平方阶 O(n^2)
⑥立方阶 O(n^3)
⑦k次方阶 O(n^k)
⑧指数阶 O(2^n)
设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和。