mirror of
https://github.com/142vip/408CSFamily.git
synced 2026-04-14 18:30:30 +08:00
init
This commit is contained in:
@@ -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)函数计算出元素的存储地址。
|
||||
|
||||
|
||||
优点:
|
||||
|
||||
- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了)
|
||||
|
||||
|
||||
缺点:
|
||||
|
||||
- 非常依赖于`散列函数`
|
||||
- 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突)
|
||||
- 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销
|
||||
|
||||
|
||||
### 数据的运算
|
||||
|
||||
数据上的运算包括:`运算的定义` 、`运算的实现`
|
||||
|
||||
- `运算的定义`:针对逻辑结构,指出运算的功能
|
||||
- `原酸的实现`:针对存储结构,指出运算的具体操作步骤
|
||||
|
||||
|
||||
|
||||
|
||||
线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。
|
||||
Reference in New Issue
Block a user