数据结构与算法——绪论
文章目录
- 一.数据结构的研究内容
- 1.1数值计算
- 1.2非数值计算
- 二.基本概念和术语
- 2.1数据,数据元素,数据项和数据对象
- 2.2数据结构
- 2.2.1逻辑结构
- 2.2.2存储结构(物理结构)
- 2.2.3运算和实现
- 三.抽象数据类型的表示和实现
- 3.1数据类型(Data Type)
- 3.2抽象数据类型(Abstract Data Type ADT)
- 3.2.1定义
- 3.2.2.抽象数据类型的表示和实现
下图是文章小结:
一.数据结构的研究内容
数据结构的实质
1.1数值计算
早期,计算机被用于数值计算。
- 计算数学的研究范畴:首先,分析问题,提取操作对象。然后,找出操作对象之间的关系,用数学语言(数学公式或方程)加以描述,建立相应的数学方程。
- 特点:数据元素间的关系简单,计算复杂。如图:
1.2非数值计算
随着计算机应用领域的扩展,计算机被越来越多地用于非数值计算。
-
例1.学生学籍管理系统
- 操作对象:每位学生的信息(学号,姓名,性别,籍贯,专业…)。
- 操作算法:查询,插入,修改,删除等。
- 操作对象之间的关系:线性关系
- 数据结构:线性数据结构,线性表
-
例2.图书管理系统
- 操作对象:若干行数据记录
- 操作算法:查询,插入,修改,删除等
- 操作对象之间的关系:线性关系
- 数据结构:线性数据结构,线性表
-
例3.文件系统的系统结构图
磁盘跟目录下有很多子目录及文件,每个子目录里又可以包含多个子目录及文件,但每个子目录只有一个父目录,以此类推;本问题是一个典型的蜀兴结构问题,数据与数据成一对多的关系,是一种典型的非线性关系结构——树形结构。
-
例4.人机对弈问题
-
例5.地理信息处理
问题:找到图中两点之间的最短路径或最经济路径。
处理:把地图上地点看成一个个点,一条条路,点点之间连线,然后抽象成一个由线和点构成的抽象结构,分析点与点之间的最短路径,最后得出花费时间最少或最经济的路线。
操作对象:各地点及路的信息。
对象之间的关系:非线性关系,网状结构。
综上所述
- 这些问题的共性都是无法用数学公式和方程来描述,是一些非数值计算的程序问题。
- 描述非数值计算问题的数学模型不是数学方程,而是诸如表,数和图之类的具有逻辑关系的数据。
- 数据结构是一门研究非数值计算的程序设计中计算机的操作对象(如表,数和图),以及他们之间的关系和操作的学科。
二.基本概念和术语
2.1数据,数据元素,数据项和数据对象
-
数据(Data)
- 是能输入计算机且能被计算机处理的各种符号的集合。
- 信息的载体
- 是对客观事物符号化的表示
- 能够被计算机识别,存储和加工
- 包括:
- 数值型的数据:整数,实数等
- 非数值型的数据:文字,图像,图形和声音等
-
数据对象(Data Object)
- 是性质相同的数据元素的集合,是数据的一个子集。例如:
- 整数数据对象是集合N={…-2,-1,0,1,2…}
- 字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’}
- 学籍表也可看作一个数据对象
- 是性质相同的数据元素的集合,是数据的一个子集。例如:
-
数据元素
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
- 也简称为元素,或称为记录,结点或顶点。
- 一个数据元素可由若干个数据项组成。
数据元素可以是表中的一行,可以是一个格局是一个结点,可以是导航中的一个地点抽象成的一个点。
-
数据项
- 构成数据元素的不可分割的最小单位。
数据,数据元素,数据对象,数据项之间的关系:
数据>=数据对象>数据元素>数据项
2.2数据结构
- 数据元素不是孤立存在的,他们之间存在着某种关系,数据元素相互之间的关系称为结构(Structure)。
- 是指相互之间存在一种或多种特定关系的数据元素集合。
- 或者说,数据结构是带结构的数据元素的集合。
数据结构包括以下三个方面:
2.2.1逻辑结构
数据元素之间的逻辑关系,也称为逻辑结构。
- 与数据的存储无关,独立于计算机。
- 是从具体问题抽象出来的数学模型。
逻辑结构的种类
- 划分方法一
1)线性结构(一对一)
有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。例如:线性表,栈,队列,串。
2)非线性结构(多对多)
一个结点可能有多个直接前趋和直接后继。例如:树,图。
- 划分方式二——四类基本逻辑结构
1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无其他任何关系。
2)线性结构:结构中的数据元素之间存在着一对一的线性关系。
3)树形结构:结构中的数据元素之间存在着一对多的层次关系。
4)图状结构或网状结构:结构中的数据元素之间存在着多对多的任意关系。
2.2.2存储结构(物理结构)
数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构。
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
四种基本的存储结构
-
顺序存储结构
-
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
-
C语言中用数组来实现顺序结构。例:(bat,cat,eat,…)
-
-
链接存储结构
-
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
-
C语言中用指针来实现链式存储结构。如图所示(bat,cat,eat,…mat):先存储一个元素,同时把一个元素的地址在哪也存上,存一个元素的同时存下一个元素地址,这样就可以通过一个元素访问它的下一个元素了。
-
-
索引存储结构
- 在存储结点信息的同时,还建立附加的索引表。
- 索引表中的每一项称为一个索引项
- 索引项的一般形式是:
(关键字,地址)
- 关键字是能唯一标识一个结点的那些数据项。
- 若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense Index)。若一组结点在索引表中只对应一个索引项,则该索引表称之为稀疏索引(Sparse Index)。
如图,通讯录就是索引表,通讯录中的姓就是索引项,例如
(M,米)
-
散列存储结构
- 根据结点的关键字直接计算出该结点的存储地址。
Key 32 75 70 63 48 94 25 36 18 Key%11 10 9 4 8 4 6 3 3 7 得到的散列表如下:
2.2.3运算和实现
即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
逻辑结构与存储结构的关系:
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
- 存储结构是逻辑关系的映像与元素本身的映像。
- 两者综合起来建立了数据元素之间的结构关系。
三.抽象数据类型的表示和实现
3.1数据类型(Data Type)
- 在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量,常量或表达式,明确说明他们所属的数据类型。
- 例如,C语言中:
- 提供int,char,float,double等基本数据类型
- 数组,结构,共用体,枚举等构造数据类型
- 还有指针,空(void)类型
- 用户也可用typedef自己定义数据类型
- 一些最基本数据结构可以用数据类型来实现,如数组,字符串等
- 而另一些常用的数据结构,如栈,队列,树,图等,不能直接用数据类型来表示。
高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有的取值范围,以及在这些数值范围上所允许进行的操作。
- 例如,C语言中定义变量 i 为int类型,就表示 i 是[-min,max]范围的整数,在这个整数集上可以进行
+,-,*,\,%
等操作。
定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
数据类型=值的集合+值集合上的一组操作
3.2抽象数据类型(Abstract Data Type ADT)
3.2.1定义
是指一个数学模型以及定义在此数学模型上的一组操作。
- 由用户定义,从问题抽象出数据模型(逻辑结构),具有逻辑结构的特征。
- 还包括定义在数据模型上的一组抽象运算(相关操作)。
- 不考虑计算机内的具体存储结构与运算的具体实现算法
-
形式定义
抽象数据类型可用(D,S,P)三元组表示。其中:
D是数据对象
S是D上的关系集
P是对D的基本操作集
-
定义格式
一个抽象数据类型的定义格式如下:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中:
-
数据对象,数据关系的定义用伪代码来描述
-
基本操作的定义格式为:
- 基本操作名(参数表)
- 初始条件:<初始条件描述>
- 操作结果:<操作结果描述>
- 基本操作定义格式说明:
-
参数表:
赋值参数,只为操作提供输入值;例如
power(x,y);
引用参数,以&打头,除可提供输入值外,还将返回操作的结果。例如:
scale(&G,n);
表示对图形放大n倍,返回操作以后G仍然用G自身返回。 -
初始条件:描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应的出错信息。若初始条件为空,则省略之。
-
操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果。
抽象数据类型伪代码表示如下:
ADT 抽象数据类型名{
Data
数据对象的定义
数据元素之间逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
……
操作n
……
}ADT 抽象数据类型名
3.2.2.抽象数据类型的表示和实现
一个问题抽象为一个抽象数据类型,仅是形式上的抽象定义,还没有达到问题解决的目的,要实现这个目标,就要把抽象的变成具体的,即抽象数据类型在计算机上实现,变为一个能用的具体的数据类型。例如,用C语言实现抽象数据类型:用已有数据类型定义描述它的存储结构,再用函数定义描述它的操作,就可以在程序中使用。
把逻辑结构映像到内存,考虑到如何存储,不仅要存储数据结构,还要存储逻辑关系(存储结构)
- 实现
-
抽象数据类型可以通过固有的数据类型(如整型,实型,字符型等)来表示和实现。即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
实例1:抽象数据类型“复数”计算
z=(z1*z2)/(z1+z2)
的实现。在下面的结构中,用已有的float行定义complex复数结构类型。
#include<stdio.h>
//定义常量,定义类型,函数声明等
typedef struct{
float realpart; //实部
float imaqpart; //虚部
}Complex //定义复数抽象类型
Void assign(Complex *A,float real,float imag){//赋值
A->realpart=real; //实部赋值
A->imagpart=imag; //虚部赋值
} //End of assign()
void add(Complex *A,float real,float imag);{//A+B
c->realpart=A.realpart+B.realpart;//实部相加
c->imagpart=A.imagpart+B.imagpart;//虚部相加
}
//Complex是定义的结构体类型,带*指针变量,它是指向Complex类型的指针;
void main()
//声明变量,定义实数,调用函数等
{
complex z1,z2,z3,z4,z;
float RealPart,ImagPart;
assign(z1,8.0,6.0); //构造复数z1
assign(z2,4.0,3.0); //构造复数2
add(z1,z2,z3); //z1,z2相加,结果存放于z3
multiply(z1,z2,z4) //两个负数z1,z2相乘,结果存放于z4
if(divide(z4,z3,z)){ //两个复数相除(去掉分母为0的情况计算)
GetReal(z,RealPart);
GetImag(z,ImagPart);
}
}
在C中,用函数真正实现抽象数据类型定义。如果函数的定义出现在被调用函数后,必须阿紫前面加以声明,所以通常看到数据定义玩之后,对函数的声明。