1. 数据结构(data structure)可概括为数据的逻辑结构、数据的存储结构、特定数据结构上的数据运算。
1.1 数据的逻辑结构。数据逻辑结构可以用一个二元关系表示(K,R),K代表一组数据节点集合,R是定义在K上的一组关系(relation)集合;
节点的类型:基本数据类型;
指针(pointer)数据类型(Java限制了不能直接操作指针,而使用引用数据类型来操作);
复合数据类型。
结构类型:线性结构(linear structure),线性结构是有向的,例如:前后关系,大小关系;线性结构具有单索引性,即一个节点x除了头尾以外,都存在唯一一个后继结点和唯一一个前驱节点。
树形结构(tree structure),树形结构也是有向的,从尾到头还是从头到尾;树形结构表现为层次关系,父子关系,每个节点都可以有多个子节点,除了根节点(root)以外,每个节点都有一个父节点;树形结构和线性结构的区别在于每个节点是否仅仅只有一个后继节点;树形结构与图结构的区别在于每个节点是否仅仅只有一个父节点。
图结构(graph structure),图结构没有任何关系描述约束,例如互联网的网络结构。现实中很多都是图,但是图也很复杂。我们可以这样说,树形结构是图结构的一种特例;线性结构是树形结构的一种特例。
1.2 数据的存储结构:
物理存储:外存;内存;
逻辑存储:排序、链接、索引、散列。
(散列在存储的同时也兼备一种高效特殊的索引功能,我们将要存储的数据经过一个hash 散列函数计算,返回一个地址,这个地址就是我们数据的存储位置,拿着这个索引就能找到数据。后面专门详细说明。)
1.3 说一个可能有用的概念:存储密度,存储结构存储有用数据和该结构附加信息在整个存储空间大小比,有些时候,附加信息提高算法速度、简化算法,这种以空间还时间的做法也是很有必要的。典型例子就是:
顺序(sequential)存储,把一组节点存储在地址连续的一段空间中;
链接存储,节点除了存储数据本身意外,还存储指针字段的附加信息,形成链锁;
2. 程序设计提倡分割成为细小的模块(module)来完成,每个模块是一个逻辑单位,这样做可以有以下的优点:
a) 调试一个小的程序模块远比调试一个大程序结构容易得多,
b) 多个人协同开发的时候,可以复用某些小模块,
c) 模块化使得某些资源的作用域便小,节约资源,同时修改起来也更加容易。
3. 数据结构也提倡使用模块化来真正实现,抽象数据类型(abstract data type ADT)是模块化的一种体现,ADT是描述数据结构的一种理论工具,表示从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,仅仅抽象出操作的描述,而不关心如何实现这些操作,实现算法可以有很多语言去做。
3.1 抽象数据类型=逻辑结构+抽象运算
3.2 ADT基本格式:
ADT 抽象数据类型名
{ 数据对象:数据对象声明
数据关系:数据关系的声明
基本运算:基本运算的声明
} ADT 抽象数据类型名
其中基本运算的声明格式为:基本运算名(参数名):运算功能描述
例如:
ADT Complex
{ 数据对象:D={e1,e2 | e1,e2均为实数}
数据关系:R={<e1,e2> | e1是复数的实数部分,e2 是复数的虚数部分
基本操作:
AssignComplex(&z,v1,v2):构造复数Z。
DestroyComplex(&z):复数z被销毁。
GetReal(z,&real):返回复数z的实部值。
GetImag(z,&Imag):返回复数z的虚部值。
Add(z1,z2,&sum):返回两个复数z1、z2的和。
} ADT Complex
//基本运算有两种参数:赋值参数,引用参数,以&开头
3.3 常用的ADT基本运算的声明有:
增加Insert,查找Find,删除Delete,测定大小Size\Length,是否为空isEmpty,输出Printf,输入的取值空间等。
4. 经典公式:程序=算法+数据结构+语言工具。