1
0
mirror of https://github.com/142vip/408CSFamily.git synced 2026-04-14 18:30:30 +08:00
This commit is contained in:
mmdapl
2022-04-08 00:10:38 +08:00
parent ad70cb62ae
commit 42117a0dd9
47 changed files with 12625 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
<!--
* @Description:
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-03-07 21:55:06
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-03-07 21:55:14
-->
## 数据结构三要素
- 数据的逻辑结构
- 数据的存储结构
- 数据的运算
### 数据的逻辑结构
数据元素之间的逻辑关系,从逻辑关系上描述数据,叫做数据的逻辑结构。
与数据的存储(物理)结构无关,是独立于计算机的。
可以分为:
- 线性结构
- 非线性结构
线性表是典型的线性结构,衍生出的栈、队列、串、数组、广义表也都是线性结构;
非线性结构主要有:集合、树(一般树、二叉树)、图(有向图、无向图)
特别注意:
- `集合`:结构中的数据元素之间**除了“同属于一个集合”的关系外,别无其他关系。**
- `线性结构`:结构中的数据元素之间**只存在一对一的关系**。
- `树形结构`:结构中的数据元素之间**存在一对多的关系。**
- `图状结构和网状结构`:结构中的数据元素之间**存在多对多的关系。**
### 数据的存储(物理)结构
数据结构在计算机中的表示(映像)。包括数据`元素的表示``关系的表示`
存储结构是逻辑结构用计算机语言实现的,依赖于计算机语言。
可以分为:
- 顺序存储
- 链式存储
- 索引存储
- 散列Hash存储
**注意:存储和存取的概念不一样**
#### 顺序存储
**逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现。**
优点:
- 可以实现随机存取
- 元素占用最少的存储空间
缺点:
- 只能使用相邻的一整块存储单元,依赖于物理结构相邻;
- 容易产生`外部碎片`
什么是内外部碎片?
> 参考资料https://blog.csdn.net/qq_22238021/article/details/80209062
- 外部碎片:`还没有分配出去`(不属于任何进程),但是**由于大小而无法分配给申请内存空间的新进程的内存空闲块。**
- 内部碎片:`已经被分配出去`(能明确指出属于哪个进程)的**内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。**
#### 链式存储
与顺序存储不同,**链式存储不要求逻辑上相邻的元素在物理位置上也相邻。**
借助指示元素存储地址的`指针`表示元素之间的逻辑关系。
优点:
- 不会出现碎片现象
- 充分利用所有存储单元
缺点:
- 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习)。
- 链式存储,**只能实现`顺序存取`,不能实现`随机存取`(指针的遍历)**
#### 索引存储
存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的`索引表`
**索引表的每一项称为索引项,索引项的一般形式是:<关键字,地址>**
优点:
- 检索快(就好比字典有了目录,查询就很快了)
缺点:
- 增加了索引表,占用较多的存储空间(典型的空间换时间策略)
- 增加、删除数据时,需要对应修改索引表,花费更多时间。
#### 散列Hash存储
根据元素的关键字直接通过散列Hash函数计算出元素的存储地址。
优点:
- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了)
缺点:
- 非常依赖于`散列函数`
- 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突)
- 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销
### 数据的运算
数据上的运算包括:`运算的定义``运算的实现`
- `运算的定义`:针对逻辑结构,指出运算的功能
- `原酸的实现`:针对存储结构,指出运算的具体操作步骤
线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。