diff --git a/README.md b/README.md index 7bdf6df21..011931b22 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- +

@@ -12,17 +12,11 @@ 动画图解、能运行、可讨论的
数据结构与算法快速入门教程

-

- - - -

-

- 前往阅读 - - - hello-algo.pages.dev + 前往阅读 >> + + hello-algo.com

diff --git a/docs/chapter_array_and_linkedlist/array.md b/docs/chapter_array_and_linkedlist/array.md index a7760f524..12869a4a2 100644 --- a/docs/chapter_array_and_linkedlist/array.md +++ b/docs/chapter_array_and_linkedlist/array.md @@ -8,7 +8,7 @@ comments: true ![array_definition](array.assets/array_definition.png) -

Fig. 数组定义与存储方式

+

Fig. 数组定义与存储方式

!!! note @@ -42,7 +42,7 @@ comments: true ![array_memory_location_calculation](array.assets/array_memory_location_calculation.png) -

Fig. 数组元素的内存地址计算

+

Fig. 数组元素的内存地址计算

```java title="" // 元素内存地址 = 数组内存地址 + 元素长度 * 元素索引 @@ -117,7 +117,7 @@ elementAddr = firtstElementAddr + elementLength * elementIndex ![array_insert_remove_element](array.assets/array_insert_remove_element.png) -

Fig. 在数组中插入与删除元素

+

Fig. 在数组中插入与删除元素

=== "Java" diff --git a/docs/chapter_array_and_linkedlist/linked_list.md b/docs/chapter_array_and_linkedlist/linked_list.md index 361e8c28f..514034e25 100644 --- a/docs/chapter_array_and_linkedlist/linked_list.md +++ b/docs/chapter_array_and_linkedlist/linked_list.md @@ -14,7 +14,7 @@ comments: true ![linkedlist_definition](linked_list.assets/linkedlist_definition.png) -

Fig. 链表定义与存储方式

+

Fig. 链表定义与存储方式

=== "Java" @@ -86,7 +86,7 @@ comments: true ![linkedlist_insert_remove_node](linked_list.assets/linkedlist_insert_remove_node.png) -

Fig. 在链表中插入与删除结点

+

Fig. 在链表中插入与删除结点

=== "Java" @@ -219,4 +219,4 @@ comments: true ![linkedlist_common_types](linked_list.assets/linkedlist_common_types.png) -

Fig. 常见链表类型

+

Fig. 常见链表类型

diff --git a/docs/chapter_array_and_linkedlist/summary.md b/docs/chapter_array_and_linkedlist/summary.md index 60c5b45a6..35e4e17c8 100644 --- a/docs/chapter_array_and_linkedlist/summary.md +++ b/docs/chapter_array_and_linkedlist/summary.md @@ -11,7 +11,7 @@ comments: true ## 数组 VS 链表 -

Table. 数组与链表特点对比

+

Table. 数组与链表特点对比

@@ -28,7 +28,7 @@ comments: true 「缓存局部性(Cache locality)」涉及到了计算机操作系统,在本书不做展开介绍,建议有兴趣的同学 Google / Baidu 一下。 -

Table. 数组与链表操作时间复杂度

+

Table. 数组与链表操作时间复杂度

diff --git a/docs/chapter_computational_complexity/space_complexity.md b/docs/chapter_computational_complexity/space_complexity.md index b5b093021..b7856b65d 100644 --- a/docs/chapter_computational_complexity/space_complexity.md +++ b/docs/chapter_computational_complexity/space_complexity.md @@ -26,7 +26,7 @@ comments: true ![space_types](space_complexity.assets/space_types.png) -

Fig. 算法使用的相关空间

+

Fig. 算法使用的相关空间

=== "Java" @@ -144,7 +144,7 @@ $$ ![space_complexity_common_types](space_complexity.assets/space_complexity_common_types.png) -

Fig. 空间复杂度的常见类型

+

Fig. 空间复杂度的常见类型

!!! tip @@ -252,7 +252,7 @@ $$ ![space_complexity_recursive_linear](space_complexity.assets/space_complexity_recursive_linear.png) -

Fig. 递归函数产生的线性阶空间复杂度

+

Fig. 递归函数产生的线性阶空间复杂度

### 平方阶 $O(n^2)$ @@ -317,7 +317,7 @@ $$ ![space_complexity_recursive_quadratic](space_complexity.assets/space_complexity_recursive_quadratic.png) -

Fig. 递归函数产生的平方阶空间复杂度

+

Fig. 递归函数产生的平方阶空间复杂度

### 指数阶 $O(2^n)$ @@ -350,7 +350,7 @@ $$ ![space_complexity_exponential](space_complexity.assets/space_complexity_exponential.png) -

Fig. 满二叉树下的指数阶空间复杂度

+

Fig. 满二叉树下的指数阶空间复杂度

### 对数阶 $O(\log n)$ diff --git a/docs/chapter_computational_complexity/time_complexity.md b/docs/chapter_computational_complexity/time_complexity.md index 745431b2b..7742aec5f 100644 --- a/docs/chapter_computational_complexity/time_complexity.md +++ b/docs/chapter_computational_complexity/time_complexity.md @@ -92,7 +92,7 @@ $$ ![time_complexity_first_example](time_complexity.assets/time_complexity_first_example.png) -

Fig. 算法 A, B, C 的时间增长趋势

+

Fig. 算法 A, B, C 的时间增长趋势

相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足? @@ -153,7 +153,7 @@ $T(n)$ 是个一次函数,说明时间增长趋势是线性的,因此易得 ![asymptotic_upper_bound](time_complexity.assets/asymptotic_upper_bound.png) -

Fig. 函数的渐进上界

+

Fig. 函数的渐进上界

本质上看,计算渐进上界就是在找一个函数 $f(n)$ ,**使得在 $n$ 趋向于无穷大时,$T(n)$ 和 $f(n)$ 处于相同的增长级别(仅相差一个常数项 $c$ 的倍数)**。 @@ -245,7 +245,7 @@ $$ ![time_complexity_common_types](time_complexity.assets/time_complexity_common_types.png) -

Fig. 时间复杂度的常见类型

+

Fig. 时间复杂度的常见类型

!!! tip @@ -375,7 +375,7 @@ $$ ![time_complexity_constant_linear_quadratic](time_complexity.assets/time_complexity_constant_linear_quadratic.png) -

Fig. 常数阶、线性阶、平方阶的时间复杂度

+

Fig. 常数阶、线性阶、平方阶的时间复杂度

以「冒泡排序」为例,外层循环 $n - 1$ 次,内层循环 $n-1, n-2, \cdots, 2, 1$ 次,平均为 $\frac{n}{2}$ 次,因此时间复杂度为 $O(n^2)$ 。 @@ -454,7 +454,7 @@ $$ ![time_complexity_exponential](time_complexity.assets/time_complexity_exponential.png) -

Fig. 指数阶的时间复杂度

+

Fig. 指数阶的时间复杂度

在实际算法中,指数阶常出现于递归函数。例如以下代码,不断地一分为二,分裂 $n$ 次后停止。 @@ -516,7 +516,7 @@ $$ ![time_complexity_logarithmic](time_complexity.assets/time_complexity_logarithmic.png) -

Fig. 对数阶的时间复杂度

+

Fig. 对数阶的时间复杂度

与指数阶类似,对数阶也常出现于递归函数。以下代码形成了一个高度为 $\log_2 n$ 的递归树。 @@ -577,7 +577,7 @@ $$ ![time_complexity_logarithmic_linear](time_complexity.assets/time_complexity_logarithmic_linear.png) -

Fig. 线性对数阶的时间复杂度

+

Fig. 线性对数阶的时间复杂度

### 阶乘阶 $O(n!)$ @@ -618,7 +618,7 @@ $$ ![time_complexity_factorial](time_complexity.assets/time_complexity_factorial.png) -

Fig. 阶乘阶的时间复杂度

+

Fig. 阶乘阶的时间复杂度

## 最差、最佳、平均时间复杂度 diff --git a/docs/chapter_data_structure/classification_of_data_strcuture.md b/docs/chapter_data_structure/classification_of_data_strcuture.md index 832c3a8a2..7c8e22f0b 100644 --- a/docs/chapter_data_structure/classification_of_data_strcuture.md +++ b/docs/chapter_data_structure/classification_of_data_strcuture.md @@ -17,7 +17,7 @@ comments: true ![classification_logic_structure](classification_of_data_strcuture.assets/classification_logic_structure.png) -

Fig. 线性与非线性数据结构

+

Fig. 线性与非线性数据结构

## 物理结构:连续与离散 @@ -29,7 +29,7 @@ comments: true ![classification_phisical_structure](classification_of_data_strcuture.assets/classification_phisical_structure.png) -

Fig. 连续空间存储与离散空间存储

+

Fig. 连续空间存储与离散空间存储

**所有数据结构都是基于数组、或链表、或两者组合实现的。** 例如栈和队列,既可以使用数组实现、也可以使用链表实现,而例如哈希表,其实现同时包含了数组和链表。 diff --git a/docs/chapter_data_structure/data_and_memory.md b/docs/chapter_data_structure/data_and_memory.md index 1282e899b..5e7da3902 100644 --- a/docs/chapter_data_structure/data_and_memory.md +++ b/docs/chapter_data_structure/data_and_memory.md @@ -19,7 +19,7 @@ comments: true 1 字节 (byte) = 8 比特 (bit) , 1 比特即最基本的 1 个二进制位 -

Table. Java 的基本数据类型

+

Table. Java 的基本数据类型

@@ -57,7 +57,7 @@ comments: true === "C++" ```cpp title="" - + ``` === "Python" @@ -76,6 +76,6 @@ comments: true ![computer_memory_location](data_and_memory.assets/computer_memory_location.png) -

Fig. 内存条、内存空间、内存地址

+

Fig. 内存条、内存空间、内存地址

**内存资源是设计数据结构与算法的重要考虑因素。** 内存是所有程序的公共资源,当内存被某程序占用时,不能被其它程序同时使用。我们需要根据剩余内存资源的情况来设计算法。例如,若剩余内存空间有限,则要求算法占用的峰值内存不能超过系统剩余内存;若运行的程序很多、缺少大块连续的内存空间,则要求选取的数据结构必须能够存储在离散的内存空间内。 diff --git a/docs/chapter_dsa_introduction/index.md b/docs/chapter_dsa_introduction/index.md index aeff024a2..f998ed9dd 100644 --- a/docs/chapter_dsa_introduction/index.md +++ b/docs/chapter_dsa_introduction/index.md @@ -77,7 +77,7 @@ comments: true ![relationship_between_data_structure_and_algorithm](index.assets/relationship_between_data_structure_and_algorithm.png) -

Fig. 数据结构与算法的关系

+

Fig. 数据结构与算法的关系

!!! tip "约定俗成的习惯" diff --git a/docs/chapter_introduction/index.md b/docs/chapter_introduction/index.md index 6355dfe51..5f5bc2368 100644 --- a/docs/chapter_introduction/index.md +++ b/docs/chapter_introduction/index.md @@ -22,8 +22,8 @@ comments: true !!! quote "" -

追风赶月莫停留,平芜尽处是春山

-

一起加油!

+

追风赶月莫停留,平芜尽处是春山

+

一起加油!

## 内容结构 @@ -31,7 +31,7 @@ comments: true ![mindmap](index.assets/mindmap.png) -

Fig. 知识点思维导图

+

Fig. 知识点思维导图

### 复杂度分析 diff --git a/docs/chapter_searching/summary.md b/docs/chapter_searching/summary.md index 97e378c1a..6d2fb0b3f 100644 --- a/docs/chapter_searching/summary.md +++ b/docs/chapter_searching/summary.md @@ -4,7 +4,7 @@ - 二分查找利用数据的有序性,通过循环不断缩小一半搜索区间来实现查找,其要求输入数据是有序的,并且仅适用于数组或基于数组实现的数据结构。 - 哈希查找借助哈希表来实现常数阶时间复杂度的查找操作,体现以空间换时间的算法思想。 -

Table. 三种查找方法对比

+

Table. 三种查找方法对比

diff --git a/docs/chapter_sorting/bubble_sort.md b/docs/chapter_sorting/bubble_sort.md index bd9d9923c..2cca4c7e7 100644 --- a/docs/chapter_sorting/bubble_sort.md +++ b/docs/chapter_sorting/bubble_sort.md @@ -42,6 +42,8 @@ comments: true ![bubble_operation_step7](bubble_sort.assets/bubble_operation_step7.png) +

Fig. 冒泡操作

+ ## 算法流程 1. 设数组长度为 $n$ ,完成第一轮「冒泡」后,数组最大元素已在正确位置,接下来只需排序剩余 $n - 1$ 个元素。 @@ -52,6 +54,8 @@ comments: true ![bubble_sort](bubble_sort.assets/bubble_sort.png) +

Fig. 冒泡排序流程

+ === "Java" ```java diff --git a/docs/chapter_sorting/insertion_sort.md b/docs/chapter_sorting/insertion_sort.md index 5c6cdc94a..bc2aaa5c0 100644 --- a/docs/chapter_sorting/insertion_sort.md +++ b/docs/chapter_sorting/insertion_sort.md @@ -12,6 +12,8 @@ comments: true ![insertion_operation](insertion_sort.assets/insertion_operation.png) +

