前言
- 文章内容是本人之前学习数据结构时所做的零散笔记的汇总及补充,整理过程难免有瑕疵,如果小伙伴发现错误请及时不吝指出,在此谢过!
第一篇---->基本概念和认识
第二篇---->算法
第三篇---->算法概述补充
第四篇---->数据结构概述补充
第五篇---->Java线性表详细实现
第六篇---->Java栈详细实现
第七篇---->Java队列详细实现
绪论
1 数据结构的起源
- 早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后在编写程序,得到一个实际的软件.
- 现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表,树和图等数据结构)的帮助,才能更好的处理问题,所以
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科
. - 1968年,美国的高德纳教授在其所写的<计算机程序设计艺术>第一卷<基本算法>中,较系统的阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系.同年,数据结构作为一门独立的课程,在计算机科学的课程中开始出现.
- 之后,70年代初,出现了大型程序,软件也开始相对独立,结构程序设计称为程序设计方法学的主要内容,人们对数据结构的重视程度越来越高,认为程序设计的是指是对确定的问题选择一种好的结构,加上设计一种好的算法.
2 基本概念和术语
2.1 数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
- 正所谓“巧妇难为无米之炊”,再强大的计算机,也是要有“米”下锅才可以干活的,否则就是一堆破铜烂铁。这个“米”就是数据。
- 数据不仅仅包括数字,还包括声音,图像,视频等非数值类型。这里所说的数据,其实就是符号,而且这些符号具备两个前提:
可以输入到计算机中
能被计算机程序处理 - 对于整型等数值类型,可以进行数值运算
- 对于声音数据,视频数据等非数值类型,可以通过编码的方式转换成字符数据来处理。
2.2 数据元素
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
- 例如,学生记录就是一个数据元素,它由学号,姓名,性别等数据项组成。
- 再比如说,家畜类中的数据元素有哪些?牛,羊,猪这些都是它的数据元素,它们都拥有年龄,体重等数据项。
2.3 数据对象
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
- 什么叫性质相同呢,是指数据元素具有相同数量和类型的数据项,比如,人都有姓名,生日等相同的数据项。或者说整型数据对象N={0,-1,+1,-2,+2,。。。。。}
- 既然数据对象是数据的子集,在实际中,处理的数据元素通常具有相同的性质,在不产生混淆的情况下,都将数据对象简称为数据。
2.4 数据结构
- 结构,简单理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
。在任何问题中,数据元素都不是孤立存在的,他们之间存在某种关系,这种数据元素相互之间的关系成为结构(Structure)。- 数据结构包括三方面的内容:
逻辑结构,存储结构和数据的运算
。逻辑结构是面向问题的,物理结构是面向计算机的,其基本目标就是将数据及其逻辑关系存储到计算机内存中。 - 数据的逻辑结构和存储结构是密不可分的两个方面,
一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构
。 程序设计=数据结构+算法
- 想要编写一个质量高的程序,必须分析待处理对象的特性及各个处理对象之间存在的关系。
3 数据结构三要素
3.1 逻辑结构
- 逻辑结构是指
数据元素之间的逻辑关系,即从逻辑关系上描述数据
。它与数据的存储无关,是独立于计算机的
。数据的逻辑结构分为线程结构和非线性结构
,线性表是典型的线性结构;集合、树和图是典型的非线性结构。 - 分类图如下
线性结构
:结构中的数据元素只存在一对一的关系
集合
:结构中的数据元素除“同属于一个集合
”外,别无其他关系,里面的各个元素都是“平等”的,它们的共同属性是“同属于一个集合”。
树形结构
:结构中的数据元素之间存在一对多的关系
图状结构或网状结构
:结构中的数据元素之间存在多对多的关系。
- 使用示意图表示数据的逻辑结构时,需要注意
1) 将每一个数据元素看做一个结点,用圆圈表示
2) 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示 - 逻辑结构的描述方法
1)二元组
2) 图形
3.2 存储结构
- 存储结构是指
数据结构在计算机中的表示
,也称为物理结构。包括数据元素的表示和关系的表示。数据的存储结构是用计算机语言实现的逻辑结构
,它依赖于计算机语言。实际上就是研究如何把数据元素存储到计算机的存储器上,存储器主要针对的是内存,硬盘、光盘等外部存储器的数据组织通常用文件结构来描述。 - 数据的存储结构主要有
顺序存储,链式存储,索引存储和散列存储
。 顺序存储
:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,将数据元素放在地址连续的存储单元
中,逻辑关系和物理关系是一致的。数组就是这样的顺序存储结构,假设你申请长度为5的整型数组,计算机在内存中分配一块合适大小的区域,开辟一块连续的空间供你使用。
1) 优点:可以实现随机存取,每个元素占用最少的存储空间
2)缺点:只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片
链式存储
:不要求逻辑上相邻的元素在物理位置上也相邻,数据元素的存储关系并不能反映逻辑关系
。借助指示元素存储地址的指针来表示元素之间的逻辑关系。比如,现在银行的排队办理业务的时候都需要取号,取完号之后需要等待,你只需要关注你前一个号是否被叫到就可以了,如果叫到了,下一个就是你。
1)不会出现碎片现象,能充分利用所有存储单元,且存储更加灵活
2)每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取
索引存储
:在存储元素信息的同时,还建立附加的索引表。索引表的每项称为索引项,索引项的形式一般是(关键字,地址)。
1)优点:检索速度快
2)缺点:附加的索引表额外占用存储空间。另外增加和删除数据时也要修改索引表,会花费较多时间散列存储
:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。
1)优点:检索、增加和删除节点的操作都很快;
2)缺点:若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。
3.3 数据的运算
- 施加在数据上的运算包括运算的定义和实现。运算的定义时针对逻辑结构的,支出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤
4 抽象数据类型
4.1 数据类型
数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。
- 数据类型是按照值的不同进行划分的。高级语言中,每个变量,常量和表达式都有各自的取值范围。类型就用来说明变量或表达式的取值范围和所能进行的操作。
- 为啥需要考虑数据类型呢?计算机中,内存也不是无限大的,计算一个简单的加减乘除显然不需要开辟很大的内存空间,于是考虑到对于不同的数据,开辟空间有所区别,进一步产生了多种数据类型
- 在C语言中,按照取值的不同,数据类型可分为两类:
1)原子操作:值不可再分的数据类型,包括整型,字符型等
2) 结构类型:值可以再分为若干成分的数据类型,如整型数组可以分成若干个整型数据组成。 - 比如,声明变量int a;这就确定了变量a所接收的赋值不能超出int的取值范围,变量a的运算只能是int类型允许的运算。
- 因为不同计算机有不同的硬件系统,程序语言最终通过编译器或解释器转换成底层语言。实际上我们一般都关注的是整数运算,字符运算等一些操作,而不关心实际计算机内部如果进行转换的。因此可以将这些操作抽象出来。
抽象是指抽取出事物具有的普遍性的本质
。它是抽出问题的特征而非忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,隐藏了繁杂的细节,只保留实现目标所必须的信息。
4.2 抽象数据类型
- 对已有的数据类型进行抽象,就有了抽象数据类型。
抽象数据类型(Abstract Data Type,ADT):是指一个数学模型及定义在该模型上的一组操作
。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。- 抽象数据类型不仅仅是指那些已经定义并实现的数据类型,还可以是自己定义的数据类型,比如,我们编写一个备忘录,经常用到时间、主题、内容、创建人等信息,那么我们就可以定义一个叫Note的抽象数据类型,它包含了时间、主题、内容、创建人等信息。
- 根据抽象数据类型的定义,他还包括定义在该模型上的一组操作。依旧使用备忘录Note来说明,我们可以给他定义几种基本操作:修改主题,查询创建时间等。
- 一个抽象数据类型定义了:一个数据对象,数据对象中各数据元素之间的关系及对数据元素的操作。
- 实际上,
抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性
。 - 下面给出描述抽象数据类型的标准格式:
5 温故习题,答案在第6部分
- 可以用()定义一个完整的数据结构
A. 数据元素
B. 数据对象
C. 数据关系
D. 抽象数据类型 - 以下数据结构中,()是非线性数据结构
A. 树
B. 字符串
C. 队列
D. 栈 - 以下属于逻辑结构的是()
A. 顺序表
B. 哈希表
C. 有序表
D. 单链表 - 以下与数据的存储结构无关的术语是()
A. 循环队列
B. 链表
C. 哈希表
D. 栈 - 以下关于数据结构的说法,正确的是()
A. 数据的逻辑结构独立于其存储结构
B. 数据的存储结构独立于其逻辑结构
C. 数据的逻辑结构唯一决定了其存储结构
D. 数据结构仅由其逻辑结构和存储结构决定 - 在存储数据时,通常不仅要存储各数据元素的值,而且要存储()
A. 数据的操作方法
B. 数据元素的类型
C. 数据元素之间的关系
D. 数据的存取方法 - 链式存储设计时,结点内的存储单元地址()
A. 一定连续
B. 一定不连续
C. 不一定连续
D. 部分连续,部分不连续
6 解