说起为什么重新拿起这本书,着实非常惭愧。是因为面试的时候,第一个面试官面试完项目之后。第二面试官说我们就当聊聊天,考考数据结构,算法就好了。结果以一个问题就把我难住了,这个问题是:哈希表是什么?
所以我打算花两天的时间重新把这本书看一遍,并做下笔记,这次我一定会记住。
第一章 绪论
目前,计算机已深入到社会生活的各个领域,其应用已不再仅仅局限于科学计算,而更多的是用于控制,管理及数据处理等非数值计算领域。计算机是一门研究用计算机进行信息表示和处理的科学。这里面涉及到两个问题:信息的表示,信息的处理。
信息的表示和组织又直接关系到处理信息的程序的效率。随着应用问题的不断复杂,导致信息量剧增与信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,必须分析待处理问题中的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。
1.1 什么是数据结构?
这必须是第一个问题。
大家有没有想过,计算机在解决一个具体问题时需要几个步骤呢?
- 从一个具体问题抽象出来一个数学模型
- 设计一个解决此模型的算法
- 编出程序
- 进行测试
- 得到答案
下面举三个例子:
- 图书馆书目检索系统(按照书名或作者名进行排序):表结构(一对一)
- 下棋游戏(每一步都对应着多种棋局):树形结构(一对多)
- 多叉交通路口问题(每个路口之间互相影响):图结构(多对多)
1.2 基本概念和术语
-
data(数据):对客观事物的符号表示。
-
data element :数据的基本单位。
-
data object : 性质相同的数据元素的集合,是数据元素的一个子集。
-
data structure :是相互之间存在一种或多种特定关系的数据元素的集合。
-
structure :结构(通常有下列4种结构)
- 集合(除属于一个集合外无其他关系)
- 线性结构(一对一)
- 树形结构(一对多)
- 图状结构(多对多)
-
数据结构在计算机中的表示
数据结构在计算机中的表示称为数据结构的物理结构,又称存储结构。
- bit(位):二进制中的一位,是计算计中的最小单位。
- element(元素) or node(节点):若干位组成的位串。
- data field(数据域):当数据元素由若干数据项组成时位串中对应于各个数据项的子位串称为数据域。
数据元素在计算机中的两种关系
-
顺序映像,存储结构为顺序存储结构
特点:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
如表示复数:z1 = 3.0-2.3i 和 z2 = -0.7+4.8i 。(如图a)
-
非顺序映像,存储结构为链式存储结构
特点:借助元素存储地址的指针表示元素之间的逻辑关系。
如表示复数:z1 = 3.0-2.3i。(如图b)
数据类型(data type)
数据类型是一个值的集合和定义在这个值上一注操作的总称。例如 C 语言上的整形变量,其值为某个区间上的整数,定义在其上的操作为加减乘除取模等算术运算。
高级语言的数据类型可分为两类:
1. 原子类型:原子类型的值是不可分割的。2. 结构类型:结构类型的值由若干结构的某种结构的值组成,因此是可以分解的,并且它的成分可以是结构的,也可以是非结构的。复制代码
抽象数据类型(abstract data type)
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
一个抽象数据类型的软件模块通常有定义,表示和实现三个部分组成。
-
定义可分为三种类型:
- 原子类型(atomic data type)
- 固定聚合类型(fixed-aggregate data type):其值由确定数目的成分按某种结构组成。复数由两个实数依确定的次序关系组成。
- 可变聚合类型(variable-aggregate data type):构成其值的成分,数目是不确定的。
后两种可统称为结构类型。
抽象数据类型可用以下三元组组成:
(D , S , P)
其中 D 是数据对象,S 是 D 上的关系集,P 是对 D 的基本操作。
本书采用以下格式对应抽象数据类型:
ADT <抽象数据类型名>{
数据对象: <数据对象的定义>
数据关系: <数据关系的定义>
基本操作: <基本操作的定义>
} ADT <抽象数据类型名>
-
其中数据对象和数据关系的定义用伪码描述。
-
基本操作的定义是:
<基本操作名>(<参数表>)
初始条件: <初始条件描述>
操作结果: <操作结果描述>
- 初始条件:描述操作执行之前数据结构和参数应满足的条件;若不满足,则操作失败,返回相应的出错信息。
- 操作结果:描述操作正常完成之后,数据结构的变化状况和 应返回的结果。