第一章
绪论
程序设计的实质:数据表示和数据处理。
数据要能被计算机处理,首先必须能够存储在计算机的内存中,这项任务称为数据表示,核心:数据结构。
一个实际问题的求解必须满足各项处理要求,这项任务称为数据处理,核心:算法。
1.1数据结构在程序设计中的作用
计算机不能分析问题并产生问题的解决方案,必须由人(即程序设计者)分析问题,确定问题的解决方案,编写程序,然后让计算机执行程序最终获得问题的解。
沃思(图灵奖获得者)给出公式:数据结构+算法=程序
1.2
数值问题抽象出数据模型通常是数学方程;
非数值问题抽象出的数据模型通常是线性表、树、图等数据结构。
1.3 数据结构的基本概念
1.3.1 数据结构
数据:信息的载体,在计算机科学中是指所有能输入到计算机中并能被计算机程序识别和处理的符号集合。
数据:
a. 整数、实数等数值数据
b. 文字、声音、图形和图像等非数值数据
数据元素(数据的基本单位):在计算机程序中通常作为一个整体进行考虑和处理。
数据项:构成数据元素不可分割的最小单位。
数据结构:相互之间存在一定关系的数据元素的集合。强调:数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不予考虑。
数据结构:
a. 逻辑结构:数据元素之间逻辑关系的整体 (抽象、面向问题)
b.存储结构(物理结构):数据及逻辑结构在计算机中的表示,换言之,存储结构除了存储数据元素之外,必须隐式或显式地存储数据元素之间的关系。(面向计算机)
根据数据元素之间的逻辑关系的不同,数据元素分为四类:集合、线性结构、树结构、图结构。
存储结构:
a. 顺序存储结构:用一组连续的存储单元依次数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
b.链接存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
1.3.2 抽象数据类型
数据类型:一组值的集合以及定义于这个值集上一组操作的总称。数据类型规定了该类型数据的取值范围和对这些数据所能采取的操作。
抽象:就是抽出问题本质的特征而忽略非本质的细节,是对具体事物的一个概括。
抽象数据类型(ADT):是一个数据结构以及定义在该结构上的一组操作的总称。
ADT可理解为对数据类型的进一步抽象,数据类型和ADT的区别在于:数据类型指的是高级程序设计语言支持的基本数据类型,而ADT指的是自定义的数据类型。
1.4 算法及算法分析
1.4.1 算法及其描述方法
算法(计算机科学的基石):对特定问题求解步骤的一种描述,是指令的有限序列。
算法的5个重要特性:输入、输出、有穷性、确定性、可行性。
算法 程序
一个好的算法还需要满足:正确性、鲁棒性、简单性、抽象分级、高效性。
2、算法的描述方法:
a.自然语言,优点:容易理解;缺点:容易出现二义性,并且算法通常很冗长。
b.流程图:优点:直观易懂;缺点:严密性不如程序设计语言,灵活性不如自然语言。
c.程序设计语言:优点:计算机直接执行;缺点:抽象性差,使算法程序设计者拘泥于描述算法的具体细节,忽略了好算法和正确逻辑的重要性,此外,还要求程序设计者掌握程序设计语言和编程技巧。
d.伪代码:介于自然语言和程序设计语言之间,被称为“算法语言”或“第一语言”
伪代码不是一种实际的编程语言,但在表达能力上类似于编程语言,同时极小化了描述算法的不必要的技术性细节。
1.4.2 算法分析
1.
度量算法效率的方法:
a.事后统计
b.事前分析估算——渐进复杂度:对算法所消耗资源的一种估算方法。
2.
影响时间代价的主要因素是时间规模:指输入量的多少,一般来说,它可以从问题描述中得到。所以运行算法所需要的时间T是问题规模的函数,记作T(n)。
基本语句:执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。
时间复杂度:只考察当问题规模充分大时,算法中基本语句的执行次数在渐远意义下的阶,称作算法的渐进时间复杂度,用大O(读作大欧)记号表示。
定义1-1 若存在两个正的常数c和n0,对于任意n>=n0,都有T(n)=<c*f(n),则称T(n)=O(f(n))(或称算法在O(f(n))中)
3.
算法的空间复杂度:在算法的执行过程中,需要的辅助空间数量。
S(n)= O(f(n))
4.
定理1-1:A(n)=amnm+am-1nm-1+……+a1n+a0是一个m次多项式,则A(n)=O(nm)。