diff --git a/README.md b/README.md index 7bdf6df..011931b 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 a7760f5..12869a4 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 361e8c2..514034e 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 60c5b45..35e4e17 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. 数组与链表特点对比
Table. 数组与链表操作时间复杂度
+Table. 数组与链表操作时间复杂度
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 745431b..7742aec 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 832c3a8..7c8e22f 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 1282e89..5e7da39 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 的基本数据类型
Fig. 内存条、内存空间、内存地址
+Fig. 内存条、内存空间、内存地址
**内存资源是设计数据结构与算法的重要考虑因素。** 内存是所有程序的公共资源,当内存被某程序占用时,不能被其它程序同时使用。我们需要根据剩余内存资源的情况来设计算法。例如,若剩余内存空间有限,则要求算法占用的峰值内存不能超过系统剩余内存;若运行的程序很多、缺少大块连续的内存空间,则要求选取的数据结构必须能够存储在离散的内存空间内。 diff --git a/docs/chapter_dsa_introduction/index.md b/docs/chapter_dsa_introduction/index.md index aeff024..f998ed9 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 6355dfe..5f5bc23 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 97e378c..6d2fb0b 100644 --- a/docs/chapter_searching/summary.md +++ b/docs/chapter_searching/summary.md @@ -4,7 +4,7 @@ - 二分查找利用数据的有序性,通过循环不断缩小一半搜索区间来实现查找,其要求输入数据是有序的,并且仅适用于数组或基于数组实现的数据结构。 - 哈希查找借助哈希表来实现常数阶时间复杂度的查找操作,体现以空间换时间的算法思想。 -Table. 三种查找方法对比
+Table. 三种查找方法对比
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 5c6cdc9..bc2aaa5 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 c3acb74..79fd991 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 9b121f0..6a05c3c 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. 双向队列的常用操作
Fig. 队列的先入先出特性
+Fig. 队列的先入先出特性
## 队列常用操作 队列的常用操作见下表,方法命名需根据编程语言的设定来具体确定。 -Table. 队列的常用操作
+Table. 队列的常用操作
Fig. 栈的先入后出特性
+Fig. 栈的先入后出特性
## 栈常用操作 栈的常用操作见下表,方法名需根据编程语言设定来具体确定。 -Table. 栈的常用操作
+Table. 栈的常用操作
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. 二叉树的前 / 中 / 后序遍历
借助动画介绍重点,提升知识吸收效率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)