1.数据结构研究的内容
- 数据结构:是一门研究非数值计算的程序设计中计算机的操作对象以及他们之间的关系和操作的学科。
2.数据、数据元素、数据项和数据对象
2.1数据(Data):能输入计算机且能被计算机处理的各种符号的集合。
数据可以分为两类:
1.数值型的数据:整数、实数等。
2.非数值型的数据:文字、图像、图形、声音等。
2.2数据元素(Data element):组成数据的基本单位,在计算机程序中通常作为一个整体来进行考虑和处理。
也简称为元素,或称为记录、结点或顶点(后面要学到的树的结点、图的顶点指的都是数据元素)。
一个数据元素可由若干个数据项组成。
2.3数据项(Data Item)
- 构成数据元素的不可分割的最小单位。
2.4数据、数据元素、数据项的关系:
- 数据 > 数据元素 > 数据项:
2.5数据对象(Data Object):
-
是性质相同的数据元素的集合,是数据的一个子集
2.6数据元素与数据对象
- 数据元素:组成数据的基本单位
- 与数据的关系:是集合的个体。
- 数据对象:性质相同的数据元素的集合
- 与数据的关系:集合的子集
3. 数据结构
3.1数据结构
- 是指相互之间存在一种或多种特定关系的数据元素的集合。
- 数据元素之间不是孤立存在的,他们之间存在着某种关系,数据元素相互之间的关系称为结构(比如:线性、非线性)。
- 或者说,数据结构是带结构的数据元素的集合。
3.2数据结构(三要素)包括:
- 逻辑结构:数据元素之间的逻辑关系,也称为逻辑结构。
- 物理结构(存储结构):数据元素及其关系在计算机内存中的表示(也称为映像),称为数据的物理结构或数据的存储结构。
- 数据的运算和实现:即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
3.3逻辑结构
- 描述数据元素之间的逻辑关系。
- 和数据的存储无关,独立于计算机。
- 是从具体的问题抽象出来的数学模型。
3.4物理结构(存储结构):
- 数据元素及其关系在计算机存储器中的结构(存储方式)。
- 是数据结构在计算机中的表示。
3.5逻辑结构与存储结构的关系
- 存储结构时逻辑关系的映像和元素本身的映像。
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
- 两者综合起来建立了数据元素之间的结构关系。
3.6逻辑结构的种类
划分方法1: 线性和非线性
-
线性结构
- 有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
- 如:线性表、栈、队列、串
- 每个结点成员最多前后各有一个成员
-
非线性结构
- 一个结点可能有多个直接前趋和直接后继。
- 如:树结构(一对多)、图结构(多对多)。
- 每个结点成员都可能连接着多个其他结点成员。
划分方法2: 四类基本逻辑结构
- 集合结构:结构中的数据元素之间除了同属于一个集合的关系之外,没有其他任何的关系。
- 线性结构:结构中的数据元素之间存在着一对一的线性关系。
- 树形结构:结构中的数据元素之前存在着一对多的层次关系。
- 图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。
3.7存储结构的种类
3.7.1顺序存储结构 :用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
3.7.2链式存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
1.索引表中的每一项称为一个索引项。
2.索引项的一般形式是:(==关键字、地址)。
3.关键字是能唯一标识一个结点的那些数据项。
3.7.3索引存储结构:在存储结点信息的同时,还建立附加的索引表。
3.7.4散列存储结构:根据结点的关键字直接计算出该结点的存储地址。(详细内容在后面的散列表的查找中有介绍。)
4. 算法和算法分析
4.1程序=数据结构+算法
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。(简而言之:算法是解决问题的方法和步骤。)
4.2算法的特性
1.有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
2.确定性:算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
3.可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
4.输入:一个算法有零个或多个输入,算法可以没有输入。
5.输出:一个算法有一个或多个输出,算法必须要有输出。
好的算法达到的目标:
1.正确性:算法应能够正确的求接问题。
2.可读性:算法应具有良好的可读性,以帮助人们理解。
3.健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名奇妙地输出结果。
4. 高效性:要求花费尽量少的时间和尽量低的空间。
5. 算法的时间复杂度
- 算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n)没算法的时间量度记作:T(n) = O(f(n))。它表示随着 n 的增大,算法执行的时间增长率和 f(n) 的增长率相同,称为渐进时间复杂度,简称时间复杂度。
5.1分析算法时间复杂度的基本方法
- 找出语句频度最大(执行次数最多)的那条语句作为基本语句;
- 计算基本语句(执行多少次)的频度得到问题规模 n 的某个函数 f(n);
- 取其数量级用符号 “O” 表示。(函数 f(n) 抓大头,并且去掉大头的系数,剩下的就是数量级)。
5.2算法时间效率的比较
- 当 n 取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。
- 在设计算法的时候,尽量设计时间复杂度低的。
6. 算法的空间复杂度
- 算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它是问题规模n的函数。记为S(n)=O(g(n))。