diff --git a/docs/chapter_computational_complexity/performance_evaluation.md b/docs/chapter_computational_complexity/performance_evaluation.md index f881e3fef..a73f4aed8 100644 --- a/docs/chapter_computational_complexity/performance_evaluation.md +++ b/docs/chapter_computational_complexity/performance_evaluation.md @@ -26,10 +26,10 @@ 由于实际测试具有较大的局限性,我们可以考虑仅通过一些计算来评估算法的效率。这种估算方法被称为「渐近复杂度分析 Asymptotic Complexity Analysis」,简称为「复杂度分析」。 -**复杂度分析评估的是算法运行效率随着输入数据量增多时的增长趋势**。这个定义有些拗口,我们可以将其分为三个重点来理解: +复杂度分析评估的是算法执行所需的时间和空间资源。**它被表示为一个函数,描述了随着输入数据大小的增加,算法所需时间(空间)的增长趋势**。这个定义有些拗口,我们可以将其分为三个重点来理解: -1. “算法运行效率”可分为运行时间和占用空间两部分,与之对应地,复杂度可分为「时间复杂度 Time Complexity」和「空间复杂度 Space Complexity」。 -2. “随着输入数据量增多时”意味着复杂度反映了算法运行效率与输入数据量之间的关系。 +1. “时间(空间)”分别对应「时间复杂度 Time Complexity」和「空间复杂度 Space Complexity」。 +2. “随着输入数据大小的增加”意味着复杂度反映了算法运行效率与输入数据体量之间的关系。 3. “增长趋势”表示复杂度分析关注的是算法时间与空间的增长趋势,而非具体的运行时间或占用空间。 **复杂度分析克服了实际测试方法的弊端**。首先,它独立于测试环境,分析结果适用于所有运行平台。其次,它可以体现不同数据量下的算法效率,尤其是在大数据量下的算法性能。 diff --git a/docs/chapter_dynamic_programming/edit_distance_problem.md b/docs/chapter_dynamic_programming/edit_distance_problem.md index fb847a55c..885cbf8e9 100644 --- a/docs/chapter_dynamic_programming/edit_distance_problem.md +++ b/docs/chapter_dynamic_programming/edit_distance_problem.md @@ -20,6 +20,8 @@ ![基于决策树模型表示编辑距离问题](edit_distance_problem.assets/edit_distance_decision_tree.png) +### 动态规划思路 + **第一步:思考每轮的决策,定义状态,从而得到 $dp$ 表** 每一轮的决策是对字符串 $s$ 进行一次编辑操作。 diff --git a/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md b/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md index 8657a55ca..e170dd6b4 100644 --- a/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md +++ b/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md @@ -10,6 +10,8 @@ ![完全背包问题的示例数据](unbounded_knapsack_problem.assets/unbounded_knapsack_example.png) +### 动态规划思路 + 完全背包和 0-1 背包问题非常相似,**区别仅在于不限制物品的选择次数**。 - 在 0-1 背包中,每个物品只有一个,因此将物品 $i$ 放入背包后,只能从前 $i-1$ 个物品中选择。 @@ -210,6 +212,8 @@ $$ ![零钱兑换问题的示例数据](unbounded_knapsack_problem.assets/coin_change_example.png) +### 动态规划思路 + **零钱兑换可以看作是完全背包的一种特殊情况**,两者具有以下联系与不同点: - 两道题可以相互转换,“物品”对应于“硬币”、“物品重量”对应于“硬币面值”、“背包容量”对应于“目标金额”。 @@ -450,6 +454,8 @@ $$ ![零钱兑换问题 II 的示例数据](unbounded_knapsack_problem.assets/coin_change_ii_example.png) +### 动态规划思路 + 相比于上一题,本题目标是组合数量,因此子问题变为:**前 $i$ 种硬币能够凑出金额 $a$ 的组合数量**。而 $dp$ 表仍然是尺寸为 $(n+1) \times (amt + 1)$ 的二维矩阵。 当前状态的组合数量等于不选当前硬币与选当前硬币这两种决策的组合数量之和。状态转移方程为: diff --git a/docs/chapter_heap/build_heap.md b/docs/chapter_heap/build_heap.md index 48051864f..a3d4d04be 100644 --- a/docs/chapter_heap/build_heap.md +++ b/docs/chapter_heap/build_heap.md @@ -1,16 +1,18 @@ # 建堆操作 -如果我们想要根据输入列表生成一个堆,这个过程被称为「建堆」。 +在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为「建堆」。 ## 借助入堆方法实现 -最直接的方法是借助“元素入堆操作”实现,首先创建一个空堆,然后将列表元素依次添加到堆中。 +最直接的方法是借助“元素入堆操作”实现。我们首先创建一个空堆,然后将列表元素依次执行“入堆”。 -设元素数量为 $n$ ,则最后一个元素入堆的时间复杂度为 $O(\log n)$ 。在依次添加元素时,堆的平均长度为 $\frac{n}{2}$ ,因此该方法的总体时间复杂度为 $O(n \log n)$ 。 +设元素数量为 $n$ ,入堆操作使用 $O(\log{n})$ 时间,因此将所有元素入堆的时间复杂度为 $O(n \log n)$ 。 ## 基于堆化操作实现 -有趣的是,存在一种更高效的建堆方法,其时间复杂度仅为 $O(n)$ 。我们先将列表所有元素原封不动添加到堆中,**然后迭代地对各个节点执行“从顶至底堆化”**。当然,**我们不需要对叶节点执行堆化操作**,因为它们没有子节点。 +有趣的是,存在一种更高效的建堆方法,其时间复杂度可以达到 $O(n)$ 。我们先将列表所有元素原封不动添加到堆中,然后倒序遍历该堆,依次对每个节点执行“从顶至底堆化”。 + +请注意,因为叶节点没有子节点,所以无需堆化。在代码实现中,我们从最后一个节点的父节点开始进行堆化。 === "Java" @@ -88,7 +90,7 @@ 为什么第二种建堆方法的时间复杂度是 $O(n)$ ?我们来展开推算一下。 -- 完全二叉树中,设节点总数为 $n$ ,则叶节点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此,在排除叶节点后,需要堆化的节点数量为 $(n - 1)/2$ ,复杂度为 $O(n)$ 。 +- 在完全二叉树中,设节点总数为 $n$ ,则叶节点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此,在排除叶节点后,需要堆化的节点数量为 $(n - 1)/2$ ,复杂度为 $O(n)$ 。 - 在从顶至底堆化的过程中,每个节点最多堆化到叶节点,因此最大迭代次数为二叉树高度 $O(\log n)$ 。 将上述两者相乘,可得到建堆过程的时间复杂度为 $O(n \log n)$ 。**然而,这个估算结果并不准确,因为我们没有考虑到二叉树底层节点数量远多于顶层节点的特性**。 @@ -112,7 +114,7 @@ T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \cdots + 2^{h-1}\times1 \newline \end{aligned} $$ -**使用错位相减法**,令下式 $2 T(h)$ 减去上式 $T(h)$ ,可得 +使用错位相减法,用下式 $2 T(h)$ 减去上式 $T(h)$ ,可得 $$ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \cdots + 2^{h-1} + 2^h diff --git a/mkdocs.yml b/mkdocs.yml index 0ee624806..a121f8a1f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -132,157 +132,157 @@ extra_css: # Page tree nav: - - 0.   前言: + - 第 0 章   前言: # [icon: material/book-open-outline] - chapter_preface/index.md - - 0.1.   关于本书: chapter_preface/about_the_book.md - - 0.2.   如何使用本书: chapter_preface/suggestions.md - - 0.3.   小结: chapter_preface/summary.md - - 1.   初识算法: + - 0.1   关于本书: chapter_preface/about_the_book.md + - 0.2   如何使用本书: chapter_preface/suggestions.md + - 0.3   小结: chapter_preface/summary.md + - 第 1 章   初识算法: # [icon: material/calculator-variant-outline] - chapter_introduction/index.md - - 1.1.   算法无处不在: chapter_introduction/algorithms_are_everywhere.md - - 1.2.   算法是什么: chapter_introduction/what_is_dsa.md - - 1.3.   小结: chapter_introduction/summary.md - - 2.   复杂度: + - 1.1   算法无处不在: chapter_introduction/algorithms_are_everywhere.md + - 1.2   算法是什么: chapter_introduction/what_is_dsa.md + - 1.3   小结: chapter_introduction/summary.md + - 第 2 章   复杂度: # [icon: material/timer-sand] - chapter_computational_complexity/index.md - - 2.1.   算法效率评估: chapter_computational_complexity/performance_evaluation.md - - 2.2.   时间复杂度: chapter_computational_complexity/time_complexity.md - - 2.3.   空间复杂度: chapter_computational_complexity/space_complexity.md - - 2.4.   小结: chapter_computational_complexity/summary.md - - 3.   数据结构: + - 2.1   算法效率评估: chapter_computational_complexity/performance_evaluation.md + - 2.2   时间复杂度: chapter_computational_complexity/time_complexity.md + - 2.3   空间复杂度: chapter_computational_complexity/space_complexity.md + - 2.4   小结: chapter_computational_complexity/summary.md + - 第 3 章   数据结构: # [icon: material/shape-outline] - chapter_data_structure/index.md - - 3.1.   数据结构分类: chapter_data_structure/classification_of_data_structure.md - - 3.2.   基本数据类型: chapter_data_structure/basic_data_types.md - - 3.3.   数字编码 *: chapter_data_structure/number_encoding.md - - 3.4.   字符编码 *: chapter_data_structure/character_encoding.md - - 3.5.   小结: chapter_data_structure/summary.md - - 4.   数组与链表: + - 3.1   数据结构分类: chapter_data_structure/classification_of_data_structure.md + - 3.2   基本数据类型: chapter_data_structure/basic_data_types.md + - 3.3   数字编码 *: chapter_data_structure/number_encoding.md + - 3.4   字符编码 *: chapter_data_structure/character_encoding.md + - 3.5   小结: chapter_data_structure/summary.md + - 第 4 章   数组与链表: # [icon: material/view-list-outline] - chapter_array_and_linkedlist/index.md - - 4.1.   数组: chapter_array_and_linkedlist/array.md - - 4.2.   链表: chapter_array_and_linkedlist/linked_list.md - - 4.3.   列表: chapter_array_and_linkedlist/list.md - - 4.4.   小结: chapter_array_and_linkedlist/summary.md - - 5.   栈与队列: + - 4.1   数组: chapter_array_and_linkedlist/array.md + - 4.2   链表: chapter_array_and_linkedlist/linked_list.md + - 4.3   列表: chapter_array_and_linkedlist/list.md + - 4.4   小结: chapter_array_and_linkedlist/summary.md + - 第 5 章   栈与队列: # [icon: material/stack-overflow] - chapter_stack_and_queue/index.md - - 5.1.   栈: chapter_stack_and_queue/stack.md - - 5.2.   队列: chapter_stack_and_queue/queue.md - - 5.3.   双向队列: chapter_stack_and_queue/deque.md - - 5.4.   小结: chapter_stack_and_queue/summary.md - - 6.   散列表: + - 5.1   栈: chapter_stack_and_queue/stack.md + - 5.2   队列: chapter_stack_and_queue/queue.md + - 5.3   双向队列: chapter_stack_and_queue/deque.md + - 5.4   小结: chapter_stack_and_queue/summary.md + - 第 6 章   散列表: # [icon: material/table-search] - chapter_hashing/index.md - - 6.1.   哈希表: chapter_hashing/hash_map.md - - 6.2.   哈希冲突: chapter_hashing/hash_collision.md - - 6.3.   哈希算法: chapter_hashing/hash_algorithm.md - - 6.4.   小结: chapter_hashing/summary.md - - 7.   树: + - 6.1   哈希表: chapter_hashing/hash_map.md + - 6.2   哈希冲突: chapter_hashing/hash_collision.md + - 6.3   哈希算法: chapter_hashing/hash_algorithm.md + - 6.4   小结: chapter_hashing/summary.md + - 第 7 章   树: # [icon: material/graph-outline] - chapter_tree/index.md - - 7.1.   二叉树: chapter_tree/binary_tree.md - - 7.2.   二叉树遍历: chapter_tree/binary_tree_traversal.md - - 7.3.   二叉树数组表示: chapter_tree/array_representation_of_tree.md - - 7.4.   二叉搜索树: chapter_tree/binary_search_tree.md - - 7.5.   AVL 树 *: chapter_tree/avl_tree.md - - 7.6.   小结: chapter_tree/summary.md - - 8.   堆: + - 7.1   二叉树: chapter_tree/binary_tree.md + - 7.2   二叉树遍历: chapter_tree/binary_tree_traversal.md + - 7.3   二叉树数组表示: chapter_tree/array_representation_of_tree.md + - 7.4   二叉搜索树: chapter_tree/binary_search_tree.md + - 7.5   AVL 树 *: chapter_tree/avl_tree.md + - 7.6   小结: chapter_tree/summary.md + - 第 8 章   堆: # [icon: material/family-tree] - chapter_heap/index.md - - 8.1.   堆: chapter_heap/heap.md - - 8.2.   建堆操作: chapter_heap/build_heap.md - - 8.3.   Top-K 问题: chapter_heap/top_k.md - - 8.4.   小结: chapter_heap/summary.md - - 9.   图: + - 8.1   堆: chapter_heap/heap.md + - 8.2   建堆操作: chapter_heap/build_heap.md + - 8.3   Top-K 问题: chapter_heap/top_k.md + - 8.4   小结: chapter_heap/summary.md + - 第 9 章   图: # [icon: material/graphql] - chapter_graph/index.md - - 9.1.   图: chapter_graph/graph.md - - 9.2.   图基础操作: chapter_graph/graph_operations.md - - 9.3.   图的遍历: chapter_graph/graph_traversal.md - - 9.4.   小结: chapter_graph/summary.md - - 10.   搜索: + - 9.1   图: chapter_graph/graph.md + - 9.2   图基础操作: chapter_graph/graph_operations.md + - 9.3   图的遍历: chapter_graph/graph_traversal.md + - 9.4   小结: chapter_graph/summary.md + - 第 10 章   搜索: # [icon: material/text-search] - chapter_searching/index.md - - 10.1.   二分查找: chapter_searching/binary_search.md + - 10.1   二分查找: chapter_searching/binary_search.md # [status: new] - - 10.2.   二分查找插入点: chapter_searching/binary_search_insertion.md + - 10.2   二分查找插入点: chapter_searching/binary_search_insertion.md # [status: new] - - 10.3.   二分查找边界: chapter_searching/binary_search_edge.md - - 10.4.   哈希优化策略: chapter_searching/replace_linear_by_hashing.md - - 10.5.   重识搜索算法: chapter_searching/searching_algorithm_revisited.md - - 10.6.   小结: chapter_searching/summary.md - - 11.   排序: + - 10.3   二分查找边界: chapter_searching/binary_search_edge.md + - 10.4   哈希优化策略: chapter_searching/replace_linear_by_hashing.md + - 10.5   重识搜索算法: chapter_searching/searching_algorithm_revisited.md + - 10.6   小结: chapter_searching/summary.md + - 第 11 章   排序: # [icon: material/sort-ascending] - chapter_sorting/index.md - - 11.1.   排序算法: chapter_sorting/sorting_algorithm.md - - 11.2.   选择排序: chapter_sorting/selection_sort.md - - 11.3.   冒泡排序: chapter_sorting/bubble_sort.md - - 11.4.   插入排序: chapter_sorting/insertion_sort.md - - 11.5.   快速排序: chapter_sorting/quick_sort.md - - 11.6.   归并排序: chapter_sorting/merge_sort.md - - 11.7.   堆排序: chapter_sorting/heap_sort.md - - 11.8.   桶排序: chapter_sorting/bucket_sort.md - - 11.9.   计数排序: chapter_sorting/counting_sort.md - - 11.10.   基数排序: chapter_sorting/radix_sort.md - - 11.11.   小结: chapter_sorting/summary.md - - 12.   分治: + - 11.1   排序算法: chapter_sorting/sorting_algorithm.md + - 11.2   选择排序: chapter_sorting/selection_sort.md + - 11.3   冒泡排序: chapter_sorting/bubble_sort.md + - 11.4   插入排序: chapter_sorting/insertion_sort.md + - 11.5   快速排序: chapter_sorting/quick_sort.md + - 11.6   归并排序: chapter_sorting/merge_sort.md + - 11.7   堆排序: chapter_sorting/heap_sort.md + - 11.8   桶排序: chapter_sorting/bucket_sort.md + - 11.9   计数排序: chapter_sorting/counting_sort.md + - 11.10   基数排序: chapter_sorting/radix_sort.md + - 11.11   小结: chapter_sorting/summary.md + - 第 12 章   分治: # [icon: material/set-split, status: new] - chapter_divide_and_conquer/index.md # [status: new] - - 12.1.   分治算法: chapter_divide_and_conquer/divide_and_conquer.md + - 12.1   分治算法: chapter_divide_and_conquer/divide_and_conquer.md # [status: new] - - 12.2.   分治搜索策略: chapter_divide_and_conquer/binary_search_recur.md + - 12.2   分治搜索策略: chapter_divide_and_conquer/binary_search_recur.md # [status: new] - - 12.3.   构建树问题: chapter_divide_and_conquer/build_binary_tree_problem.md + - 12.3   构建树问题: chapter_divide_and_conquer/build_binary_tree_problem.md # [status: new] - - 12.4.   汉诺塔问题: chapter_divide_and_conquer/hanota_problem.md + - 12.4   汉诺塔问题: chapter_divide_and_conquer/hanota_problem.md # [status: new] - - 12.5.   小结: chapter_divide_and_conquer/summary.md - - 13.   回溯: + - 12.5   小结: chapter_divide_and_conquer/summary.md + - 第 13 章   回溯: # [icon: material/map-marker-path] - chapter_backtracking/index.md - - 13.1.   回溯算法: chapter_backtracking/backtracking_algorithm.md - - 13.2.   全排列问题: chapter_backtracking/permutations_problem.md - - 13.3.   子集和问题: chapter_backtracking/subset_sum_problem.md - - 13.4.   N 皇后问题: chapter_backtracking/n_queens_problem.md - - 13.5.   小结: chapter_backtracking/summary.md - - 14.   动态规划: + - 13.1   回溯算法: chapter_backtracking/backtracking_algorithm.md + - 13.2   全排列问题: chapter_backtracking/permutations_problem.md + - 13.3   子集和问题: chapter_backtracking/subset_sum_problem.md + - 13.4   N 皇后问题: chapter_backtracking/n_queens_problem.md + - 13.5   小结: chapter_backtracking/summary.md + - 第 14 章   动态规划: # [icon: material/table-pivot, status: new] - chapter_dynamic_programming/index.md # [status: new] - - 14.1.   初探动态规划: chapter_dynamic_programming/intro_to_dynamic_programming.md + - 14.1   初探动态规划: chapter_dynamic_programming/intro_to_dynamic_programming.md # [status: new] - - 14.2.   DP 问题特性: chapter_dynamic_programming/dp_problem_features.md + - 14.2   DP 问题特性: chapter_dynamic_programming/dp_problem_features.md # [status: new] - - 14.3.   DP 解题思路: chapter_dynamic_programming/dp_solution_pipeline.md + - 14.3   DP 解题思路: chapter_dynamic_programming/dp_solution_pipeline.md # [status: new] - - 14.4.   0-1 背包问题: chapter_dynamic_programming/knapsack_problem.md + - 14.4   0-1 背包问题: chapter_dynamic_programming/knapsack_problem.md # [status: new] - - 14.5.   完全背包问题: chapter_dynamic_programming/unbounded_knapsack_problem.md + - 14.5   完全背包问题: chapter_dynamic_programming/unbounded_knapsack_problem.md # [status: new] - - 14.6.   编辑距离问题: chapter_dynamic_programming/edit_distance_problem.md + - 14.6   编辑距离问题: chapter_dynamic_programming/edit_distance_problem.md # [status: new] - - 14.7.   小结: chapter_dynamic_programming/summary.md - - 15.   贪心: + - 14.7   小结: chapter_dynamic_programming/summary.md + - 第 15 章   贪心: # [icon: material/head-heart-outline, status: new] - chapter_greedy/index.md # [status: new] - - 15.1.   贪心算法: chapter_greedy/greedy_algorithm.md + - 15.1   贪心算法: chapter_greedy/greedy_algorithm.md # [status: new] - - 15.2.   分数背包问题: chapter_greedy/fractional_knapsack_problem.md + - 15.2   分数背包问题: chapter_greedy/fractional_knapsack_problem.md # [status: new] - - 15.3.   最大容量问题: chapter_greedy/max_capacity_problem.md + - 15.3   最大容量问题: chapter_greedy/max_capacity_problem.md # [status: new] - - 15.4.   最大切分乘积问题: chapter_greedy/max_product_cutting_problem.md + - 15.4   最大切分乘积问题: chapter_greedy/max_product_cutting_problem.md # [status: new] - - 15.5.   小结: chapter_greedy/summary.md - - 16.   附录: + - 15.5   小结: chapter_greedy/summary.md + - 第 16 章   附录: # [icon: material/help-circle-outline] - chapter_appendix/index.md - - 16.1.   编程环境安装: chapter_appendix/installation.md - - 16.2.   一起参与创作: chapter_appendix/contribution.md + - 16.1   编程环境安装: chapter_appendix/installation.md + - 16.2   一起参与创作: chapter_appendix/contribution.md - 参考文献: - chapter_reference/index.md