Fig. 插入操作

+ ## 算法流程 1. 第 1 轮先选取数组的 **第 2 个元素** 为 `base` ,执行「插入操作」后, **数组前 2 个元素已完成排序**。 @@ -22,6 +24,8 @@ comments: true ![insertion_sort](insertion_sort.assets/insertion_sort.png) +

Fig. 插入排序流程

+ === "Java" ```java diff --git a/docs/chapter_sorting/quick_sort.md b/docs/chapter_sorting/quick_sort.md index c3acb74f3..79fd9917c 100644 --- a/docs/chapter_sorting/quick_sort.md +++ b/docs/chapter_sorting/quick_sort.md @@ -33,7 +33,7 @@ comments: true === "Step 9" ![pivot_division_step9](quick_sort.assets/pivot_division_step9.png) -哨兵划分实现代码如下。 +

Fig. 哨兵划分

=== "Java" @@ -75,6 +75,8 @@ comments: true ![quick_sort](quick_sort.assets/quick_sort.png) +

Fig. 快速排序流程

+ === "Java" ```java diff --git a/docs/chapter_stack_and_queue/deque.md b/docs/chapter_stack_and_queue/deque.md index 9b121f0fb..6a05c3c19 100644 --- a/docs/chapter_stack_and_queue/deque.md +++ b/docs/chapter_stack_and_queue/deque.md @@ -4,13 +4,13 @@ ![deque_operations](deque.assets/deque_operations.png) -

