🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤🐤
📕天下至深是学海,世间极顶是书山❗❗❗
📕 《数据结构与算法》阅读笔记,强烈建议购买此书反复学习
📕坚持每天阅读习惯,总有一日量变为质变,最终通向成功✌️
📕这几天会先整理以前的笔记,加油😊
🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️🕊️
1.1 程序 = 数据结构 + 算法
“程序 = 数据结构 + 算法”是计算机科学中著名的公式,该公式不仅阐明算法、数据结构与程序设计的重要性,也从一个方面阐述了数据结构与算法的密切关系。那么:
-
什么是程序?
程序就是计算机“指令”的组合,用来控制计算机的工作流程,实现一定的逻辑功能,从而完成某种任务。 -
什么是算法?
算法是程序的逻辑抽象,是解决客观问题的过程。 -
什么是数据结构?
数据结构则是现实世界的数据及其间关系的反映,分为逻辑结构和物理结构:客观事物自身所具有的结构特点称为逻辑结构,例如家谱是一种树形的逻辑结构;而逻辑结构在计算机中的具体实现称为物理结构,例如用于表示树形结构的指针或者数组。
数据结构与算法有什么用?用以模拟和解决实际的应用问题:
- 发现需要解决的问题;
- 对问题进行深入分析;
- 在计算机中建立 一个确切的抽象的模型;
- 选择恰当的数据结构表示该模型;
- 设计合适的算法;
- 最后根据设计的数据结构和算法进行相应的程序设计来模型和解决实际问题。
⭐计算机求解问题的核心是算法设计,而算法设计又高度依赖于数据结构,数据结构的选择则取决于问题本身的需求。
1.2 数据结构
数据结构描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,分为数据的逻辑结构、数据的存储结构和数据的运算。
1.2.1 数据的逻辑结构
⭐数据的逻辑结构是从具体问题抽象出来的数学模型,反映了事物的组成组成结构以及事物之间的逻辑关系。
数据的逻辑结构可以用一个二元组来表示:
B = (K,R)
其中,K是数据结点组成的有穷集合,每一个节点代表一个数据或一组由明确结构的数据;关系集R是定义在结合K上的一组二元关系。只需要浅显的知道K是逻辑结构中各个结点的集合,R是这些节点之间关系的集合。
- 结点的类型
数据结构是研究数据间结构关系,因此把组成结构的那些元素都视为结点。结点是数据结构中数据的基本单位。结点的数据类型既可以是基本数据类型,也可以是复合数据类型。
基本数据类型:如整数类型(integer)、实数类型(real)、布尔类型(bool)、字符类型(char)和指针类型(pointer)等。
复合数据类型:由基本数据类型组成而成的数据结构类型,如数组类型、字典类型等。
- ⭐结构的分类
讨论逻辑结构(K,R)的结构分类,一般以关系集R的分类为主。一般的数据结构中,R只包含一个关系 r。则根据 r 的数据结构类型对逻辑结构进行分类。
-
线性结构(linear structure)中的关系 r 称为线性关系,也称前驱关系。结点结合K中的每个结点在关系 r 上最多只有一个前驱结点和一个后继结点。例如:数组、链表、栈和队列等。
-
树形结构(tree structure)简称树结构或层次结构,其关系 r 一般称为层次关系。结点集合K中有且仅有一个结点 k0 ∈ K,在关系 r 中没有前驱,该节点称为树根(root)。除结点 k0 外,K中索里有结点都有且仅有一个前驱,但后继结点数目不加限制。
-
图结构(graph structure)有时也称为网络结构。图结构的关系 r 对集合K中结点的前驱和后继数目不加以任何约束。
树结构与图结构的基本区别就是"每个结点是否仅仅从属于一个直接前驱"。
线性结构和树形结构的基本区别是“每个结点是否仅有一个直接后继”。
1.2.2 数据的存储结构
数据的存储结构是指各种逻辑结构在计算机中的物理存储表示。例如,对于逻辑结构(K,R)其数据的存储结构就是建立一种由逻辑结构到物理存储空间的映射:
K → M(K:结点集合,M:存储器)
其中每一个结点 k ∈ K对应一个唯一的连续存储区域 c ∈ M。
同一种逻辑结构可以采用不同的表示方式,即采用不同的映射关系来建立数据的逻辑结构到存储结构的转换。例如:线性结构既可以采用顺序的方式来存储,形成顺序表;也可以采用链接的方式,得到链表。
⭐常用的基本存储映射
- 顺序方法:
- 顺序存储方法把一组结点存放在一片地址相邻的存储单元中;
- 常被称为紧凑存储结构;
- 线性结构和非线性结构都可以采用顺序存储方法,例如,树形结构。
- 连接方法:
- 链接方式是在节点的存储结构中附加指针域来存储结点间的逻辑关系;
- 链接方式中数据结点由两部分组成:数据域存放的数据本身,指针域存放指向其后继结点的指针;
- 指针域可以存放多个指针用来表达一个结点同时链接多个结点的情况;
- 链接方法非常适合用于那些需要经常增删结点而动态变化的数据结构;
- 缺点:需要从链头开始逐个搜索。
- 索引方法:
- 是顺序存储的扩展;
- 通过建造一个由整数域Z映射到存储地址域D的索引函数Y:Z → D。从而形成一个存储了一组指针的索引表,每个指针的指向存储区域的一个数据结点;
- 并非简单的线性函数;
- 索引表的数据空间是附加在结点存储空间之外的,每一个元素都指向相应的数据节点指针,即都是开始地址;
- 优点:提高检索效率;
- 应用:处理结点大小不等的数据结构。
- 散列方法:
- 是索引方法的一种延伸和扩展,也称为哈希法;
- 散列法利用哈希函数进行索引值的计算,然后通过索引表求出结点的指针地址。其主要思想是根据结点的关键码值来确定其存储地址,利用一种成为哈希函数(hash functions)的关系把关键码的值映射到存储空间的地址,然后把结点存入此存储单元中。
- ⭐重点:关键在于如何设计哈希函数、构造哈希表等
- 哈希函数的性质:计算出的地址尽可能均匀地分布在构造的哈希表地址空间。哈希函数计算应该简单化,以便提高地址计算速度。
⭐在具体应用中,可根据需要选用以上四种存储方法或者其组合:例如,树形结构的子节点表表示的就是顺序和链接的结合。另外一个逻辑结构可以由多种不同的存储方案,因此在选择存储方法时,还要综合考虑定义在其上的运算和其算法的具体实现。
1.2.3 抽象的数据类型
抽象意味着一个概念可能有多种实现方式:一旦一个抽象问题得到解决,则很多同类的问题便可以迎刃而解。用户自定义数据类型通常即是对多种可能的结构和实现的一种抽象。
🐷NOTE:将用户自定义的类型称作抽象数据类型(abstract data type)
作为描述数据结构的一种理论根据,抽象数据类型可以看做是定义了一组操作的一个抽象模型。其特点是将数据和操作封装一起,使得用户程序只能通过抽象数据类型所定义的操作来访问其中的数据,从而实现信息的隐藏。
例如:整数的加、减、乘、除四则运算可以定义为一个抽象数据类型。
⭐抽象的数据类型可以看成是数据的逻辑结构以及在逻辑结构上定义的抽象操作。