Update docs for deployment on Vercel.

This commit is contained in:
krahets
2022-11-22 17:47:26 +08:00
parent eec011d595
commit 33d79ea6da
124 changed files with 3964 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,43 @@
---
comments: true
---
# 数据结构分类
数据结构主要可根据「逻辑结构」和「物理结构」两种角度进行分类。
## 逻辑结构:线性与非线性
**「逻辑结构」反映了数据之间的逻辑关系。** 数组和链表的数据按照顺序依次排列,反映了数据间的线性关系;树从顶至底按层级排列,反映了祖先与后代之间的派生关系;图由结点和边组成,反映了复杂网络关系。
我们一般将逻辑结构分为「线性」和「非线性」两种。“线性” 这个概念很直观,即表明数据在逻辑关系上是排成一条线的;而如果数据之间的逻辑关系是非线形的(例如是网状或树状的),那么就是非线性数据结构。
- **线性数据结构:** 数组、链表、栈、队列、哈希表;
- **非线性数据结构:** 树、图、堆、哈希表;
![classification_logic_structure](classification_of_data_strcuture.assets/classification_logic_structure.png)
<p style="text-align:center"> Fig. 线性与非线性数据结构 </p>
## 物理结构:连续与离散
!!! note
若感到阅读困难,建议先看完下个章节「数组与链表」,再回过头来理解物理结构的含义。
**「物理结构」反映了数据在计算机内存中的存储方式。** 从本质上看,分别是 **数组的连续空间存储****链表的离散空间存储** 。物理结构从底层上决定了数据的访问、更新、增删等操作方法,在时间效率和空间效率方面呈现出此消彼长的特性。
![classification_phisical_structure](classification_of_data_strcuture.assets/classification_phisical_structure.png)
<p style="text-align:center"> Fig. 连续空间存储与离散空间存储 </p>
**所有数据结构都是基于数组、或链表、或两者组合实现的。** 例如栈和队列,既可以使用数组实现、也可以使用链表实现,而例如哈希表,其实现同时包含了数组和链表。
- **基于数组可实现:** 栈、队列、堆、哈希表、矩阵、张量(维度 $\geq 3$ 的数组)等;
- **基于链表可实现:** 栈、队列、堆、哈希表、树、图等;
基于数组实现的数据结构也被称为「静态数据结构」,这意味着该数据结构在在被初始化后,长度不可变。相反地,基于链表实现的数据结构被称为「动态数据结构」,该数据结构在被初始化后,我们也可以在程序运行中修改其长度。
!!! tip
数组与链表是其他所有数据结构的 “底层积木”,建议读者一定要多花些时间了解。

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@@ -0,0 +1,81 @@
---
comments: true
---
# 数据与内存
## 基本数据类型
谈到计算机中的数据我们能够想到文本、图片、视频、语音、3D 模型等等,这些数据虽然组织形式不同,但是有一个共同点,即都是由各种基本数据类型构成的。
**「基本数据类型」是 CPU 可以直接进行运算的类型,在算法中直接被使用。**
- 「整数」根据不同的长度分为 byte, short, int, long ,根据算法需求选用,即在满足取值范围的情况下尽量减小内存空间占用。
- 「浮点数」代表小数,根据长度分为 float, double ,同样根据算法的实际需求选用。
- 「字符」在计算机中是以字符集的形式保存的char 的值实际上是数字,代表字符集中的编号,计算机通过字符集查表来完成编号到字符的转换。
- 「布尔」代表逻辑中的 ”是“ 与 ”否“ ,其占用空间需要具体根据编程语言确定,通常为 1 byte 或 1 bit 。
!!! note "字节与比特"
1 字节 (byte) = 8 比特 (bit) 1 比特即最基本的 1 个二进制位
<p style="text-align:center"> Table. Java 的基本数据类型 </p>
<div class="center-table" markdown>
| 类别 | 符号 | 占用空间 | 取值范围 | 默认值 |
| ------ | ----------- | ----------------- | ---------------------------------------------- | -------------- |
| 整数 | byte | 1 byte | $-2^7$ ~ $2^7 - 1$ ( $-128$ ~ $127$ ) | $0$ |
| | short | 2 bytes | $-2^{15}$ ~ $2^{15} - 1$ | $0$ |
| | **int** | 4 bytes | $-2^{31}$ ~ $2^{31} - 1$ | $0$ |
| | long | 8 bytes | $-2^{63}$ ~ $2^{63} - 1$ | $0$ |
| 浮点数 | **float** | 4 bytes | $-3.4 \times 10^{38}$ ~ $3.4 \times 10^{38}$ | $0.0$ f |
| | double | 8 bytes | $-1.7 \times 10^{308}$ ~ $1.7 \times 10^{308}$ | $0.0$ |
| 字符 | **char** | 2 bytes | $0$ ~ $2^{16} - 1$ | $0$ |
| 布尔 | **boolean(bool)** | 1 byte / 1 bit | $\text{true}$ 或 $\text{false}$ | $\text{false}$ |
</div>
!!! tip
以上表格中,加粗项在「算法题」中最为常用。此表格无需硬背,大致理解即可,需要时可以通过查表来回忆。
**「基本数据类型」与「数据结构」之间的联系与区别**
我们知道,数据结构是在计算机中 **组织与存储数据的方式** ,它的主语是 “结构” ,而不是 “数据” 。比如,我们想要表示 “一排数字” ,自然应该使用「数组」这个数据结构。数组的存储方式使之可以表示数字的相邻关系、先后关系等一系列我们需要的信息,但至于其中存储的是整数 int ,还是小数 float ,或是字符 char **则与所谓的数据的结构无关了**。
=== "Java"
```java
/* 使用多种「基本数据类型」来初始化「数组」 */
int[] numbers = new int[5];
float[] decimals = new float[5];
char[] characters = new char[5];
boolean[] booleans = new boolean[5];
```
=== "C++"
```cpp title=""
```
=== "Python"
```python title=""
```
## 计算机内存
在计算机中,内存和硬盘是两种主要的存储硬件设备。「硬盘」主要用于长期存储数据,容量较大(通常可达到 TB 级别)、速度较慢。「内存」用于运行程序时暂存数据,速度更快,但容量较小(通常为 GB 级别)。
**算法运行中,相关数据都被存储在内存中。** 下图展示了一个计算机内存条,其中每个黑色方块都包含一块内存空间。我们可以将内存想象成一个巨大的 Excel 表格,其中每个单元格都可以存储 1 byte 的数据,在算法运行时,所有数据都被存储在这些单元格中。
**系统通过「内存地址 Memory Location」来访问目标内存位置的数据。** 计算机根据特定规则给表格中每个单元格编号,保证每块内存空间都有独立的内存地址。自此,程序便通过这些地址,访问内存中的数据。
![computer_memory_location](data_and_memory.assets/computer_memory_location.png)
<p style="text-align:center"> Fig. 内存条、内存空间、内存地址 </p>
**内存资源是设计数据结构与算法的重要考虑因素。** 内存是所有程序的公共资源,当内存被某程序占用时,不能被其它程序同时使用。我们需要根据剩余内存资源的情况来设计算法。例如,若剩余内存空间有限,则要求算法占用的峰值内存不能超过系统剩余内存;若运行的程序很多、缺少大块连续的内存空间,则要求选取的数据结构必须能够存储在离散的内存空间内。

View File

@@ -0,0 +1,11 @@
---
comments: true
---
# 小结
- 整数 byte, short, int, long 、浮点数 float, double 、字符 char 、布尔 boolean 是计算机中的基本数据类型,占用空间的大小决定了它们的取值范围。
- 在程序运行时,数据存储在计算机的内存中。内存中每块空间都有独立的内存地址,程序是通过内存地址来访问数据的。
- 数据结构主要可以从逻辑结构和物理结构两个角度进行分类。逻辑结构反映了数据中元素之间的逻辑关系,物理结构反映了数据在计算机内存中的存储形式。
- 常见的逻辑结构有线性、树状、网状等。我们一般根据逻辑结构将数据结构分为线性(数组、链表、栈、队列)和非线性(树、图、堆)两种。根据实现方式的不同,哈希表可能是线性或非线性。
- 物理结构主要有两种,分别是连续空间存储(数组)和离散空间存储(链表),所有的数据结构都是由数组、或链表、或两者组合实现的。