程序设计的实质是数据表示和数据处理,其核心分别为数据结构和算法。图灵奖获得者沃思给出一著名公式:数据结构+算法=程序 数据是信息的载体,分为数值数据和非数值数据,数据元素是数据的基本单位。数据结构是指相互之间存在一定关系的数据元素的集合,按照视点的不同分为逻辑结构和存储结构。
算法是对特定问题求解步骤的一种描述,是指令的有序序列。算法必须满足五个特性 :
1.输入:一个算法有零个或多个输入(即算法可以没有输入)
2.输出:一个算法有一个或多个输出(即算法必须要有输出)
3.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
4.确定性:算法中每一条指令必须有确切的含义,不存在二义性
5.可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现
一个“好”算法除要满足上述五大特性还需要具备正确性、鲁棒性、简单性、抽象分级、高效性等特性。算法设计者在构思和设计了一个算法之后,必须清楚准确地将所设计的求解步骤记录下来,即描述算法,常用的描述算法有自然语言(优点:易理解;缺点:易出现二义性且算法通常很冗长)、流程图(优点:直观易懂;缺点:严密性不如程序设计语言,灵活性不如自然语言)、程序设计语言(优点:能由计算机直接执行;缺点:抽象性差)和伪代码(介于自然语言和程序设计语言之间的方法,被称为“算法语言”或“第一语言”)等。
通常我们采用事前分析估算的方法——渐进复杂度来度量一个算法的效率,它是对算法所消耗资源的一种估算方法。影响算法时间代价的最主要因素是问题规模。为了客观地反映一个算法的执行时间,可以用算法中基本语句的执行次数来度量算法的工作量,基本语句是执行次数与整个算法的执行次数成正比的语句,对算法运行时间的贡献最大,是算法中最重要的操作。
当分析一个算法时,一般来说,最好情况不能作为算法性能的代表,因为它发生的概率太小,对于条件的考虑太乐观了。但是,当最好情况出现的概率较大时,应该分析最好情况。分析最差情况有一个好处:它能让你知道算法的运行时间最坏能坏到什么程度。通常需要分析平均情况的时间代价。
算法的空间复杂度是指在算法的执行过程中,需要的辅助空间数量。辅助空间是除算法本身和输入输出数据所占据的空间外,算法临时开辟的存储空间。通常记作:
S(n)=O(f(n))
其中,n为问题规模,分析方法与算法的时间复杂度类似。