Fig. 双向队列的操作

+

Fig. 双向队列的操作

## 双向队列常用操作 双向队列的常用操作见下表,方法名需根据编程语言设定来具体确定。 -

Table. 双向队列的常用操作

+

Table. 双向队列的常用操作

diff --git a/docs/chapter_stack_and_queue/queue.md b/docs/chapter_stack_and_queue/queue.md index 05e536438..0788ef03d 100644 --- a/docs/chapter_stack_and_queue/queue.md +++ b/docs/chapter_stack_and_queue/queue.md @@ -10,13 +10,13 @@ comments: true ![queue_operations](queue.assets/queue_operations.png) -

Fig. 队列的先入先出特性

+

Fig. 队列的先入先出特性

## 队列常用操作 队列的常用操作见下表,方法命名需根据编程语言的设定来具体确定。 -

Table. 队列的常用操作

+

Table. 队列的常用操作

diff --git a/docs/chapter_stack_and_queue/stack.md b/docs/chapter_stack_and_queue/stack.md index 977bf8e8b..f02e8a0f0 100644 --- a/docs/chapter_stack_and_queue/stack.md +++ b/docs/chapter_stack_and_queue/stack.md @@ -10,13 +10,13 @@ comments: true ![stack_operations](stack.assets/stack_operations.png) -

Fig. 栈的先入后出特性

+

Fig. 栈的先入后出特性

## 栈常用操作 栈的常用操作见下表,方法名需根据编程语言设定来具体确定。 -

Table. 栈的常用操作

+

Table. 栈的常用操作

diff --git a/docs/chapter_tree/binary_tree.md b/docs/chapter_tree/binary_tree.md index 8eb9eb249..07a9a648e 100644 --- a/docs/chapter_tree/binary_tree.md +++ b/docs/chapter_tree/binary_tree.md @@ -22,7 +22,7 @@ comments: true ![binary_tree_definition](binary_tree.assets/binary_tree_definition.png) -

Fig. 子结点与子树

+

Fig. 子结点与子树

需要注意,父结点、子结点、子树是可以向下递推的。例如,如果将上图的「结点 2」看作父结点,那么其左子节点和右子结点分别为「结点 4」和「结点 5」,左子树和右子树分别为「结点 4 以下的树」和「结点 5 以下的树」。 @@ -42,7 +42,7 @@ comments: true ![binary_tree_terminology](binary_tree.assets/binary_tree_terminology.png) -

Fig. 二叉树的常见术语

+

Fig. 二叉树的常见术语

## 二叉树最佳和最差结构 @@ -50,7 +50,7 @@ comments: true ![binary_tree_corner_cases](binary_tree.assets/binary_tree_corner_cases.png) -

Fig. 二叉树的最佳和最差结构

+

Fig. 二叉树的最佳和最差结构

在最佳和最差结构下,二叉树的结点数量和高度等性质达到最大(最小)值。 @@ -88,7 +88,7 @@ comments: true ![binary_tree_add_remove](binary_tree.assets/binary_tree_add_remove.png) -

Fig. 在二叉树中插入与删除结点

+

Fig. 在二叉树中插入与删除结点

```java title="binary_tree.java" TreeNode P = new TreeNode(0); @@ -115,7 +115,7 @@ n1.left = n2; ![binary_tree_bfs](binary_tree.assets/binary_tree_bfs.png) -

Fig. 二叉树的层序遍历

+

Fig. 二叉树的层序遍历

广度优先遍历一般借助「队列」来实现。队列的规则是 “先进先出” ,广度优先遍历的规则是 ”一层层平推“ ,两者背后的思想是一致的。 @@ -148,7 +148,7 @@ n1.left = n2; ![binary_tree_dfs](binary_tree.assets/binary_tree_dfs.png) -

Fig. 二叉树的前 / 中 / 后序遍历

+

Fig. 二叉树的前 / 中 / 后序遍历

diff --git a/docs/index.md b/docs/index.md index d767a517d..1c4afc93e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,7 @@ hide:

「清晰动画讲解」

-

借助动画介绍重点,提升知识吸收效率
HTML 文档,支持笔记本、平板、手机多种终端

+

借助动画介绍重点,提升知识吸收效率
HTML 文档,支持笔记本、平板、手机多种终端

![algorithm_animation](index.assets/animation.gif) @@ -29,7 +29,7 @@ hide:

「代码实践导向」

-

示例代码皆可一键运行,在调试中加深理解
提供 Java, C++, Python 源码与详细注释

+

示例代码皆可一键运行,在调试中加深理解
提供 Java, C++, Python 源码与详细注释

![running_code](index.assets/running_code.gif) @@ -37,7 +37,7 @@ hide:

「可讨论与提问」

-

在评论区与小伙伴们一起学习进步
作者定期回复评论问题(一般 < 72h )

+

在评论区与小伙伴们一起学习进步
作者定期回复评论问题(一般 < 72h )

![comment](index.assets/comment.gif)