From faa44fecd2bc6732cdca830e978e756695c1490a Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Mon, 16 Oct 2023 12:06:00 -0500 Subject: [PATCH] Squash the language code blocks and fix list.md (#865) --- docs/chapter_array_and_linkedlist/array.md | 444 +-------- .../linked_list.md | 296 +----- docs/chapter_array_and_linkedlist/list.md | 85 +- .../backtracking_algorithm.md | 416 +------- docs/chapter_backtracking/n_queens_problem.md | 100 +- .../permutations_problem.md | 198 +--- .../subset_sum_problem.md | 294 +----- .../iteration_and_recursion.md | 592 +---------- .../space_complexity.md | 470 +-------- .../time_complexity.md | 931 +----------------- .../binary_search_recur.md | 98 +- .../build_binary_tree_problem.md | 98 +- .../hanota_problem.md | 122 +-- .../dp_problem_features.md | 222 +---- .../dp_solution_pipeline.md | 296 +----- .../edit_distance_problem.md | 148 +-- .../intro_to_dynamic_programming.md | 442 +-------- .../knapsack_problem.md | 296 +----- .../unbounded_knapsack_problem.md | 444 +-------- docs/chapter_graph/graph_operations.md | 148 +-- docs/chapter_graph/graph_traversal.md | 172 +--- .../fractional_knapsack_problem.md | 98 +- docs/chapter_greedy/greedy_algorithm.md | 74 +- docs/chapter_greedy/max_capacity_problem.md | 74 +- .../max_product_cutting_problem.md | 74 +- docs/chapter_hashing/hash_algorithm.md | 146 +-- docs/chapter_hashing/hash_collision.md | 150 +-- docs/chapter_hashing/hash_map.md | 107 +- docs/chapter_heap/build_heap.md | 74 +- docs/chapter_heap/heap.md | 392 +------- docs/chapter_heap/top_k.md | 74 +- .../hello_algo_mindmap.jpg | Bin 161136 -> 164629 bytes docs/chapter_searching/binary_search.md | 148 +-- docs/chapter_searching/binary_search_edge.md | 148 +-- .../binary_search_insertion.md | 148 +-- .../replace_linear_by_hashing.md | 150 +-- docs/chapter_sorting/bubble_sort.md | 148 +-- docs/chapter_sorting/bucket_sort.md | 74 +- docs/chapter_sorting/counting_sort.md | 148 +-- docs/chapter_sorting/heap_sort.md | 98 +- docs/chapter_sorting/insertion_sort.md | 74 +- docs/chapter_sorting/merge_sort.md | 98 +- docs/chapter_sorting/quick_sort.md | 338 +------ docs/chapter_sorting/radix_sort.md | 122 +-- docs/chapter_sorting/selection_sort.md | 74 +- docs/chapter_stack_and_queue/deque.md | 170 +--- docs/chapter_stack_and_queue/queue.md | 148 +-- docs/chapter_stack_and_queue/stack.md | 148 +-- .../array_representation_of_tree.md | 74 +- docs/chapter_tree/avl_tree.md | 590 +---------- docs/chapter_tree/binary_search_tree.md | 222 +---- docs/chapter_tree/binary_tree_traversal.md | 196 +--- 52 files changed, 409 insertions(+), 10482 deletions(-) diff --git a/docs/chapter_array_and_linkedlist/array.md b/docs/chapter_array_and_linkedlist/array.md index a0ec4bbc4..e67960ed2 100755 --- a/docs/chapter_array_and_linkedlist/array.md +++ b/docs/chapter_array_and_linkedlist/array.md @@ -123,77 +123,9 @@ 在数组中访问元素是非常高效的,我们可以在 $O(1)$ 时间内随机访问数组中的任意一个元素。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{random_access} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{randomAccess} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{randomAccess} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{RandomAccess} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{randomAccess} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{randomAccess} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{randomAccess} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{randomAccess} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{randomAccess} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{random_access} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{randomAccess} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{randomAccess} - ``` +```src +[file]{array}-[class]{}-[func]{random_access} +``` ### 插入元素 @@ -203,77 +135,9 @@ 值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素的“丢失”。我们将这个问题的解决方案留在列表章节中讨论。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{insert} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{insert} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{insert} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{Insert} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{insert} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{insert} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{insert} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{insert} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{insert} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{insert} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{insert} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{insert} - ``` +```src +[file]{array}-[class]{}-[func]{insert} +``` ### 删除元素 @@ -283,77 +147,9 @@ 请注意,删除元素完成后,原先末尾的元素变得“无意义”了,所以我们无须特意去修改它。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{remove} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{remove} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{remove} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{Remove} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{remove} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{remove} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{remove} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{remove} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{remove} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{remove} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{removeItem} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{remove} - ``` +```src +[file]{array}-[class]{}-[func]{remove} +``` 总的来看,数组的插入与删除操作有以下缺点。 @@ -365,77 +161,9 @@ 在大多数编程语言中,我们既可以通过索引遍历数组,也可以直接遍历获取数组中的每个元素。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{traverse} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{traverse} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{traverse} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{Traverse} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{traverse} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{traverse} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{traverse} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{traverse} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{traverse} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{traverse} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{traverse} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{traverse} - ``` +```src +[file]{array}-[class]{}-[func]{traverse} +``` ### 查找元素 @@ -443,77 +171,9 @@ 因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{find} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{find} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{find} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{Find} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{find} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{find} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{find} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{find} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{find} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{find} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{find} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{find} - ``` +```src +[file]{array}-[class]{}-[func]{find} +``` ### 扩容数组 @@ -521,77 +181,9 @@ 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次拷贝到新数组。这是一个 $O(n)$ 的操作,在数组很大的情况下是非常耗时的。 -=== "Python" - - ```python title="array.py" - [class]{}-[func]{extend} - ``` - -=== "C++" - - ```cpp title="array.cpp" - [class]{}-[func]{extend} - ``` - -=== "Java" - - ```java title="array.java" - [class]{array}-[func]{extend} - ``` - -=== "C#" - - ```csharp title="array.cs" - [class]{array}-[func]{Extend} - ``` - -=== "Go" - - ```go title="array.go" - [class]{}-[func]{extend} - ``` - -=== "Swift" - - ```swift title="array.swift" - [class]{}-[func]{extend} - ``` - -=== "JS" - - ```javascript title="array.js" - [class]{}-[func]{extend} - ``` - -=== "TS" - - ```typescript title="array.ts" - [class]{}-[func]{extend} - ``` - -=== "Dart" - - ```dart title="array.dart" - [class]{}-[func]{extend} - ``` - -=== "Rust" - - ```rust title="array.rs" - [class]{}-[func]{extend} - ``` - -=== "C" - - ```c title="array.c" - [class]{}-[func]{extend} - ``` - -=== "Zig" - - ```zig title="array.zig" - [class]{}-[func]{extend} - ``` +```src +[file]{array}-[class]{}-[func]{extend} +``` ## 数组优点与局限性 diff --git a/docs/chapter_array_and_linkedlist/linked_list.md b/docs/chapter_array_and_linkedlist/linked_list.md index 25030b4d3..04652a54d 100755 --- a/docs/chapter_array_and_linkedlist/linked_list.md +++ b/docs/chapter_array_and_linkedlist/linked_list.md @@ -405,77 +405,9 @@ ![链表插入节点示例](linked_list.assets/linkedlist_insert_node.png) -=== "Python" - - ```python title="linked_list.py" - [class]{}-[func]{insert} - ``` - -=== "C++" - - ```cpp title="linked_list.cpp" - [class]{}-[func]{insert} - ``` - -=== "Java" - - ```java title="linked_list.java" - [class]{linked_list}-[func]{insert} - ``` - -=== "C#" - - ```csharp title="linked_list.cs" - [class]{linked_list}-[func]{Insert} - ``` - -=== "Go" - - ```go title="linked_list.go" - [class]{}-[func]{insertNode} - ``` - -=== "Swift" - - ```swift title="linked_list.swift" - [class]{}-[func]{insert} - ``` - -=== "JS" - - ```javascript title="linked_list.js" - [class]{}-[func]{insert} - ``` - -=== "TS" - - ```typescript title="linked_list.ts" - [class]{}-[func]{insert} - ``` - -=== "Dart" - - ```dart title="linked_list.dart" - [class]{}-[func]{insert} - ``` - -=== "Rust" - - ```rust title="linked_list.rs" - [class]{}-[func]{insert} - ``` - -=== "C" - - ```c title="linked_list.c" - [class]{}-[func]{insert} - ``` - -=== "Zig" - - ```zig title="linked_list.zig" - [class]{}-[func]{insert} - ``` +```src +[file]{linked_list}-[class]{}-[func]{insert} +``` ### 删除节点 @@ -485,229 +417,25 @@ ![链表删除节点](linked_list.assets/linkedlist_remove_node.png) -=== "Python" - - ```python title="linked_list.py" - [class]{}-[func]{remove} - ``` - -=== "C++" - - ```cpp title="linked_list.cpp" - [class]{}-[func]{remove} - ``` - -=== "Java" - - ```java title="linked_list.java" - [class]{linked_list}-[func]{remove} - ``` - -=== "C#" - - ```csharp title="linked_list.cs" - [class]{linked_list}-[func]{Remove} - ``` - -=== "Go" - - ```go title="linked_list.go" - [class]{}-[func]{removeItem} - ``` - -=== "Swift" - - ```swift title="linked_list.swift" - [class]{}-[func]{remove} - ``` - -=== "JS" - - ```javascript title="linked_list.js" - [class]{}-[func]{remove} - ``` - -=== "TS" - - ```typescript title="linked_list.ts" - [class]{}-[func]{remove} - ``` - -=== "Dart" - - ```dart title="linked_list.dart" - [class]{}-[func]{remove} - ``` - -=== "Rust" - - ```rust title="linked_list.rs" - [class]{}-[func]{remove} - ``` - -=== "C" - - ```c title="linked_list.c" - [class]{}-[func]{removeItem} - ``` - -=== "Zig" - - ```zig title="linked_list.zig" - [class]{}-[func]{remove} - ``` +```src +[file]{linked_list}-[class]{}-[func]{remove} +``` ### 访问节点 **在链表访问节点的效率较低**。如上节所述,我们可以在 $O(1)$ 时间下访问数组中的任意元素。链表则不然,程序需要从头节点出发,逐个向后遍历,直至找到目标节点。也就是说,访问链表的第 $i$ 个节点需要循环 $i - 1$ 轮,时间复杂度为 $O(n)$ 。 -=== "Python" - - ```python title="linked_list.py" - [class]{}-[func]{access} - ``` - -=== "C++" - - ```cpp title="linked_list.cpp" - [class]{}-[func]{access} - ``` - -=== "Java" - - ```java title="linked_list.java" - [class]{linked_list}-[func]{access} - ``` - -=== "C#" - - ```csharp title="linked_list.cs" - [class]{linked_list}-[func]{Access} - ``` - -=== "Go" - - ```go title="linked_list.go" - [class]{}-[func]{access} - ``` - -=== "Swift" - - ```swift title="linked_list.swift" - [class]{}-[func]{access} - ``` - -=== "JS" - - ```javascript title="linked_list.js" - [class]{}-[func]{access} - ``` - -=== "TS" - - ```typescript title="linked_list.ts" - [class]{}-[func]{access} - ``` - -=== "Dart" - - ```dart title="linked_list.dart" - [class]{}-[func]{access} - ``` - -=== "Rust" - - ```rust title="linked_list.rs" - [class]{}-[func]{access} - ``` - -=== "C" - - ```c title="linked_list.c" - [class]{}-[func]{access} - ``` - -=== "Zig" - - ```zig title="linked_list.zig" - [class]{}-[func]{access} - ``` +```src +[file]{linked_list}-[class]{}-[func]{access} +``` ### 查找节点 遍历链表,查找链表内值为 `target` 的节点,输出节点在链表中的索引。此过程也属于线性查找。 -=== "Python" - - ```python title="linked_list.py" - [class]{}-[func]{find} - ``` - -=== "C++" - - ```cpp title="linked_list.cpp" - [class]{}-[func]{find} - ``` - -=== "Java" - - ```java title="linked_list.java" - [class]{linked_list}-[func]{find} - ``` - -=== "C#" - - ```csharp title="linked_list.cs" - [class]{linked_list}-[func]{Find} - ``` - -=== "Go" - - ```go title="linked_list.go" - [class]{}-[func]{findNode} - ``` - -=== "Swift" - - ```swift title="linked_list.swift" - [class]{}-[func]{find} - ``` - -=== "JS" - - ```javascript title="linked_list.js" - [class]{}-[func]{find} - ``` - -=== "TS" - - ```typescript title="linked_list.ts" - [class]{}-[func]{find} - ``` - -=== "Dart" - - ```dart title="linked_list.dart" - [class]{}-[func]{find} - ``` - -=== "Rust" - - ```rust title="linked_list.rs" - [class]{}-[func]{find} - ``` - -=== "C" - - ```c title="linked_list.c" - [class]{}-[func]{find} - ``` - -=== "Zig" - - ```zig title="linked_list.zig" - [class]{}-[func]{find} - ``` +```src +[file]{linked_list}-[class]{}-[func]{find} +``` ## 数组 VS 链表 diff --git a/docs/chapter_array_and_linkedlist/list.md b/docs/chapter_array_and_linkedlist/list.md index 1f8bc7d89..36b7eb6b2 100755 --- a/docs/chapter_array_and_linkedlist/list.md +++ b/docs/chapter_array_and_linkedlist/list.md @@ -1,8 +1,15 @@ # 列表 -**数组长度不可变导致实用性降低**。在实际中,我们可能事先无法确定需要存储多少数据,这使数组长度的选择变得困难。若长度过小,需要在持续添加数据时频繁扩容数组;若长度过大,则会造成内存空间的浪费。 +「列表 list」是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无需使用者考虑容量限制的问题。列表可以基于链表或数组实现。 -为解决此问题,出现了一种被称为「动态数组 dynamic array」的数据结构,即长度可变的数组,也常被称为「列表 list」。列表基于数组实现,继承了数组的优点,并且可以在程序运行过程中动态扩容。我们可以在列表中自由地添加元素,而无须担心超过容量限制。 +- 链表天然可以被看作是一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。 +- 数组也支持元素增删查改,但由于其长度不可变,因此只能被看作是一个具有长度限制的列表。 + +当使用数组实现列表时,**长度不可变的性质会导致列表的实用性降低**。这是因为我们通常无法事先确定需要存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则会造成内存空间的浪费。 + +为解决此问题,我们可以使用「动态数组 dynamic array」来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。 + +实际上,**许多编程语言中的标准库提供的列表都是基于动态数组实现的**,例如 Python 中的 `list` 、Java 中的 `ArrayList` 、C++ 中的 `vector` 和 C# 中的 `List` 等。在接下来的讨论中,我们将把“列表”和“动态数组”视为等同的概念。 ## 列表常用操作 @@ -860,74 +867,6 @@ - **数量记录**:声明一个变量 `size` ,用于记录列表当前元素数量,并随着元素插入和删除实时更新。根据此变量,我们可以定位列表尾部,以及判断是否需要扩容。 - **扩容机制**:若插入元素时列表容量已满,则需要进行扩容。首先根据扩容倍数创建一个更大的数组,再将当前数组的所有元素依次移动至新数组。在本示例中,我们规定每次将数组扩容至之前的 2 倍。 -=== "Python" - - ```python title="my_list.py" - [class]{MyList}-[func]{} - ``` - -=== "C++" - - ```cpp title="my_list.cpp" - [class]{MyList}-[func]{} - ``` - -=== "Java" - - ```java title="my_list.java" - [class]{MyList}-[func]{} - ``` - -=== "C#" - - ```csharp title="my_list.cs" - [class]{MyList}-[func]{} - ``` - -=== "Go" - - ```go title="my_list.go" - [class]{myList}-[func]{} - ``` - -=== "Swift" - - ```swift title="my_list.swift" - [class]{MyList}-[func]{} - ``` - -=== "JS" - - ```javascript title="my_list.js" - [class]{MyList}-[func]{} - ``` - -=== "TS" - - ```typescript title="my_list.ts" - [class]{MyList}-[func]{} - ``` - -=== "Dart" - - ```dart title="my_list.dart" - [class]{MyList}-[func]{} - ``` - -=== "Rust" - - ```rust title="my_list.rs" - [class]{MyList}-[func]{} - ``` - -=== "C" - - ```c title="my_list.c" - [class]{myList}-[func]{} - ``` - -=== "Zig" - - ```zig title="my_list.zig" - [class]{MyList}-[func]{} - ``` +```src +[file]{my_list}-[class]{my_list}-[func]{} +``` diff --git a/docs/chapter_backtracking/backtracking_algorithm.md b/docs/chapter_backtracking/backtracking_algorithm.md index 00f244c65..abea5620f 100644 --- a/docs/chapter_backtracking/backtracking_algorithm.md +++ b/docs/chapter_backtracking/backtracking_algorithm.md @@ -10,77 +10,9 @@ 对于此题,我们前序遍历这颗树,并判断当前节点的值是否为 $7$ ,若是则将该节点的值加入到结果列表 `res` 之中。相关过程实现如下图和以下代码所示。 -=== "Python" - - ```python title="preorder_traversal_i_compact.py" - [class]{}-[func]{pre_order} - ``` - -=== "C++" - - ```cpp title="preorder_traversal_i_compact.cpp" - [class]{}-[func]{preOrder} - ``` - -=== "Java" - - ```java title="preorder_traversal_i_compact.java" - [class]{preorder_traversal_i_compact}-[func]{preOrder} - ``` - -=== "C#" - - ```csharp title="preorder_traversal_i_compact.cs" - [class]{preorder_traversal_i_compact}-[func]{PreOrder} - ``` - -=== "Go" - - ```go title="preorder_traversal_i_compact.go" - [class]{}-[func]{preOrderI} - ``` - -=== "Swift" - - ```swift title="preorder_traversal_i_compact.swift" - [class]{}-[func]{preOrder} - ``` - -=== "JS" - - ```javascript title="preorder_traversal_i_compact.js" - [class]{}-[func]{preOrder} - ``` - -=== "TS" - - ```typescript title="preorder_traversal_i_compact.ts" - [class]{}-[func]{preOrder} - ``` - -=== "Dart" - - ```dart title="preorder_traversal_i_compact.dart" - [class]{}-[func]{preOrder} - ``` - -=== "Rust" - - ```rust title="preorder_traversal_i_compact.rs" - [class]{}-[func]{pre_order} - ``` - -=== "C" - - ```c title="preorder_traversal_i_compact.c" - [class]{}-[func]{preOrder} - ``` - -=== "Zig" - - ```zig title="preorder_traversal_i_compact.zig" - [class]{}-[func]{preOrder} - ``` +```src +[file]{preorder_traversal_i_compact}-[class]{}-[func]{pre_order} +``` ![在前序遍历中搜索节点](backtracking_algorithm.assets/preorder_find_nodes.png) @@ -98,77 +30,9 @@ 在例题一代码的基础上,我们需要借助一个列表 `path` 记录访问过的节点路径。当访问到值为 $7$ 的节点时,则复制 `path` 并添加进结果列表 `res` 。遍历完成后,`res` 中保存的就是所有的解。 -=== "Python" - - ```python title="preorder_traversal_ii_compact.py" - [class]{}-[func]{pre_order} - ``` - -=== "C++" - - ```cpp title="preorder_traversal_ii_compact.cpp" - [class]{}-[func]{preOrder} - ``` - -=== "Java" - - ```java title="preorder_traversal_ii_compact.java" - [class]{preorder_traversal_ii_compact}-[func]{preOrder} - ``` - -=== "C#" - - ```csharp title="preorder_traversal_ii_compact.cs" - [class]{preorder_traversal_ii_compact}-[func]{PreOrder} - ``` - -=== "Go" - - ```go title="preorder_traversal_ii_compact.go" - [class]{}-[func]{preOrderII} - ``` - -=== "Swift" - - ```swift title="preorder_traversal_ii_compact.swift" - [class]{}-[func]{preOrder} - ``` - -=== "JS" - - ```javascript title="preorder_traversal_ii_compact.js" - [class]{}-[func]{preOrder} - ``` - -=== "TS" - - ```typescript title="preorder_traversal_ii_compact.ts" - [class]{}-[func]{preOrder} - ``` - -=== "Dart" - - ```dart title="preorder_traversal_ii_compact.dart" - [class]{}-[func]{preOrder} - ``` - -=== "Rust" - - ```rust title="preorder_traversal_ii_compact.rs" - [class]{}-[func]{pre_order} - ``` - -=== "C" - - ```c title="preorder_traversal_ii_compact.c" - [class]{}-[func]{preOrder} - ``` - -=== "Zig" - - ```zig title="preorder_traversal_ii_compact.zig" - [class]{}-[func]{preOrder} - ``` +```src +[file]{preorder_traversal_ii_compact}-[class]{}-[func]{pre_order} +``` 在每次“尝试”中,我们通过将当前节点添加进 `path` 来记录路径;而在“回退”前,我们需要将该节点从 `path` 中弹出,**以恢复本次尝试之前的状态**。 @@ -217,77 +81,9 @@ 为了满足以上约束条件,**我们需要添加剪枝操作**:在搜索过程中,若遇到值为 $3$ 的节点,则提前返回,停止继续搜索。 -=== "Python" - - ```python title="preorder_traversal_iii_compact.py" - [class]{}-[func]{pre_order} - ``` - -=== "C++" - - ```cpp title="preorder_traversal_iii_compact.cpp" - [class]{}-[func]{preOrder} - ``` - -=== "Java" - - ```java title="preorder_traversal_iii_compact.java" - [class]{preorder_traversal_iii_compact}-[func]{preOrder} - ``` - -=== "C#" - - ```csharp title="preorder_traversal_iii_compact.cs" - [class]{preorder_traversal_iii_compact}-[func]{PreOrder} - ``` - -=== "Go" - - ```go title="preorder_traversal_iii_compact.go" - [class]{}-[func]{preOrderIII} - ``` - -=== "Swift" - - ```swift title="preorder_traversal_iii_compact.swift" - [class]{}-[func]{preOrder} - ``` - -=== "JS" - - ```javascript title="preorder_traversal_iii_compact.js" - [class]{}-[func]{preOrder} - ``` - -=== "TS" - - ```typescript title="preorder_traversal_iii_compact.ts" - [class]{}-[func]{preOrder} - ``` - -=== "Dart" - - ```dart title="preorder_traversal_iii_compact.dart" - [class]{}-[func]{preOrder} - ``` - -=== "Rust" - - ```rust title="preorder_traversal_iii_compact.rs" - [class]{}-[func]{pre_order} - ``` - -=== "C" - - ```c title="preorder_traversal_iii_compact.c" - [class]{}-[func]{preOrder} - ``` - -=== "Zig" - - ```zig title="preorder_traversal_iii_compact.zig" - [class]{}-[func]{preOrder} - ``` +```src +[file]{preorder_traversal_iii_compact}-[class]{}-[func]{pre_order} +``` 剪枝是一个非常形象的名词。如下图所示,在搜索过程中,**我们“剪掉”了不满足约束条件的搜索分支**,避免许多无意义的尝试,从而提高了搜索效率。 @@ -589,197 +385,9 @@ 接下来,我们基于框架代码来解决例题三。状态 `state` 为节点遍历路径,选择 `choices` 为当前节点的左子节点和右子节点,结果 `res` 是路径列表。 -=== "Python" - - ```python title="preorder_traversal_iii_template.py" - [class]{}-[func]{is_solution} - - [class]{}-[func]{record_solution} - - [class]{}-[func]{is_valid} - - [class]{}-[func]{make_choice} - - [class]{}-[func]{undo_choice} - - [class]{}-[func]{backtrack} - ``` - -=== "C++" - - ```cpp title="preorder_traversal_iii_template.cpp" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "Java" - - ```java title="preorder_traversal_iii_template.java" - [class]{preorder_traversal_iii_template}-[func]{isSolution} - - [class]{preorder_traversal_iii_template}-[func]{recordSolution} - - [class]{preorder_traversal_iii_template}-[func]{isValid} - - [class]{preorder_traversal_iii_template}-[func]{makeChoice} - - [class]{preorder_traversal_iii_template}-[func]{undoChoice} - - [class]{preorder_traversal_iii_template}-[func]{backtrack} - ``` - -=== "C#" - - ```csharp title="preorder_traversal_iii_template.cs" - [class]{preorder_traversal_iii_template}-[func]{IsSolution} - - [class]{preorder_traversal_iii_template}-[func]{RecordSolution} - - [class]{preorder_traversal_iii_template}-[func]{IsValid} - - [class]{preorder_traversal_iii_template}-[func]{MakeChoice} - - [class]{preorder_traversal_iii_template}-[func]{UndoChoice} - - [class]{preorder_traversal_iii_template}-[func]{Backtrack} - ``` - -=== "Go" - - ```go title="preorder_traversal_iii_template.go" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrackIII} - ``` - -=== "Swift" - - ```swift title="preorder_traversal_iii_template.swift" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "JS" - - ```javascript title="preorder_traversal_iii_template.js" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "TS" - - ```typescript title="preorder_traversal_iii_template.ts" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "Dart" - - ```dart title="preorder_traversal_iii_template.dart" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "Rust" - - ```rust title="preorder_traversal_iii_template.rs" - [class]{}-[func]{is_solution} - - [class]{}-[func]{record_solution} - - [class]{}-[func]{is_valid} - - [class]{}-[func]{make_choice} - - [class]{}-[func]{undo_choice} - - [class]{}-[func]{backtrack} - ``` - -=== "C" - - ```c title="preorder_traversal_iii_template.c" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` - -=== "Zig" - - ```zig title="preorder_traversal_iii_template.zig" - [class]{}-[func]{isSolution} - - [class]{}-[func]{recordSolution} - - [class]{}-[func]{isValid} - - [class]{}-[func]{makeChoice} - - [class]{}-[func]{undoChoice} - - [class]{}-[func]{backtrack} - ``` +```src +[file]{preorder_traversal_iii_template}-[class]{}-[func]{backtrack} +``` 根据题意,我们在找到值为 $7$ 的节点后应该继续搜索,**因此需要将记录解之后的 `return` 语句删除**。下图对比了保留或删除 `return` 语句的搜索过程。 diff --git a/docs/chapter_backtracking/n_queens_problem.md b/docs/chapter_backtracking/n_queens_problem.md index bd7968130..5543209a2 100644 --- a/docs/chapter_backtracking/n_queens_problem.md +++ b/docs/chapter_backtracking/n_queens_problem.md @@ -40,103 +40,9 @@ 请注意,$n$ 维方阵中 $row - col$ 的范围是 $[-n + 1, n - 1]$ ,$row + col$ 的范围是 $[0, 2n - 2]$ ,所以主对角线和次对角线的数量都为 $2n - 1$ ,即数组 `diag1` 和 `diag2` 的长度都为 $2n - 1$ 。 -=== "Python" - - ```python title="n_queens.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{n_queens} - ``` - -=== "C++" - - ```cpp title="n_queens.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "Java" - - ```java title="n_queens.java" - [class]{n_queens}-[func]{backtrack} - - [class]{n_queens}-[func]{nQueens} - ``` - -=== "C#" - - ```csharp title="n_queens.cs" - [class]{n_queens}-[func]{Backtrack} - - [class]{n_queens}-[func]{NQueens} - ``` - -=== "Go" - - ```go title="n_queens.go" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "Swift" - - ```swift title="n_queens.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "JS" - - ```javascript title="n_queens.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "TS" - - ```typescript title="n_queens.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "Dart" - - ```dart title="n_queens.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "Rust" - - ```rust title="n_queens.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{n_queens} - ``` - -=== "C" - - ```c title="n_queens.c" - [class]{result}-[func]{} - - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` - -=== "Zig" - - ```zig title="n_queens.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{nQueens} - ``` +```src +[file]{n_queens}-[class]{}-[func]{n_queens} +``` 逐行放置 $n$ 次,考虑列约束,则从第一行到最后一行分别有 $n$、$n-1$、$\dots$、$2$、$1$ 个选择,**因此时间复杂度为 $O(n!)$** 。实际上,根据对角线约束的剪枝也能够大幅地缩小搜索空间,因而搜索效率往往优于以上时间复杂度。 diff --git a/docs/chapter_backtracking/permutations_problem.md b/docs/chapter_backtracking/permutations_problem.md index b72cc2d3a..e98f405fd 100644 --- a/docs/chapter_backtracking/permutations_problem.md +++ b/docs/chapter_backtracking/permutations_problem.md @@ -4,7 +4,7 @@ 下表列举了几个示例数据,包括输入数组和对应的所有排列。 -

  数组与链表的效率对比

+

  全排列示例

| 输入数组 | 所有排列 | | :---------- | :----------------------------------------------------------------- | @@ -43,101 +43,9 @@ 想清楚以上信息之后,我们就可以在框架代码中做“完形填空”了。为了缩短代码行数,我们不单独实现框架代码中的各个函数,而是将他们展开在 `backtrack()` 函数中。 -=== "Python" - - ```python title="permutations_i.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutations_i} - ``` - -=== "C++" - - ```cpp title="permutations_i.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "Java" - - ```java title="permutations_i.java" - [class]{permutations_i}-[func]{backtrack} - - [class]{permutations_i}-[func]{permutationsI} - ``` - -=== "C#" - - ```csharp title="permutations_i.cs" - [class]{permutations_i}-[func]{Backtrack} - - [class]{permutations_i}-[func]{PermutationsI} - ``` - -=== "Go" - - ```go title="permutations_i.go" - [class]{}-[func]{backtrackI} - - [class]{}-[func]{permutationsI} - ``` - -=== "Swift" - - ```swift title="permutations_i.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "JS" - - ```javascript title="permutations_i.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "TS" - - ```typescript title="permutations_i.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "Dart" - - ```dart title="permutations_i.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "Rust" - - ```rust title="permutations_i.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutations_i} - ``` - -=== "C" - - ```c title="permutations_i.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` - -=== "Zig" - - ```zig title="permutations_i.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsI} - ``` +```src +[file]{permutations_i}-[class]{}-[func]{permutations_i} +``` ## 考虑相等元素的情况 @@ -167,101 +75,9 @@ 在上一题的代码的基础上,我们考虑在每一轮选择中开启一个哈希表 `duplicated` ,用于记录该轮中已经尝试过的元素,并将重复元素剪枝。 -=== "Python" - - ```python title="permutations_ii.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutations_ii} - ``` - -=== "C++" - - ```cpp title="permutations_ii.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "Java" - - ```java title="permutations_ii.java" - [class]{permutations_ii}-[func]{backtrack} - - [class]{permutations_ii}-[func]{permutationsII} - ``` - -=== "C#" - - ```csharp title="permutations_ii.cs" - [class]{permutations_ii}-[func]{Backtrack} - - [class]{permutations_ii}-[func]{PermutationsII} - ``` - -=== "Go" - - ```go title="permutations_ii.go" - [class]{}-[func]{backtrackII} - - [class]{}-[func]{permutationsII} - ``` - -=== "Swift" - - ```swift title="permutations_ii.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "JS" - - ```javascript title="permutations_ii.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "TS" - - ```typescript title="permutations_ii.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "Dart" - - ```dart title="permutations_ii.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "Rust" - - ```rust title="permutations_ii.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutations_ii} - ``` - -=== "C" - - ```c title="permutations_ii.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` - -=== "Zig" - - ```zig title="permutations_ii.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{permutationsII} - ``` +```src +[file]{permutations_ii}-[class]{}-[func]{permutations_ii} +``` 假设元素两两之间互不相同,则 $n$ 个元素共有 $n!$ 种排列(阶乘);在记录结果时,需要复制长度为 $n$ 的列表,使用 $O(n)$ 时间。**因此时间复杂度为 $O(n!n)$** 。 diff --git a/docs/chapter_backtracking/subset_sum_problem.md b/docs/chapter_backtracking/subset_sum_problem.md index e0dfd6c50..1153ee587 100644 --- a/docs/chapter_backtracking/subset_sum_problem.md +++ b/docs/chapter_backtracking/subset_sum_problem.md @@ -17,101 +17,9 @@ 而与全排列问题不同的是,**本题集合中的元素可以被无限次选取**,因此无须借助 `selected` 布尔列表来记录元素是否已被选择。我们可以对全排列代码进行小幅修改,初步得到解题代码。 -=== "Python" - - ```python title="subset_sum_i_naive.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_i_naive} - ``` - -=== "C++" - - ```cpp title="subset_sum_i_naive.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "Java" - - ```java title="subset_sum_i_naive.java" - [class]{subset_sum_i_naive}-[func]{backtrack} - - [class]{subset_sum_i_naive}-[func]{subsetSumINaive} - ``` - -=== "C#" - - ```csharp title="subset_sum_i_naive.cs" - [class]{subset_sum_i_naive}-[func]{Backtrack} - - [class]{subset_sum_i_naive}-[func]{SubsetSumINaive} - ``` - -=== "Go" - - ```go title="subset_sum_i_naive.go" - [class]{}-[func]{backtrackSubsetSumINaive} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "Swift" - - ```swift title="subset_sum_i_naive.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "JS" - - ```javascript title="subset_sum_i_naive.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "TS" - - ```typescript title="subset_sum_i_naive.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "Dart" - - ```dart title="subset_sum_i_naive.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "Rust" - - ```rust title="subset_sum_i_naive.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_i_naive} - ``` - -=== "C" - - ```c title="subset_sum_i_naive.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` - -=== "Zig" - - ```zig title="subset_sum_i_naive.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumINaive} - ``` +```src +[file]{subset_sum_i_naive}-[class]{}-[func]{subset_sum_i_naive} +``` 向以上代码输入数组 $[3, 4, 5]$ 和目标元素 $9$ ,输出结果为 $[3, 3, 3], [4, 5], [5, 4]$ 。**虽然成功找出了所有和为 $9$ 的子集,但其中存在重复的子集 $[4, 5]$ 和 $[5, 4]$** 。 @@ -150,101 +58,9 @@ - 在开启搜索前,先将数组 `nums` 排序。在遍历所有选择时,**当子集和超过 `target` 时直接结束循环**,因为后边的元素更大,其子集和都一定会超过 `target` 。 - 省去元素和变量 `total` ,**通过在 `target` 上执行减法来统计元素和**,当 `target` 等于 $0$ 时记录解。 -=== "Python" - - ```python title="subset_sum_i.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_i} - ``` - -=== "C++" - - ```cpp title="subset_sum_i.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "Java" - - ```java title="subset_sum_i.java" - [class]{subset_sum_i}-[func]{backtrack} - - [class]{subset_sum_i}-[func]{subsetSumI} - ``` - -=== "C#" - - ```csharp title="subset_sum_i.cs" - [class]{subset_sum_i}-[func]{Backtrack} - - [class]{subset_sum_i}-[func]{SubsetSumI} - ``` - -=== "Go" - - ```go title="subset_sum_i.go" - [class]{}-[func]{backtrackSubsetSumI} - - [class]{}-[func]{subsetSumI} - ``` - -=== "Swift" - - ```swift title="subset_sum_i.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "JS" - - ```javascript title="subset_sum_i.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "TS" - - ```typescript title="subset_sum_i.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "Dart" - - ```dart title="subset_sum_i.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "Rust" - - ```rust title="subset_sum_i.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_i} - ``` - -=== "C" - - ```c title="subset_sum_i.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` - -=== "Zig" - - ```zig title="subset_sum_i.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumI} - ``` +```src +[file]{subset_sum_i}-[class]{}-[func]{subset_sum_i} +``` 如下图所示,为将数组 $[3, 4, 5]$ 和目标元素 $9$ 输入到以上代码后的整体回溯过程。 @@ -270,101 +86,9 @@ ### 代码实现 -=== "Python" - - ```python title="subset_sum_ii.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_ii} - ``` - -=== "C++" - - ```cpp title="subset_sum_ii.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "Java" - - ```java title="subset_sum_ii.java" - [class]{subset_sum_ii}-[func]{backtrack} - - [class]{subset_sum_ii}-[func]{subsetSumII} - ``` - -=== "C#" - - ```csharp title="subset_sum_ii.cs" - [class]{subset_sum_ii}-[func]{Backtrack} - - [class]{subset_sum_ii}-[func]{SubsetSumII} - ``` - -=== "Go" - - ```go title="subset_sum_ii.go" - [class]{}-[func]{backtrackSubsetSumII} - - [class]{}-[func]{subsetSumII} - ``` - -=== "Swift" - - ```swift title="subset_sum_ii.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "JS" - - ```javascript title="subset_sum_ii.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "TS" - - ```typescript title="subset_sum_ii.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "Dart" - - ```dart title="subset_sum_ii.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "Rust" - - ```rust title="subset_sum_ii.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subset_sum_ii} - ``` - -=== "C" - - ```c title="subset_sum_ii.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` - -=== "Zig" - - ```zig title="subset_sum_ii.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{subsetSumII} - ``` +```src +[file]{subset_sum_ii}-[class]{}-[func]{subset_sum_ii} +``` 下图展示了数组 $[4, 4, 5]$ 和目标元素 $9$ 的回溯过程,共包含四种剪枝操作。请你将图示与代码注释相结合,理解整个搜索过程,以及每种剪枝操作是如何工作的。 diff --git a/docs/chapter_computational_complexity/iteration_and_recursion.md b/docs/chapter_computational_complexity/iteration_and_recursion.md index 0c8d39b79..7dfc26c14 100644 --- a/docs/chapter_computational_complexity/iteration_and_recursion.md +++ b/docs/chapter_computational_complexity/iteration_and_recursion.md @@ -12,77 +12,9 @@ 以下函数基于 `for` 循环实现了求和 $1 + 2 + \dots + n$ ,求和结果使用变量 `res` 记录。需要注意的是,Python 中 `range(a, b)` 对应的区间是“左闭右开”的,对应的遍历范围为 $a, a + 1, \dots, b-1$ 。 -=== "Python" - - ```python title="iteration.py" - [class]{}-[func]{for_loop} - ``` - -=== "C++" - - ```cpp title="iteration.cpp" - [class]{}-[func]{forLoop} - ``` - -=== "Java" - - ```java title="iteration.java" - [class]{iteration}-[func]{forLoop} - ``` - -=== "C#" - - ```csharp title="iteration.cs" - [class]{iteration}-[func]{ForLoop} - ``` - -=== "Go" - - ```go title="iteration.go" - [class]{}-[func]{forLoop} - ``` - -=== "Swift" - - ```swift title="iteration.swift" - [class]{}-[func]{forLoop} - ``` - -=== "JS" - - ```javascript title="iteration.js" - [class]{}-[func]{forLoop} - ``` - -=== "TS" - - ```typescript title="iteration.ts" - [class]{}-[func]{forLoop} - ``` - -=== "Dart" - - ```dart title="iteration.dart" - [class]{}-[func]{forLoop} - ``` - -=== "Rust" - - ```rust title="iteration.rs" - [class]{}-[func]{for_loop} - ``` - -=== "C" - - ```c title="iteration.c" - [class]{}-[func]{forLoop} - ``` - -=== "Zig" - - ```zig title="iteration.zig" - [class]{}-[func]{forLoop} - ``` +```src +[file]{iteration}-[class]{}-[func]{for_loop} +``` 下图展示了该求和函数的流程框图。 @@ -96,153 +28,17 @@ 下面,我们用 `while` 循环来实现求和 $1 + 2 + \dots + n$ 。 -=== "Python" - - ```python title="iteration.py" - [class]{}-[func]{while_loop} - ``` - -=== "C++" - - ```cpp title="iteration.cpp" - [class]{}-[func]{whileLoop} - ``` - -=== "Java" - - ```java title="iteration.java" - [class]{iteration}-[func]{whileLoop} - ``` - -=== "C#" - - ```csharp title="iteration.cs" - [class]{iteration}-[func]{WhileLoop} - ``` - -=== "Go" - - ```go title="iteration.go" - [class]{}-[func]{whileLoop} - ``` - -=== "Swift" - - ```swift title="iteration.swift" - [class]{}-[func]{whileLoop} - ``` - -=== "JS" - - ```javascript title="iteration.js" - [class]{}-[func]{whileLoop} - ``` - -=== "TS" - - ```typescript title="iteration.ts" - [class]{}-[func]{whileLoop} - ``` - -=== "Dart" - - ```dart title="iteration.dart" - [class]{}-[func]{whileLoop} - ``` - -=== "Rust" - - ```rust title="iteration.rs" - [class]{}-[func]{while_loop} - ``` - -=== "C" - - ```c title="iteration.c" - [class]{}-[func]{whileLoop} - ``` - -=== "Zig" - - ```zig title="iteration.zig" - [class]{}-[func]{whileLoop} - ``` +```src +[file]{iteration}-[class]{}-[func]{while_loop} +``` 在 `while` 循环中,由于初始化和更新条件变量的步骤是独立在循环结构之外的,**因此它比 `for` 循环的自由度更高**。 例如在以下代码中,条件变量 $i$ 每轮进行了两次更新,这种情况就不太方便用 `for` 循环实现。 -=== "Python" - - ```python title="iteration.py" - [class]{}-[func]{while_loop_ii} - ``` - -=== "C++" - - ```cpp title="iteration.cpp" - [class]{}-[func]{whileLoopII} - ``` - -=== "Java" - - ```java title="iteration.java" - [class]{iteration}-[func]{whileLoopII} - ``` - -=== "C#" - - ```csharp title="iteration.cs" - [class]{iteration}-[func]{WhileLoopII} - ``` - -=== "Go" - - ```go title="iteration.go" - [class]{}-[func]{whileLoopII} - ``` - -=== "Swift" - - ```swift title="iteration.swift" - [class]{}-[func]{whileLoopII} - ``` - -=== "JS" - - ```javascript title="iteration.js" - [class]{}-[func]{whileLoopII} - ``` - -=== "TS" - - ```typescript title="iteration.ts" - [class]{}-[func]{whileLoopII} - ``` - -=== "Dart" - - ```dart title="iteration.dart" - [class]{}-[func]{whileLoopII} - ``` - -=== "Rust" - - ```rust title="iteration.rs" - [class]{}-[func]{while_loop_ii} - ``` - -=== "C" - - ```c title="iteration.c" - [class]{}-[func]{whileLoopII} - ``` - -=== "Zig" - - ```zig title="iteration.zig" - [class]{}-[func]{whileLoopII} - ``` +```src +[file]{iteration}-[class]{}-[func]{while_loop_ii} +``` 总的来说,**`for` 循环的代码更加紧凑,`while` 循环更加灵活**,两者都可以实现迭代结构。选择使用哪一个应该根据特定问题的需求来决定。 @@ -250,77 +46,9 @@ 我们可以在一个循环结构内嵌套另一个循环结构,以 `for` 循环为例: -=== "Python" - - ```python title="iteration.py" - [class]{}-[func]{nested_for_loop} - ``` - -=== "C++" - - ```cpp title="iteration.cpp" - [class]{}-[func]{nestedForLoop} - ``` - -=== "Java" - - ```java title="iteration.java" - [class]{iteration}-[func]{nestedForLoop} - ``` - -=== "C#" - - ```csharp title="iteration.cs" - [class]{iteration}-[func]{NestedForLoop} - ``` - -=== "Go" - - ```go title="iteration.go" - [class]{}-[func]{nestedForLoop} - ``` - -=== "Swift" - - ```swift title="iteration.swift" - [class]{}-[func]{nestedForLoop} - ``` - -=== "JS" - - ```javascript title="iteration.js" - [class]{}-[func]{nestedForLoop} - ``` - -=== "TS" - - ```typescript title="iteration.ts" - [class]{}-[func]{nestedForLoop} - ``` - -=== "Dart" - - ```dart title="iteration.dart" - [class]{}-[func]{nestedForLoop} - ``` - -=== "Rust" - - ```rust title="iteration.rs" - [class]{}-[func]{nested_for_loop} - ``` - -=== "C" - - ```c title="iteration.c" - [class]{}-[func]{nestedForLoop} - ``` - -=== "Zig" - - ```zig title="iteration.zig" - [class]{}-[func]{nestedForLoop} - ``` +```src +[file]{iteration}-[class]{}-[func]{nested_for_loop} +``` 下图给出了该嵌套循环的流程框图。 @@ -345,77 +73,9 @@ 观察以下代码,我们只需调用函数 `recur(n)` ,就可以完成 $1 + 2 + \dots + n$ 的计算: -=== "Python" - - ```python title="recursion.py" - [class]{}-[func]{recur} - ``` - -=== "C++" - - ```cpp title="recursion.cpp" - [class]{}-[func]{recur} - ``` - -=== "Java" - - ```java title="recursion.java" - [class]{recursion}-[func]{recur} - ``` - -=== "C#" - - ```csharp title="recursion.cs" - [class]{recursion}-[func]{Recur} - ``` - -=== "Go" - - ```go title="recursion.go" - [class]{}-[func]{recur} - ``` - -=== "Swift" - - ```swift title="recursion.swift" - [class]{}-[func]{recur} - ``` - -=== "JS" - - ```javascript title="recursion.js" - [class]{}-[func]{recur} - ``` - -=== "TS" - - ```typescript title="recursion.ts" - [class]{}-[func]{recur} - ``` - -=== "Dart" - - ```dart title="recursion.dart" - [class]{}-[func]{recur} - ``` - -=== "Rust" - - ```rust title="recursion.rs" - [class]{}-[func]{recur} - ``` - -=== "C" - - ```c title="recursion.c" - [class]{}-[func]{recur} - ``` - -=== "Zig" - - ```zig title="recursion.zig" - [class]{}-[func]{recur} - ``` +```src +[file]{recursion}-[class]{}-[func]{recur} +``` 下图展示了该函数的递归过程。 @@ -453,77 +113,9 @@ 以计算 $1 + 2 + \dots + n$ 为例,我们可以将结果变量 `res` 设为函数参数,从而实现尾递归。 -=== "Python" - - ```python title="recursion.py" - [class]{}-[func]{tail_recur} - ``` - -=== "C++" - - ```cpp title="recursion.cpp" - [class]{}-[func]{tailRecur} - ``` - -=== "Java" - - ```java title="recursion.java" - [class]{recursion}-[func]{tailRecur} - ``` - -=== "C#" - - ```csharp title="recursion.cs" - [class]{recursion}-[func]{TailRecur} - ``` - -=== "Go" - - ```go title="recursion.go" - [class]{}-[func]{tailRecur} - ``` - -=== "Swift" - - ```swift title="recursion.swift" - [class]{}-[func]{tailRecur} - ``` - -=== "JS" - - ```javascript title="recursion.js" - [class]{}-[func]{tailRecur} - ``` - -=== "TS" - - ```typescript title="recursion.ts" - [class]{}-[func]{tailRecur} - ``` - -=== "Dart" - - ```dart title="recursion.dart" - [class]{}-[func]{tailRecur} - ``` - -=== "Rust" - - ```rust title="recursion.rs" - [class]{}-[func]{tail_recur} - ``` - -=== "C" - - ```c title="recursion.c" - [class]{}-[func]{tailRecur} - ``` - -=== "Zig" - - ```zig title="recursion.zig" - [class]{}-[func]{tailRecur} - ``` +```src +[file]{recursion}-[class]{}-[func]{tail_recur} +``` 尾递归的执行过程如下图所示。对比普通递归和尾递归,求和操作的执行点是不同的。 @@ -551,77 +143,9 @@ 按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 `fib(n)` 即可得到斐波那契数列的第 $n$ 个数字。 -=== "Python" - - ```python title="recursion.py" - [class]{}-[func]{fib} - ``` - -=== "C++" - - ```cpp title="recursion.cpp" - [class]{}-[func]{fib} - ``` - -=== "Java" - - ```java title="recursion.java" - [class]{recursion}-[func]{fib} - ``` - -=== "C#" - - ```csharp title="recursion.cs" - [class]{recursion}-[func]{Fib} - ``` - -=== "Go" - - ```go title="recursion.go" - [class]{}-[func]{fib} - ``` - -=== "Swift" - - ```swift title="recursion.swift" - [class]{}-[func]{fib} - ``` - -=== "JS" - - ```javascript title="recursion.js" - [class]{}-[func]{fib} - ``` - -=== "TS" - - ```typescript title="recursion.ts" - [class]{}-[func]{fib} - ``` - -=== "Dart" - - ```dart title="recursion.dart" - [class]{}-[func]{fib} - ``` - -=== "Rust" - - ```rust title="recursion.rs" - [class]{}-[func]{fib} - ``` - -=== "C" - - ```c title="recursion.c" - [class]{}-[func]{fib} - ``` - -=== "Zig" - - ```zig title="recursion.zig" - [class]{}-[func]{fib} - ``` +```src +[file]{recursion}-[class]{}-[func]{fib} +``` 观察以上代码,我们在函数内递归调用了两个函数,**这意味着从一个调用产生了两个调用分支**。如下图所示,这样不断递归调用下去,最终将产生一个层数为 $n$ 的「递归树 recursion tree」。 @@ -658,77 +182,9 @@ 因此,**我们可以使用一个显式的栈来模拟调用栈的行为**,从而将递归转化为迭代形式: -=== "Python" - - ```python title="recursion.py" - [class]{}-[func]{for_loop_recur} - ``` - -=== "C++" - - ```cpp title="recursion.cpp" - [class]{}-[func]{forLoopRecur} - ``` - -=== "Java" - - ```java title="recursion.java" - [class]{recursion}-[func]{forLoopRecur} - ``` - -=== "C#" - - ```csharp title="recursion.cs" - [class]{recursion}-[func]{ForLoopRecur} - ``` - -=== "Go" - - ```go title="recursion.go" - [class]{}-[func]{forLoopRecur} - ``` - -=== "Swift" - - ```swift title="recursion.swift" - [class]{}-[func]{forLoopRecur} - ``` - -=== "JS" - - ```javascript title="recursion.js" - [class]{}-[func]{forLoopRecur} - ``` - -=== "TS" - - ```typescript title="recursion.ts" - [class]{}-[func]{forLoopRecur} - ``` - -=== "Dart" - - ```dart title="recursion.dart" - [class]{}-[func]{forLoopRecur} - ``` - -=== "Rust" - - ```rust title="recursion.rs" - [class]{}-[func]{for_loop_recur} - ``` - -=== "C" - - ```c title="recursion.c" - [class]{}-[func]{forLoopRecur} - ``` - -=== "Zig" - - ```zig title="recursion.zig" - [class]{}-[func]{forLoopRecur} - ``` +```src +[file]{recursion}-[class]{}-[func]{for_loop_recur} +``` 观察以上代码,当递归被转换为迭代后,代码变得更加复杂了。尽管迭代和递归在很多情况下可以互相转换,但也不一定值得这样做,有以下两点原因。 diff --git a/docs/chapter_computational_complexity/space_complexity.md b/docs/chapter_computational_complexity/space_complexity.md index 4c9f5ec75..b298d76fd 100755 --- a/docs/chapter_computational_complexity/space_complexity.md +++ b/docs/chapter_computational_complexity/space_complexity.md @@ -719,253 +719,23 @@ $$ 需要注意的是,在循环中初始化变量或调用函数而占用的内存,在进入下一循环后就会被释放,因此不会累积占用空间,空间复杂度仍为 $O(1)$ : -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{function} - - [class]{}-[func]{constant} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{func} - - [class]{}-[func]{constant} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{function} - - [class]{space_complexity}-[func]{constant} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{Function} - - [class]{space_complexity}-[func]{Constant} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{function} - - [class]{}-[func]{spaceConstant} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{function} - - [class]{}-[func]{constant} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{constFunc} - - [class]{}-[func]{constant} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{constFunc} - - [class]{}-[func]{constant} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{function} - - [class]{}-[func]{constant} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{function} - - [class]{}-[func]{constant} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{}-[func]{func} - - [class]{}-[func]{constant} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{function} - - [class]{}-[func]{constant} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{constant} +``` ### 线性阶 $O(n)$ 线性阶常见于元素数量与 $n$ 成正比的数组、链表、栈、队列等: -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{linear} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{linear} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{linear} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{Linear} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{spaceLinear} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{linear} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{linear} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{linear} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{linear} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{linear} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{hashTable}-[func]{} - - [class]{}-[func]{linear} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{linear} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{linear} +``` 如下图所示,此函数的递归深度为 $n$ ,即同时存在 $n$ 个未返回的 `linear_recur()` 函数,使用 $O(n)$ 大小的栈帧空间: -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{linear_recur} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{linearRecur} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{linearRecur} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{LinearRecur} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{spaceLinearRecur} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{linearRecur} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{linearRecur} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{linearRecur} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{linearRecur} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{linear_recur} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{}-[func]{linearRecur} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{linearRecur} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{linear_recur} +``` ![递归函数产生的线性阶空间复杂度](space_complexity.assets/space_complexity_recursive_linear.png) @@ -973,151 +743,15 @@ $$ 平方阶常见于矩阵和图,元素数量与 $n$ 成平方关系: -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{quadratic} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{quadratic} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{quadratic} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{Quadratic} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{spaceQuadratic} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{quadratic} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{quadratic} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{quadratic} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{quadratic} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{quadratic} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{}-[func]{quadratic} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{quadratic} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{quadratic} +``` 如下图所示,该函数的递归深度为 $n$ ,在每个递归函数中都初始化了一个数组,长度分别为 $n$、$n-1$、$\dots$、$2$、$1$ ,平均长度为 $n / 2$ ,因此总体占用 $O(n^2)$ 空间: -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{quadratic_recur} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{quadraticRecur} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{quadraticRecur} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{QuadraticRecur} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{spaceQuadraticRecur} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{quadraticRecur} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{quadraticRecur} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{quadraticRecur} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{quadraticRecur} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{quadratic_recur} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{}-[func]{quadraticRecur} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{quadraticRecur} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{quadratic_recur} +``` ![递归函数产生的平方阶空间复杂度](space_complexity.assets/space_complexity_recursive_quadratic.png) @@ -1125,77 +759,9 @@ $$ 指数阶常见于二叉树。观察下图,高度为 $n$ 的“满二叉树”的节点数量为 $2^n - 1$ ,占用 $O(2^n)$ 空间: -=== "Python" - - ```python title="space_complexity.py" - [class]{}-[func]{build_tree} - ``` - -=== "C++" - - ```cpp title="space_complexity.cpp" - [class]{}-[func]{buildTree} - ``` - -=== "Java" - - ```java title="space_complexity.java" - [class]{space_complexity}-[func]{buildTree} - ``` - -=== "C#" - - ```csharp title="space_complexity.cs" - [class]{space_complexity}-[func]{BuildTree} - ``` - -=== "Go" - - ```go title="space_complexity.go" - [class]{}-[func]{buildTree} - ``` - -=== "Swift" - - ```swift title="space_complexity.swift" - [class]{}-[func]{buildTree} - ``` - -=== "JS" - - ```javascript title="space_complexity.js" - [class]{}-[func]{buildTree} - ``` - -=== "TS" - - ```typescript title="space_complexity.ts" - [class]{}-[func]{buildTree} - ``` - -=== "Dart" - - ```dart title="space_complexity.dart" - [class]{}-[func]{buildTree} - ``` - -=== "Rust" - - ```rust title="space_complexity.rs" - [class]{}-[func]{build_tree} - ``` - -=== "C" - - ```c title="space_complexity.c" - [class]{}-[func]{buildTree} - ``` - -=== "Zig" - - ```zig title="space_complexity.zig" - [class]{}-[func]{buildTree} - ``` +```src +[file]{space_complexity}-[class]{}-[func]{build_tree} +``` ![满二叉树产生的指数阶空间复杂度](space_complexity.assets/space_complexity_exponential.png) diff --git a/docs/chapter_computational_complexity/time_complexity.md b/docs/chapter_computational_complexity/time_complexity.md index 723e0cbc2..b71cd74a3 100755 --- a/docs/chapter_computational_complexity/time_complexity.md +++ b/docs/chapter_computational_complexity/time_complexity.md @@ -897,227 +897,23 @@ $$ 在以下函数中,尽管操作数量 `size` 可能很大,但由于其与输入数据大小 $n$ 无关,因此时间复杂度仍为 $O(1)$ : -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{constant} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{constant} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{constant} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{Constant} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{constant} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{constant} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{constant} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{constant} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{constant} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{constant} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{constant} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{constant} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{constant} +``` ### 线性阶 $O(n)$ 线性阶的操作数量相对于输入数据大小 $n$ 以线性级别增长。线性阶通常出现在单层循环中: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{linear} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{linear} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{linear} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{Linear} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{linear} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{linear} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{linear} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{linear} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{linear} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{linear} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{linear} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{linear} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{linear} +``` 遍历数组和遍历链表等操作的时间复杂度均为 $O(n)$ ,其中 $n$ 为数组或链表的长度: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{array_traversal} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{arrayTraversal} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{arrayTraversal} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{ArrayTraversal} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{arrayTraversal} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{arrayTraversal} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{arrayTraversal} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{arrayTraversal} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{arrayTraversal} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{array_traversal} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{arrayTraversal} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{arrayTraversal} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{array_traversal} +``` 值得注意的是,**输入数据大小 $n$ 需根据输入数据的类型来具体确定**。比如在第一个示例中,变量 $n$ 为输入数据大小;在第二个示例中,数组长度 $n$ 为数据大小。 @@ -1125,77 +921,9 @@ $$ 平方阶的操作数量相对于输入数据大小 $n$ 以平方级别增长。平方阶通常出现在嵌套循环中,外层循环和内层循环都为 $O(n)$ ,因此总体为 $O(n^2)$ : -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{quadratic} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{quadratic} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{quadratic} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{Quadratic} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{quadratic} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{quadratic} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{quadratic} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{quadratic} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{quadratic} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{quadratic} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{quadratic} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{quadratic} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{quadratic} +``` 下图对比了常数阶、线性阶和平方阶三种时间复杂度。 @@ -1203,77 +931,9 @@ $$ 以冒泡排序为例,外层循环执行 $n - 1$ 次,内层循环执行 $n-1$、$n-2$、$\dots$、$2$、$1$ 次,平均为 $n / 2$ 次,因此时间复杂度为 $O((n - 1) n / 2) = O(n^2)$ 。 -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{bubble_sort} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{bubbleSort} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{bubbleSort} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{BubbleSort} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{bubbleSort} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{bubbleSort} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{bubbleSort} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{bubbleSort} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{bubbleSort} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{bubble_sort} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{bubbleSort} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{bubbleSort} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{bubble_sort} +``` ### 指数阶 $O(2^n)$ @@ -1281,153 +941,17 @@ $$ 下图和以下代码模拟了细胞分裂的过程,时间复杂度为 $O(2^n)$ 。 -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{exponential} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{exponential} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{exponential} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{Exponential} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{exponential} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{exponential} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{exponential} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{exponential} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{exponential} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{exponential} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{exponential} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{exponential} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{exponential} +``` ![指数阶的时间复杂度](time_complexity.assets/time_complexity_exponential.png) 在实际算法中,指数阶常出现于递归函数中。例如在以下代码中,其递归地一分为二,经过 $n$ 次分裂后停止: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{exp_recur} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{expRecur} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{expRecur} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{ExpRecur} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{expRecur} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{expRecur} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{expRecur} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{expRecur} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{expRecur} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{exp_recur} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{expRecur} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{expRecur} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{exp_recur} +``` 指数阶增长非常迅速,在穷举法(暴力搜索、回溯等)中比较常见。对于数据规模较大的问题,指数阶是不可接受的,通常需要使用动态规划或贪心等算法来解决。 @@ -1437,153 +961,17 @@ $$ 下图和以下代码模拟了“每轮缩减到一半”的过程,时间复杂度为 $O(\log_2 n)$ ,简记为 $O(\log n)$ 。 -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{logarithmic} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{logarithmic} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{logarithmic} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{Logarithmic} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{logarithmic} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{logarithmic} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{logarithmic} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{logarithmic} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{logarithmic} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{logarithmic} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{logarithmic} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{logarithmic} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{logarithmic} +``` ![对数阶的时间复杂度](time_complexity.assets/time_complexity_logarithmic.png) 与指数阶类似,对数阶也常出现于递归函数中。以下代码形成了一个高度为 $\log_2 n$ 的递归树: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{log_recur} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{logRecur} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{logRecur} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{LogRecur} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{logRecur} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{logRecur} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{logRecur} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{logRecur} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{logRecur} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{log_recur} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{logRecur} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{logRecur} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{log_recur} +``` 对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。它增长缓慢,是仅次于常数阶的理想的时间复杂度。 @@ -1601,77 +989,9 @@ $$ 线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 $O(\log n)$ 和 $O(n)$ 。相关代码如下: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{linear_log_recur} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{linearLogRecur} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{linearLogRecur} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{LinearLogRecur} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{linearLogRecur} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{linearLogRecur} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{linearLogRecur} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{linearLogRecur} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{linearLogRecur} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{linear_log_recur} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{linearLogRecur} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{linearLogRecur} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{linear_log_recur} +``` 下图展示了线性对数阶的生成方式。二叉树的每一层的操作总数都为 $n$ ,树共有 $\log_2 n + 1$ 层,因此时间复杂度为 $O(n \log n)$ 。 @@ -1689,77 +1009,9 @@ $$ 阶乘通常使用递归实现。如下图和以下代码所示,第一层分裂出 $n$ 个,第二层分裂出 $n - 1$ 个,以此类推,直至第 $n$ 层时停止分裂: -=== "Python" - - ```python title="time_complexity.py" - [class]{}-[func]{factorial_recur} - ``` - -=== "C++" - - ```cpp title="time_complexity.cpp" - [class]{}-[func]{factorialRecur} - ``` - -=== "Java" - - ```java title="time_complexity.java" - [class]{time_complexity}-[func]{factorialRecur} - ``` - -=== "C#" - - ```csharp title="time_complexity.cs" - [class]{time_complexity}-[func]{FactorialRecur} - ``` - -=== "Go" - - ```go title="time_complexity.go" - [class]{}-[func]{factorialRecur} - ``` - -=== "Swift" - - ```swift title="time_complexity.swift" - [class]{}-[func]{factorialRecur} - ``` - -=== "JS" - - ```javascript title="time_complexity.js" - [class]{}-[func]{factorialRecur} - ``` - -=== "TS" - - ```typescript title="time_complexity.ts" - [class]{}-[func]{factorialRecur} - ``` - -=== "Dart" - - ```dart title="time_complexity.dart" - [class]{}-[func]{factorialRecur} - ``` - -=== "Rust" - - ```rust title="time_complexity.rs" - [class]{}-[func]{factorial_recur} - ``` - -=== "C" - - ```c title="time_complexity.c" - [class]{}-[func]{factorialRecur} - ``` - -=== "Zig" - - ```zig title="time_complexity.zig" - [class]{}-[func]{factorialRecur} - ``` +```src +[file]{time_complexity}-[class]{}-[func]{factorial_recur} +``` ![阶乘阶的时间复杂度](time_complexity.assets/time_complexity_factorial.png) @@ -1774,120 +1026,9 @@ $$ “最差时间复杂度”对应函数渐近上界,使用大 $O$ 记号表示。相应地,“最佳时间复杂度”对应函数渐近下界,用 $\Omega$ 记号表示: -=== "Python" - - ```python title="worst_best_time_complexity.py" - [class]{}-[func]{random_numbers} - - [class]{}-[func]{find_one} - ``` - -=== "C++" - - ```cpp title="worst_best_time_complexity.cpp" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "Java" - - ```java title="worst_best_time_complexity.java" - [class]{worst_best_time_complexity}-[func]{randomNumbers} - - [class]{worst_best_time_complexity}-[func]{findOne} - ``` - -=== "C#" - - ```csharp title="worst_best_time_complexity.cs" - [class]{worst_best_time_complexity}-[func]{RandomNumbers} - - [class]{worst_best_time_complexity}-[func]{FindOne} - ``` - -=== "Go" - - ```go title="worst_best_time_complexity.go" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "Swift" - - ```swift title="worst_best_time_complexity.swift" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "JS" - - ```javascript title="worst_best_time_complexity.js" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "TS" - - ```typescript title="worst_best_time_complexity.ts" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "Dart" - - ```dart title="worst_best_time_complexity.dart" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "Rust" - - ```rust title="worst_best_time_complexity.rs" - [class]{}-[func]{random_numbers} - - [class]{}-[func]{find_one} - ``` - -=== "C" - - ```c title="worst_best_time_complexity.c" - [class]{}-[func]{randomNumbers} - - [class]{}-[func]{findOne} - ``` - -=== "Zig" - - ```zig title="worst_best_time_complexity.zig" - // 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 - pub fn randomNumbers(comptime n: usize) [n]i32 { - var nums: [n]i32 = undefined; - // 生成数组 nums = { 1, 2, 3, ..., n } - for (nums) |*num, i| { - num.* = @intCast(i32, i) + 1; - } - // 随机打乱数组元素 - const rand = std.crypto.random; - rand.shuffle(i32, &nums); - return nums; - } - - // 查找数组 nums 中数字 1 所在索引 - pub fn findOne(nums: []i32) i32 { - for (nums) |num, i| { - // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) - // 当元素 1 在数组尾部时,达到最差时间复杂度 O(n) - if (num == 1) return @intCast(i32, i); - } - return -1; - } - ``` +```src +[file]{worst_best_time_complexity}-[class]{}-[func]{find_one} +``` 值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来一定的误导性。**而最差时间复杂度更为实用,因为它给出了一个效率安全值**,让我们可以放心地使用算法。 diff --git a/docs/chapter_divide_and_conquer/binary_search_recur.md b/docs/chapter_divide_and_conquer/binary_search_recur.md index 6cfffae68..c6c56081b 100644 --- a/docs/chapter_divide_and_conquer/binary_search_recur.md +++ b/docs/chapter_divide_and_conquer/binary_search_recur.md @@ -40,98 +40,6 @@ 在实现代码中,我们声明一个递归函数 `dfs()` 来求解问题 $f(i, j)$ 。 -=== "Python" - - ```python title="binary_search_recur.py" - [class]{}-[func]{dfs} - - [class]{}-[func]{binary_search} - ``` - -=== "C++" - - ```cpp title="binary_search_recur.cpp" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "Java" - - ```java title="binary_search_recur.java" - [class]{binary_search_recur}-[func]{dfs} - - [class]{binary_search_recur}-[func]{binarySearch} - ``` - -=== "C#" - - ```csharp title="binary_search_recur.cs" - [class]{binary_search_recur}-[func]{DFS} - - [class]{binary_search_recur}-[func]{BinarySearch} - ``` - -=== "Go" - - ```go title="binary_search_recur.go" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "Swift" - - ```swift title="binary_search_recur.swift" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "JS" - - ```javascript title="binary_search_recur.js" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "TS" - - ```typescript title="binary_search_recur.ts" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "Dart" - - ```dart title="binary_search_recur.dart" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "Rust" - - ```rust title="binary_search_recur.rs" - [class]{}-[func]{dfs} - - [class]{}-[func]{binary_search} - ``` - -=== "C" - - ```c title="binary_search_recur.c" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` - -=== "Zig" - - ```zig title="binary_search_recur.zig" - [class]{}-[func]{dfs} - - [class]{}-[func]{binarySearch} - ``` +```src +[file]{binary_search_recur}-[class]{}-[func]{binary_search} +``` diff --git a/docs/chapter_divide_and_conquer/build_binary_tree_problem.md b/docs/chapter_divide_and_conquer/build_binary_tree_problem.md index b5d49a5b0..46e8d352d 100644 --- a/docs/chapter_divide_and_conquer/build_binary_tree_problem.md +++ b/docs/chapter_divide_and_conquer/build_binary_tree_problem.md @@ -57,101 +57,9 @@ 为了提升查询 $m$ 的效率,我们借助一个哈希表 `hmap` 来存储数组 `inorder` 中元素到索引的映射。 -=== "Python" - - ```python title="build_tree.py" - [class]{}-[func]{dfs} - - [class]{}-[func]{build_tree} - ``` - -=== "C++" - - ```cpp title="build_tree.cpp" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "Java" - - ```java title="build_tree.java" - [class]{build_tree}-[func]{dfs} - - [class]{build_tree}-[func]{buildTree} - ``` - -=== "C#" - - ```csharp title="build_tree.cs" - [class]{build_tree}-[func]{DFS} - - [class]{build_tree}-[func]{BuildTree} - ``` - -=== "Go" - - ```go title="build_tree.go" - [class]{}-[func]{dfsBuildTree} - - [class]{}-[func]{buildTree} - ``` - -=== "Swift" - - ```swift title="build_tree.swift" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "JS" - - ```javascript title="build_tree.js" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "TS" - - ```typescript title="build_tree.ts" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "Dart" - - ```dart title="build_tree.dart" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "Rust" - - ```rust title="build_tree.rs" - [class]{}-[func]{dfs} - - [class]{}-[func]{build_tree} - ``` - -=== "C" - - ```c title="build_tree.c" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` - -=== "Zig" - - ```zig title="build_tree.zig" - [class]{}-[func]{dfs} - - [class]{}-[func]{buildTree} - ``` +```src +[file]{build_tree}-[class]{}-[func]{build_tree} +``` 下图展示了构建二叉树的递归过程,各个节点是在向下“递”的过程中建立的,而各条边(即引用)是在向上“归”的过程中建立的。 diff --git a/docs/chapter_divide_and_conquer/hanota_problem.md b/docs/chapter_divide_and_conquer/hanota_problem.md index f706f52f3..aacb533a7 100644 --- a/docs/chapter_divide_and_conquer/hanota_problem.md +++ b/docs/chapter_divide_and_conquer/hanota_problem.md @@ -82,125 +82,9 @@ 在代码中,我们声明一个递归函数 `dfs(i, src, buf, tar)` ,它的作用是将柱 `src` 顶部的 $i$ 个圆盘借助缓冲柱 `buf` 移动至目标柱 `tar` 。 -=== "Python" - - ```python title="hanota.py" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solve_hanota} - ``` - -=== "C++" - - ```cpp title="hanota.cpp" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "Java" - - ```java title="hanota.java" - [class]{hanota}-[func]{move} - - [class]{hanota}-[func]{dfs} - - [class]{hanota}-[func]{solveHanota} - ``` - -=== "C#" - - ```csharp title="hanota.cs" - [class]{hanota}-[func]{Move} - - [class]{hanota}-[func]{DFS} - - [class]{hanota}-[func]{SolveHanota} - ``` - -=== "Go" - - ```go title="hanota.go" - [class]{}-[func]{move} - - [class]{}-[func]{dfsHanota} - - [class]{}-[func]{solveHanota} - ``` - -=== "Swift" - - ```swift title="hanota.swift" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "JS" - - ```javascript title="hanota.js" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "TS" - - ```typescript title="hanota.ts" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "Dart" - - ```dart title="hanota.dart" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "Rust" - - ```rust title="hanota.rs" - [class]{}-[func]{move_pan} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solve_hanota} - ``` - -=== "C" - - ```c title="hanota.c" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` - -=== "Zig" - - ```zig title="hanota.zig" - [class]{}-[func]{move} - - [class]{}-[func]{dfs} - - [class]{}-[func]{solveHanota} - ``` +```src +[file]{hanota}-[class]{}-[func]{solve_hanota} +``` 如下图所示,汉诺塔问题形成一个高度为 $n$ 的递归树,每个节点代表一个子问题、对应一个开启的 `dfs()` 函数,**因此时间复杂度为 $O(2^n)$ ,空间复杂度为 $O(n)$** 。 diff --git a/docs/chapter_dynamic_programming/dp_problem_features.md b/docs/chapter_dynamic_programming/dp_problem_features.md index 8d7a70b96..07fa862b7 100644 --- a/docs/chapter_dynamic_programming/dp_problem_features.md +++ b/docs/chapter_dynamic_programming/dp_problem_features.md @@ -34,77 +34,9 @@ $$ 根据状态转移方程,以及初始状态 $dp[1] = cost[1]$ 和 $dp[2] = cost[2]$ ,我们就可以得到动态规划代码。 -=== "Python" - - ```python title="min_cost_climbing_stairs_dp.py" - [class]{}-[func]{min_cost_climbing_stairs_dp} - ``` - -=== "C++" - - ```cpp title="min_cost_climbing_stairs_dp.cpp" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "Java" - - ```java title="min_cost_climbing_stairs_dp.java" - [class]{min_cost_climbing_stairs_dp}-[func]{minCostClimbingStairsDP} - ``` - -=== "C#" - - ```csharp title="min_cost_climbing_stairs_dp.cs" - [class]{min_cost_climbing_stairs_dp}-[func]{MinCostClimbingStairsDP} - ``` - -=== "Go" - - ```go title="min_cost_climbing_stairs_dp.go" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "Swift" - - ```swift title="min_cost_climbing_stairs_dp.swift" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "JS" - - ```javascript title="min_cost_climbing_stairs_dp.js" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "TS" - - ```typescript title="min_cost_climbing_stairs_dp.ts" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "Dart" - - ```dart title="min_cost_climbing_stairs_dp.dart" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "Rust" - - ```rust title="min_cost_climbing_stairs_dp.rs" - [class]{}-[func]{min_cost_climbing_stairs_dp} - ``` - -=== "C" - - ```c title="min_cost_climbing_stairs_dp.c" - [class]{}-[func]{minCostClimbingStairsDP} - ``` - -=== "Zig" - - ```zig title="min_cost_climbing_stairs_dp.zig" - [class]{}-[func]{minCostClimbingStairsDP} - ``` +```src +[file]{min_cost_climbing_stairs_dp}-[class]{}-[func]{min_cost_climbing_stairs_dp} +``` 下图展示了以上代码的动态规划过程。 @@ -112,77 +44,9 @@ $$ 本题也可以进行空间优化,将一维压缩至零维,使得空间复杂度从 $O(n)$ 降低至 $O(1)$ 。 -=== "Python" - - ```python title="min_cost_climbing_stairs_dp.py" - [class]{}-[func]{min_cost_climbing_stairs_dp_comp} - ``` - -=== "C++" - - ```cpp title="min_cost_climbing_stairs_dp.cpp" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "Java" - - ```java title="min_cost_climbing_stairs_dp.java" - [class]{min_cost_climbing_stairs_dp}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "C#" - - ```csharp title="min_cost_climbing_stairs_dp.cs" - [class]{min_cost_climbing_stairs_dp}-[func]{MinCostClimbingStairsDPComp} - ``` - -=== "Go" - - ```go title="min_cost_climbing_stairs_dp.go" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "Swift" - - ```swift title="min_cost_climbing_stairs_dp.swift" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "JS" - - ```javascript title="min_cost_climbing_stairs_dp.js" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "TS" - - ```typescript title="min_cost_climbing_stairs_dp.ts" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "Dart" - - ```dart title="min_cost_climbing_stairs_dp.dart" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "Rust" - - ```rust title="min_cost_climbing_stairs_dp.rs" - [class]{}-[func]{min_cost_climbing_stairs_dp_comp} - ``` - -=== "C" - - ```c title="min_cost_climbing_stairs_dp.c" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` - -=== "Zig" - - ```zig title="min_cost_climbing_stairs_dp.zig" - [class]{}-[func]{minCostClimbingStairsDPComp} - ``` +```src +[file]{min_cost_climbing_stairs_dp}-[class]{}-[func]{min_cost_climbing_stairs_dp_comp} +``` ## 无后效性 @@ -222,77 +86,9 @@ $$ 最终,返回 $dp[n, 1] + dp[n, 2]$ 即可,两者之和代表爬到第 $n$ 阶的方案总数。 -=== "Python" - - ```python title="climbing_stairs_constraint_dp.py" - [class]{}-[func]{climbing_stairs_constraint_dp} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_constraint_dp.cpp" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "Java" - - ```java title="climbing_stairs_constraint_dp.java" - [class]{climbing_stairs_constraint_dp}-[func]{climbingStairsConstraintDP} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_constraint_dp.cs" - [class]{climbing_stairs_constraint_dp}-[func]{ClimbingStairsConstraintDP} - ``` - -=== "Go" - - ```go title="climbing_stairs_constraint_dp.go" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_constraint_dp.swift" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_constraint_dp.js" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_constraint_dp.ts" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_constraint_dp.dart" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_constraint_dp.rs" - [class]{}-[func]{climbing_stairs_constraint_dp} - ``` - -=== "C" - - ```c title="climbing_stairs_constraint_dp.c" - [class]{}-[func]{climbingStairsConstraintDP} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_constraint_dp.zig" - [class]{}-[func]{climbingStairsConstraintDP} - ``` +```src +[file]{climbing_stairs_constraint_dp}-[class]{}-[func]{climbing_stairs_constraint_dp} +``` 在上面的案例中,由于仅需多考虑前面一个状态,我们仍然可以通过扩展状态定义,使得问题重新满足无后效性。然而,某些问题具有非常严重的“有后效性”。 diff --git a/docs/chapter_dynamic_programming/dp_solution_pipeline.md b/docs/chapter_dynamic_programming/dp_solution_pipeline.md index 9fe1da02f..6d4acb3de 100644 --- a/docs/chapter_dynamic_programming/dp_solution_pipeline.md +++ b/docs/chapter_dynamic_programming/dp_solution_pipeline.md @@ -98,77 +98,9 @@ $$ - **终止条件**:当 $i = 0$ 且 $j = 0$ 时,返回代价 $grid[0, 0]$ 。 - **剪枝**:当 $i < 0$ 时或 $j < 0$ 时索引越界,此时返回代价 $+\infty$ ,代表不可行。 -=== "Python" - - ```python title="min_path_sum.py" - [class]{}-[func]{min_path_sum_dfs} - ``` - -=== "C++" - - ```cpp title="min_path_sum.cpp" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "Java" - - ```java title="min_path_sum.java" - [class]{min_path_sum}-[func]{minPathSumDFS} - ``` - -=== "C#" - - ```csharp title="min_path_sum.cs" - [class]{min_path_sum}-[func]{MinPathSumDFS} - ``` - -=== "Go" - - ```go title="min_path_sum.go" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "Swift" - - ```swift title="min_path_sum.swift" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "JS" - - ```javascript title="min_path_sum.js" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "TS" - - ```typescript title="min_path_sum.ts" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "Dart" - - ```dart title="min_path_sum.dart" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "Rust" - - ```rust title="min_path_sum.rs" - [class]{}-[func]{min_path_sum_dfs} - ``` - -=== "C" - - ```c title="min_path_sum.c" - [class]{}-[func]{minPathSumDFS} - ``` - -=== "Zig" - - ```zig title="min_path_sum.zig" - [class]{}-[func]{minPathSumDFS} - ``` +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dfs} +``` 下图给出了以 $dp[2, 1]$ 为根节点的递归树,其中包含一些重叠子问题,其数量会随着网格 `grid` 的尺寸变大而急剧增多。 @@ -182,77 +114,9 @@ $$ 我们引入一个和网格 `grid` 相同尺寸的记忆列表 `mem` ,用于记录各个子问题的解,并将重叠子问题进行剪枝。 -=== "Python" - - ```python title="min_path_sum.py" - [class]{}-[func]{min_path_sum_dfs_mem} - ``` - -=== "C++" - - ```cpp title="min_path_sum.cpp" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "Java" - - ```java title="min_path_sum.java" - [class]{min_path_sum}-[func]{minPathSumDFSMem} - ``` - -=== "C#" - - ```csharp title="min_path_sum.cs" - [class]{min_path_sum}-[func]{MinPathSumDFSMem} - ``` - -=== "Go" - - ```go title="min_path_sum.go" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "Swift" - - ```swift title="min_path_sum.swift" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "JS" - - ```javascript title="min_path_sum.js" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "TS" - - ```typescript title="min_path_sum.ts" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "Dart" - - ```dart title="min_path_sum.dart" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "Rust" - - ```rust title="min_path_sum.rs" - [class]{}-[func]{min_path_sum_dfs_mem} - ``` - -=== "C" - - ```c title="min_path_sum.c" - [class]{}-[func]{minPathSumDFSMem} - ``` - -=== "Zig" - - ```zig title="min_path_sum.zig" - [class]{}-[func]{minPathSumDFSMem} - ``` +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dfs_mem} +``` 如下图所示,在引入记忆化后,所有子问题的解只需计算一次,因此时间复杂度取决于状态总数,即网格尺寸 $O(nm)$ 。 @@ -262,77 +126,9 @@ $$ 基于迭代实现动态规划解法。 -=== "Python" - - ```python title="min_path_sum.py" - [class]{}-[func]{min_path_sum_dp} - ``` - -=== "C++" - - ```cpp title="min_path_sum.cpp" - [class]{}-[func]{minPathSumDP} - ``` - -=== "Java" - - ```java title="min_path_sum.java" - [class]{min_path_sum}-[func]{minPathSumDP} - ``` - -=== "C#" - - ```csharp title="min_path_sum.cs" - [class]{min_path_sum}-[func]{MinPathSumDP} - ``` - -=== "Go" - - ```go title="min_path_sum.go" - [class]{}-[func]{minPathSumDP} - ``` - -=== "Swift" - - ```swift title="min_path_sum.swift" - [class]{}-[func]{minPathSumDP} - ``` - -=== "JS" - - ```javascript title="min_path_sum.js" - [class]{}-[func]{minPathSumDP} - ``` - -=== "TS" - - ```typescript title="min_path_sum.ts" - [class]{}-[func]{minPathSumDP} - ``` - -=== "Dart" - - ```dart title="min_path_sum.dart" - [class]{}-[func]{minPathSumDP} - ``` - -=== "Rust" - - ```rust title="min_path_sum.rs" - [class]{}-[func]{min_path_sum_dp} - ``` - -=== "C" - - ```c title="min_path_sum.c" - [class]{}-[func]{minPathSumDP} - ``` - -=== "Zig" - - ```zig title="min_path_sum.zig" - [class]{}-[func]{minPathSumDP} - ``` +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dp} +``` 下图展示了最小路径和的状态转移过程,其遍历了整个网格,**因此时间复杂度为 $O(nm)$** 。 @@ -380,74 +176,6 @@ $$ 请注意,因为数组 `dp` 只能表示一行的状态,所以我们无法提前初始化首列状态,而是在遍历每行中更新它。 -=== "Python" - - ```python title="min_path_sum.py" - [class]{}-[func]{min_path_sum_dp_comp} - ``` - -=== "C++" - - ```cpp title="min_path_sum.cpp" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "Java" - - ```java title="min_path_sum.java" - [class]{min_path_sum}-[func]{minPathSumDPComp} - ``` - -=== "C#" - - ```csharp title="min_path_sum.cs" - [class]{min_path_sum}-[func]{MinPathSumDPComp} - ``` - -=== "Go" - - ```go title="min_path_sum.go" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "Swift" - - ```swift title="min_path_sum.swift" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "JS" - - ```javascript title="min_path_sum.js" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "TS" - - ```typescript title="min_path_sum.ts" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "Dart" - - ```dart title="min_path_sum.dart" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "Rust" - - ```rust title="min_path_sum.rs" - [class]{}-[func]{min_path_sum_dp_comp} - ``` - -=== "C" - - ```c title="min_path_sum.c" - [class]{}-[func]{minPathSumDPComp} - ``` - -=== "Zig" - - ```zig title="min_path_sum.zig" - [class]{}-[func]{minPathSumDPComp} - ``` +```src +[file]{min_path_sum}-[class]{}-[func]{min_path_sum_dp_comp} +``` diff --git a/docs/chapter_dynamic_programming/edit_distance_problem.md b/docs/chapter_dynamic_programming/edit_distance_problem.md index 1ada3a21a..5f2caf80e 100644 --- a/docs/chapter_dynamic_programming/edit_distance_problem.md +++ b/docs/chapter_dynamic_programming/edit_distance_problem.md @@ -67,77 +67,9 @@ $$ ### 代码实现 -=== "Python" - - ```python title="edit_distance.py" - [class]{}-[func]{edit_distance_dp} - ``` - -=== "C++" - - ```cpp title="edit_distance.cpp" - [class]{}-[func]{editDistanceDP} - ``` - -=== "Java" - - ```java title="edit_distance.java" - [class]{edit_distance}-[func]{editDistanceDP} - ``` - -=== "C#" - - ```csharp title="edit_distance.cs" - [class]{edit_distance}-[func]{EditDistanceDP} - ``` - -=== "Go" - - ```go title="edit_distance.go" - [class]{}-[func]{editDistanceDP} - ``` - -=== "Swift" - - ```swift title="edit_distance.swift" - [class]{}-[func]{editDistanceDP} - ``` - -=== "JS" - - ```javascript title="edit_distance.js" - [class]{}-[func]{editDistanceDP} - ``` - -=== "TS" - - ```typescript title="edit_distance.ts" - [class]{}-[func]{editDistanceDP} - ``` - -=== "Dart" - - ```dart title="edit_distance.dart" - [class]{}-[func]{editDistanceDP} - ``` - -=== "Rust" - - ```rust title="edit_distance.rs" - [class]{}-[func]{edit_distance_dp} - ``` - -=== "C" - - ```c title="edit_distance.c" - [class]{}-[func]{editDistanceDP} - ``` - -=== "Zig" - - ```zig title="edit_distance.zig" - [class]{}-[func]{editDistanceDP} - ``` +```src +[file]{edit_distance}-[class]{}-[func]{edit_distance_dp} +``` 如下图所示,编辑距离问题的状态转移过程与背包问题非常类似,都可以看作是填写一个二维网格的过程。 @@ -192,74 +124,6 @@ $$ 为此,我们可以使用一个变量 `leftup` 来暂存左上方的解 $dp[i-1, j-1]$ ,从而只需考虑左方和上方的解。此时的情况与完全背包问题相同,可使用正序遍历。 -=== "Python" - - ```python title="edit_distance.py" - [class]{}-[func]{edit_distance_dp_comp} - ``` - -=== "C++" - - ```cpp title="edit_distance.cpp" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "Java" - - ```java title="edit_distance.java" - [class]{edit_distance}-[func]{editDistanceDPComp} - ``` - -=== "C#" - - ```csharp title="edit_distance.cs" - [class]{edit_distance}-[func]{EditDistanceDPComp} - ``` - -=== "Go" - - ```go title="edit_distance.go" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "Swift" - - ```swift title="edit_distance.swift" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "JS" - - ```javascript title="edit_distance.js" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "TS" - - ```typescript title="edit_distance.ts" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "Dart" - - ```dart title="edit_distance.dart" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "Rust" - - ```rust title="edit_distance.rs" - [class]{}-[func]{edit_distance_dp_comp} - ``` - -=== "C" - - ```c title="edit_distance.c" - [class]{}-[func]{editDistanceDPComp} - ``` - -=== "Zig" - - ```zig title="edit_distance.zig" - [class]{}-[func]{editDistanceDPComp} - ``` +```src +[file]{edit_distance}-[class]{}-[func]{edit_distance_dp_comp} +``` diff --git a/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md b/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md index c45ebfe9c..0dde96170 100644 --- a/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md +++ b/docs/chapter_dynamic_programming/intro_to_dynamic_programming.md @@ -14,101 +14,9 @@ 本题的目标是求解方案数量,**我们可以考虑通过回溯来穷举所有可能性**。具体来说,将爬楼梯想象为一个多轮选择的过程:从地面出发,每轮选择上 $1$ 阶或 $2$ 阶,每当到达楼梯顶部时就将方案数量加 $1$ ,当越过楼梯顶部时就将其剪枝。 -=== "Python" - - ```python title="climbing_stairs_backtrack.py" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbing_stairs_backtrack} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_backtrack.cpp" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "Java" - - ```java title="climbing_stairs_backtrack.java" - [class]{climbing_stairs_backtrack}-[func]{backtrack} - - [class]{climbing_stairs_backtrack}-[func]{climbingStairsBacktrack} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_backtrack.cs" - [class]{climbing_stairs_backtrack}-[func]{Backtrack} - - [class]{climbing_stairs_backtrack}-[func]{ClimbingStairsBacktrack} - ``` - -=== "Go" - - ```go title="climbing_stairs_backtrack.go" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_backtrack.swift" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_backtrack.js" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_backtrack.ts" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_backtrack.dart" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_backtrack.rs" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbing_stairs_backtrack} - ``` - -=== "C" - - ```c title="climbing_stairs_backtrack.c" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_backtrack.zig" - [class]{}-[func]{backtrack} - - [class]{}-[func]{climbingStairsBacktrack} - ``` +```src +[file]{climbing_stairs_backtrack}-[class]{}-[func]{climbing_stairs_backtrack} +``` ## 方法一:暴力搜索 @@ -136,101 +44,9 @@ $$ 观察以下代码,它和标准回溯代码都属于深度优先搜索,但更加简洁。 -=== "Python" - - ```python title="climbing_stairs_dfs.py" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbing_stairs_dfs} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_dfs.cpp" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "Java" - - ```java title="climbing_stairs_dfs.java" - [class]{climbing_stairs_dfs}-[func]{dfs} - - [class]{climbing_stairs_dfs}-[func]{climbingStairsDFS} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_dfs.cs" - [class]{climbing_stairs_dfs}-[func]{DFS} - - [class]{climbing_stairs_dfs}-[func]{ClimbingStairsDFS} - ``` - -=== "Go" - - ```go title="climbing_stairs_dfs.go" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_dfs.swift" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_dfs.js" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_dfs.ts" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_dfs.dart" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_dfs.rs" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbing_stairs_dfs} - ``` - -=== "C" - - ```c title="climbing_stairs_dfs.c" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_dfs.zig" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFS} - ``` +```src +[file]{climbing_stairs_dfs}-[class]{}-[func]{climbing_stairs_dfs} +``` 下图展示了暴力搜索形成的递归树。对于问题 $dp[n]$ ,其递归树的深度为 $n$ ,时间复杂度为 $O(2^n)$ 。指数阶属于爆炸式增长,如果我们输入一个比较大的 $n$ ,则会陷入漫长的等待之中。 @@ -247,101 +63,9 @@ $$ 1. 当首次计算 $dp[i]$ 时,我们将其记录至 `mem[i]` ,以便之后使用。 2. 当再次需要计算 $dp[i]$ 时,我们便可直接从 `mem[i]` 中获取结果,从而避免重复计算该子问题。 -=== "Python" - - ```python title="climbing_stairs_dfs_mem.py" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbing_stairs_dfs_mem} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_dfs_mem.cpp" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "Java" - - ```java title="climbing_stairs_dfs_mem.java" - [class]{climbing_stairs_dfs_mem}-[func]{dfs} - - [class]{climbing_stairs_dfs_mem}-[func]{climbingStairsDFSMem} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_dfs_mem.cs" - [class]{climbing_stairs_dfs_mem}-[func]{DFS} - - [class]{climbing_stairs_dfs_mem}-[func]{ClimbingStairsDFSMem} - ``` - -=== "Go" - - ```go title="climbing_stairs_dfs_mem.go" - [class]{}-[func]{dfsMem} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_dfs_mem.swift" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_dfs_mem.js" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_dfs_mem.ts" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_dfs_mem.dart" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_dfs_mem.rs" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbing_stairs_dfs_mem} - ``` - -=== "C" - - ```c title="climbing_stairs_dfs_mem.c" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_dfs_mem.zig" - [class]{}-[func]{dfs} - - [class]{}-[func]{climbingStairsDFSMem} - ``` +```src +[file]{climbing_stairs_dfs_mem}-[class]{}-[func]{climbing_stairs_dfs_mem} +``` 观察下图,**经过记忆化处理后,所有重叠子问题都只需被计算一次,时间复杂度被优化至 $O(n)$** ,这是一个巨大的飞跃。 @@ -355,77 +79,9 @@ $$ 由于动态规划不包含回溯过程,因此只需使用循环迭代实现,无须使用递归。在以下代码中,我们初始化一个数组 `dp` 来存储子问题的解,它起到了记忆化搜索中数组 `mem` 相同的记录作用。 -=== "Python" - - ```python title="climbing_stairs_dp.py" - [class]{}-[func]{climbing_stairs_dp} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_dp.cpp" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "Java" - - ```java title="climbing_stairs_dp.java" - [class]{climbing_stairs_dp}-[func]{climbingStairsDP} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_dp.cs" - [class]{climbing_stairs_dp}-[func]{ClimbingStairsDP} - ``` - -=== "Go" - - ```go title="climbing_stairs_dp.go" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_dp.swift" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_dp.js" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_dp.ts" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_dp.dart" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_dp.rs" - [class]{}-[func]{climbing_stairs_dp} - ``` - -=== "C" - - ```c title="climbing_stairs_dp.c" - [class]{}-[func]{climbingStairsDP} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_dp.zig" - [class]{}-[func]{climbingStairsDP} - ``` +```src +[file]{climbing_stairs_dp}-[class]{}-[func]{climbing_stairs_dp} +``` 下图模拟了以上代码的执行过程。 @@ -443,77 +99,9 @@ $$ 细心的你可能发现,**由于 $dp[i]$ 只与 $dp[i-1]$ 和 $dp[i-2]$ 有关,因此我们无须使用一个数组 `dp` 来存储所有子问题的解**,而只需两个变量滚动前进即可。 -=== "Python" - - ```python title="climbing_stairs_dp.py" - [class]{}-[func]{climbing_stairs_dp_comp} - ``` - -=== "C++" - - ```cpp title="climbing_stairs_dp.cpp" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "Java" - - ```java title="climbing_stairs_dp.java" - [class]{climbing_stairs_dp}-[func]{climbingStairsDPComp} - ``` - -=== "C#" - - ```csharp title="climbing_stairs_dp.cs" - [class]{climbing_stairs_dp}-[func]{ClimbingStairsDPComp} - ``` - -=== "Go" - - ```go title="climbing_stairs_dp.go" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "Swift" - - ```swift title="climbing_stairs_dp.swift" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "JS" - - ```javascript title="climbing_stairs_dp.js" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "TS" - - ```typescript title="climbing_stairs_dp.ts" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "Dart" - - ```dart title="climbing_stairs_dp.dart" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "Rust" - - ```rust title="climbing_stairs_dp.rs" - [class]{}-[func]{climbing_stairs_dp_comp} - ``` - -=== "C" - - ```c title="climbing_stairs_dp.c" - [class]{}-[func]{climbingStairsDPComp} - ``` - -=== "Zig" - - ```zig title="climbing_stairs_dp.zig" - [class]{}-[func]{climbingStairsDPComp} - ``` +```src +[file]{climbing_stairs_dp}-[class]{}-[func]{climbing_stairs_dp_comp} +``` 观察以上代码,由于省去了数组 `dp` 占用的空间,因此空间复杂度从 $O(n)$ 降低至 $O(1)$ 。 diff --git a/docs/chapter_dynamic_programming/knapsack_problem.md b/docs/chapter_dynamic_programming/knapsack_problem.md index 5df6f5e6e..66cfd20ca 100644 --- a/docs/chapter_dynamic_programming/knapsack_problem.md +++ b/docs/chapter_dynamic_programming/knapsack_problem.md @@ -56,77 +56,9 @@ $$ - **终止条件**:当物品编号越界 $i = 0$ 或背包剩余容量为 $0$ 时,终止递归并返回价值 $0$ 。 - **剪枝**:若当前物品重量超出背包剩余容量,则只能不放入背包。 -=== "Python" - - ```python title="knapsack.py" - [class]{}-[func]{knapsack_dfs} - ``` - -=== "C++" - - ```cpp title="knapsack.cpp" - [class]{}-[func]{knapsackDFS} - ``` - -=== "Java" - - ```java title="knapsack.java" - [class]{knapsack}-[func]{knapsackDFS} - ``` - -=== "C#" - - ```csharp title="knapsack.cs" - [class]{knapsack}-[func]{KnapsackDFS} - ``` - -=== "Go" - - ```go title="knapsack.go" - [class]{}-[func]{knapsackDFS} - ``` - -=== "Swift" - - ```swift title="knapsack.swift" - [class]{}-[func]{knapsackDFS} - ``` - -=== "JS" - - ```javascript title="knapsack.js" - [class]{}-[func]{knapsackDFS} - ``` - -=== "TS" - - ```typescript title="knapsack.ts" - [class]{}-[func]{knapsackDFS} - ``` - -=== "Dart" - - ```dart title="knapsack.dart" - [class]{}-[func]{knapsackDFS} - ``` - -=== "Rust" - - ```rust title="knapsack.rs" - [class]{}-[func]{knapsack_dfs} - ``` - -=== "C" - - ```c title="knapsack.c" - [class]{}-[func]{knapsackDFS} - ``` - -=== "Zig" - - ```zig title="knapsack.zig" - [class]{}-[func]{knapsackDFS} - ``` +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dfs} +``` 如下图所示,由于每个物品都会产生不选和选两条搜索分支,因此时间复杂度为 $O(2^n)$ 。 @@ -140,77 +72,9 @@ $$ 引入记忆化之后,**时间复杂度取决于子问题数量**,也就是 $O(n \times cap)$ 。 -=== "Python" - - ```python title="knapsack.py" - [class]{}-[func]{knapsack_dfs_mem} - ``` - -=== "C++" - - ```cpp title="knapsack.cpp" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "Java" - - ```java title="knapsack.java" - [class]{knapsack}-[func]{knapsackDFSMem} - ``` - -=== "C#" - - ```csharp title="knapsack.cs" - [class]{knapsack}-[func]{KnapsackDFSMem} - ``` - -=== "Go" - - ```go title="knapsack.go" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "Swift" - - ```swift title="knapsack.swift" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "JS" - - ```javascript title="knapsack.js" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "TS" - - ```typescript title="knapsack.ts" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "Dart" - - ```dart title="knapsack.dart" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "Rust" - - ```rust title="knapsack.rs" - [class]{}-[func]{knapsack_dfs_mem} - ``` - -=== "C" - - ```c title="knapsack.c" - [class]{}-[func]{knapsackDFSMem} - ``` - -=== "Zig" - - ```zig title="knapsack.zig" - [class]{}-[func]{knapsackDFSMem} - ``` +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dfs_mem} +``` 下图展示了在记忆化递归中被剪掉的搜索分支。 @@ -220,77 +84,9 @@ $$ 动态规划实质上就是在状态转移中填充 $dp$ 表的过程,代码如下所示。 -=== "Python" - - ```python title="knapsack.py" - [class]{}-[func]{knapsack_dp} - ``` - -=== "C++" - - ```cpp title="knapsack.cpp" - [class]{}-[func]{knapsackDP} - ``` - -=== "Java" - - ```java title="knapsack.java" - [class]{knapsack}-[func]{knapsackDP} - ``` - -=== "C#" - - ```csharp title="knapsack.cs" - [class]{knapsack}-[func]{KnapsackDP} - ``` - -=== "Go" - - ```go title="knapsack.go" - [class]{}-[func]{knapsackDP} - ``` - -=== "Swift" - - ```swift title="knapsack.swift" - [class]{}-[func]{knapsackDP} - ``` - -=== "JS" - - ```javascript title="knapsack.js" - [class]{}-[func]{knapsackDP} - ``` - -=== "TS" - - ```typescript title="knapsack.ts" - [class]{}-[func]{knapsackDP} - ``` - -=== "Dart" - - ```dart title="knapsack.dart" - [class]{}-[func]{knapsackDP} - ``` - -=== "Rust" - - ```rust title="knapsack.rs" - [class]{}-[func]{knapsack_dp} - ``` - -=== "C" - - ```c title="knapsack.c" - [class]{}-[func]{knapsackDP} - ``` - -=== "Zig" - - ```zig title="knapsack.zig" - [class]{}-[func]{knapsackDP} - ``` +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dp} +``` 如下图所示,时间复杂度和空间复杂度都由数组 `dp` 大小决定,即 $O(n \times cap)$ 。 @@ -367,74 +163,6 @@ $$ 在代码实现中,我们仅需将数组 `dp` 的第一维 $i$ 直接删除,并且把内循环更改为倒序遍历即可。 -=== "Python" - - ```python title="knapsack.py" - [class]{}-[func]{knapsack_dp_comp} - ``` - -=== "C++" - - ```cpp title="knapsack.cpp" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "Java" - - ```java title="knapsack.java" - [class]{knapsack}-[func]{knapsackDPComp} - ``` - -=== "C#" - - ```csharp title="knapsack.cs" - [class]{knapsack}-[func]{KnapsackDPComp} - ``` - -=== "Go" - - ```go title="knapsack.go" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "Swift" - - ```swift title="knapsack.swift" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "JS" - - ```javascript title="knapsack.js" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "TS" - - ```typescript title="knapsack.ts" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "Dart" - - ```dart title="knapsack.dart" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "Rust" - - ```rust title="knapsack.rs" - [class]{}-[func]{knapsack_dp_comp} - ``` - -=== "C" - - ```c title="knapsack.c" - [class]{}-[func]{knapsackDPComp} - ``` - -=== "Zig" - - ```zig title="knapsack.zig" - [class]{}-[func]{knapsackDPComp} - ``` +```src +[file]{knapsack}-[class]{}-[func]{knapsack_dp_comp} +``` diff --git a/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md b/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md index 827d12174..a798970a2 100644 --- a/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md +++ b/docs/chapter_dynamic_programming/unbounded_knapsack_problem.md @@ -32,77 +32,9 @@ $$ 对比两道题目的代码,状态转移中有一处从 $i-1$ 变为 $i$ ,其余完全一致。 -=== "Python" - - ```python title="unbounded_knapsack.py" - [class]{}-[func]{unbounded_knapsack_dp} - ``` - -=== "C++" - - ```cpp title="unbounded_knapsack.cpp" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "Java" - - ```java title="unbounded_knapsack.java" - [class]{unbounded_knapsack}-[func]{unboundedKnapsackDP} - ``` - -=== "C#" - - ```csharp title="unbounded_knapsack.cs" - [class]{unbounded_knapsack}-[func]{UnboundedKnapsackDP} - ``` - -=== "Go" - - ```go title="unbounded_knapsack.go" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "Swift" - - ```swift title="unbounded_knapsack.swift" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "JS" - - ```javascript title="unbounded_knapsack.js" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "TS" - - ```typescript title="unbounded_knapsack.ts" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "Dart" - - ```dart title="unbounded_knapsack.dart" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "Rust" - - ```rust title="unbounded_knapsack.rs" - [class]{}-[func]{unbounded_knapsack_dp} - ``` - -=== "C" - - ```c title="unbounded_knapsack.c" - [class]{}-[func]{unboundedKnapsackDP} - ``` - -=== "Zig" - - ```zig title="unbounded_knapsack.zig" - [class]{}-[func]{unboundedKnapsackDP} - ``` +```src +[file]{unbounded_knapsack}-[class]{}-[func]{unbounded_knapsack_dp} +``` ### 空间优化 @@ -130,77 +62,9 @@ $$ 代码实现比较简单,仅需将数组 `dp` 的第一维删除。 -=== "Python" - - ```python title="unbounded_knapsack.py" - [class]{}-[func]{unbounded_knapsack_dp_comp} - ``` - -=== "C++" - - ```cpp title="unbounded_knapsack.cpp" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "Java" - - ```java title="unbounded_knapsack.java" - [class]{unbounded_knapsack}-[func]{unboundedKnapsackDPComp} - ``` - -=== "C#" - - ```csharp title="unbounded_knapsack.cs" - [class]{unbounded_knapsack}-[func]{UnboundedKnapsackDPComp} - ``` - -=== "Go" - - ```go title="unbounded_knapsack.go" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "Swift" - - ```swift title="unbounded_knapsack.swift" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "JS" - - ```javascript title="unbounded_knapsack.js" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "TS" - - ```typescript title="unbounded_knapsack.ts" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "Dart" - - ```dart title="unbounded_knapsack.dart" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "Rust" - - ```rust title="unbounded_knapsack.rs" - [class]{}-[func]{unbounded_knapsack_dp_comp} - ``` - -=== "C" - - ```c title="unbounded_knapsack.c" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` - -=== "Zig" - - ```zig title="unbounded_knapsack.zig" - [class]{}-[func]{unboundedKnapsackDPComp} - ``` +```src +[file]{unbounded_knapsack}-[class]{}-[func]{unbounded_knapsack_dp_comp} +``` ## 零钱兑换问题 @@ -251,77 +115,9 @@ $$ 最后返回前,判断 $dp[n, amt]$ 是否等于 $amt + 1$ ,若是则返回 $-1$ ,代表无法凑出目标金额。 -=== "Python" - - ```python title="coin_change.py" - [class]{}-[func]{coin_change_dp} - ``` - -=== "C++" - - ```cpp title="coin_change.cpp" - [class]{}-[func]{coinChangeDP} - ``` - -=== "Java" - - ```java title="coin_change.java" - [class]{coin_change}-[func]{coinChangeDP} - ``` - -=== "C#" - - ```csharp title="coin_change.cs" - [class]{coin_change}-[func]{CoinChangeDP} - ``` - -=== "Go" - - ```go title="coin_change.go" - [class]{}-[func]{coinChangeDP} - ``` - -=== "Swift" - - ```swift title="coin_change.swift" - [class]{}-[func]{coinChangeDP} - ``` - -=== "JS" - - ```javascript title="coin_change.js" - [class]{}-[func]{coinChangeDP} - ``` - -=== "TS" - - ```typescript title="coin_change.ts" - [class]{}-[func]{coinChangeDP} - ``` - -=== "Dart" - - ```dart title="coin_change.dart" - [class]{}-[func]{coinChangeDP} - ``` - -=== "Rust" - - ```rust title="coin_change.rs" - [class]{}-[func]{coin_change_dp} - ``` - -=== "C" - - ```c title="coin_change.c" - [class]{}-[func]{coinChangeDP} - ``` - -=== "Zig" - - ```zig title="coin_change.zig" - [class]{}-[func]{coinChangeDP} - ``` +```src +[file]{coin_change}-[class]{}-[func]{coin_change_dp} +``` 下图展示了零钱兑换的动态规划过程,和完全背包非常相似。 @@ -374,77 +170,9 @@ $$ 零钱兑换的空间优化的处理方式和完全背包一致。 -=== "Python" - - ```python title="coin_change.py" - [class]{}-[func]{coin_change_dp_comp} - ``` - -=== "C++" - - ```cpp title="coin_change.cpp" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "Java" - - ```java title="coin_change.java" - [class]{coin_change}-[func]{coinChangeDPComp} - ``` - -=== "C#" - - ```csharp title="coin_change.cs" - [class]{coin_change}-[func]{CoinChangeDPComp} - ``` - -=== "Go" - - ```go title="coin_change.go" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "Swift" - - ```swift title="coin_change.swift" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "JS" - - ```javascript title="coin_change.js" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "TS" - - ```typescript title="coin_change.ts" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "Dart" - - ```dart title="coin_change.dart" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "Rust" - - ```rust title="coin_change.rs" - [class]{}-[func]{coin_change_dp_comp} - ``` - -=== "C" - - ```c title="coin_change.c" - [class]{}-[func]{coinChangeDPComp} - ``` - -=== "Zig" - - ```zig title="coin_change.zig" - [class]{}-[func]{coinChangeDPComp} - ``` +```src +[file]{coin_change}-[class]{}-[func]{coin_change_dp_comp} +``` ## 零钱兑换问题 II @@ -468,150 +196,14 @@ $$ ### 代码实现 -=== "Python" - - ```python title="coin_change_ii.py" - [class]{}-[func]{coin_change_ii_dp} - ``` - -=== "C++" - - ```cpp title="coin_change_ii.cpp" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "Java" - - ```java title="coin_change_ii.java" - [class]{coin_change_ii}-[func]{coinChangeIIDP} - ``` - -=== "C#" - - ```csharp title="coin_change_ii.cs" - [class]{coin_change_ii}-[func]{CoinChangeIIDP} - ``` - -=== "Go" - - ```go title="coin_change_ii.go" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "Swift" - - ```swift title="coin_change_ii.swift" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "JS" - - ```javascript title="coin_change_ii.js" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "TS" - - ```typescript title="coin_change_ii.ts" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "Dart" - - ```dart title="coin_change_ii.dart" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "Rust" - - ```rust title="coin_change_ii.rs" - [class]{}-[func]{coin_change_ii_dp} - ``` - -=== "C" - - ```c title="coin_change_ii.c" - [class]{}-[func]{coinChangeIIDP} - ``` - -=== "Zig" - - ```zig title="coin_change_ii.zig" - [class]{}-[func]{coinChangeIIDP} - ``` +```src +[file]{coin_change_ii}-[class]{}-[func]{coin_change_ii_dp} +``` ### 空间优化 空间优化处理方式相同,删除硬币维度即可。 -=== "Python" - - ```python title="coin_change_ii.py" - [class]{}-[func]{coin_change_ii_dp_comp} - ``` - -=== "C++" - - ```cpp title="coin_change_ii.cpp" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "Java" - - ```java title="coin_change_ii.java" - [class]{coin_change_ii}-[func]{coinChangeIIDPComp} - ``` - -=== "C#" - - ```csharp title="coin_change_ii.cs" - [class]{coin_change_ii}-[func]{CoinChangeIIDPComp} - ``` - -=== "Go" - - ```go title="coin_change_ii.go" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "Swift" - - ```swift title="coin_change_ii.swift" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "JS" - - ```javascript title="coin_change_ii.js" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "TS" - - ```typescript title="coin_change_ii.ts" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "Dart" - - ```dart title="coin_change_ii.dart" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "Rust" - - ```rust title="coin_change_ii.rs" - [class]{}-[func]{coin_change_ii_dp_comp} - ``` - -=== "C" - - ```c title="coin_change_ii.c" - [class]{}-[func]{coinChangeIIDPComp} - ``` - -=== "Zig" - - ```zig title="coin_change_ii.zig" - [class]{}-[func]{coinChangeIIDPComp} - ``` +```src +[file]{coin_change_ii}-[class]{}-[func]{coin_change_ii_dp_comp} +``` diff --git a/docs/chapter_graph/graph_operations.md b/docs/chapter_graph/graph_operations.md index b07698140..3b465ff70 100644 --- a/docs/chapter_graph/graph_operations.md +++ b/docs/chapter_graph/graph_operations.md @@ -28,77 +28,9 @@ 以下是基于邻接矩阵表示图的实现代码。 -=== "Python" - - ```python title="graph_adjacency_matrix.py" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "C++" - - ```cpp title="graph_adjacency_matrix.cpp" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "Java" - - ```java title="graph_adjacency_matrix.java" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "C#" - - ```csharp title="graph_adjacency_matrix.cs" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "Go" - - ```go title="graph_adjacency_matrix.go" - [class]{graphAdjMat}-[func]{} - ``` - -=== "Swift" - - ```swift title="graph_adjacency_matrix.swift" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "JS" - - ```javascript title="graph_adjacency_matrix.js" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "TS" - - ```typescript title="graph_adjacency_matrix.ts" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "Dart" - - ```dart title="graph_adjacency_matrix.dart" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "Rust" - - ```rust title="graph_adjacency_matrix.rs" - [class]{GraphAdjMat}-[func]{} - ``` - -=== "C" - - ```c title="graph_adjacency_matrix.c" - [class]{graphAdjMat}-[func]{} - ``` - -=== "Zig" - - ```zig title="graph_adjacency_matrix.zig" - - ``` +```src +[file]{graph_adjacency_matrix}-[class]{graph_adj_mat}-[func]{} +``` ## 基于邻接表的实现 @@ -131,77 +63,9 @@ 2. 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 $i$ 的顶点,则需要遍历整个邻接表,将其中 $> i$ 的索引全部减 $1$ ,这样操作效率较低。 3. 因此我们考虑引入顶点类 `Vertex` ,使得每个顶点都是唯一的对象,此时删除顶点时就无须改动其余顶点了。 -=== "Python" - - ```python title="graph_adjacency_list.py" - [class]{GraphAdjList}-[func]{} - ``` - -=== "C++" - - ```cpp title="graph_adjacency_list.cpp" - [class]{GraphAdjList}-[func]{} - ``` - -=== "Java" - - ```java title="graph_adjacency_list.java" - [class]{GraphAdjList}-[func]{} - ``` - -=== "C#" - - ```csharp title="graph_adjacency_list.cs" - [class]{GraphAdjList}-[func]{} - ``` - -=== "Go" - - ```go title="graph_adjacency_list.go" - [class]{graphAdjList}-[func]{} - ``` - -=== "Swift" - - ```swift title="graph_adjacency_list.swift" - [class]{GraphAdjList}-[func]{} - ``` - -=== "JS" - - ```javascript title="graph_adjacency_list.js" - [class]{GraphAdjList}-[func]{} - ``` - -=== "TS" - - ```typescript title="graph_adjacency_list.ts" - [class]{GraphAdjList}-[func]{} - ``` - -=== "Dart" - - ```dart title="graph_adjacency_list.dart" - [class]{GraphAdjList}-[func]{} - ``` - -=== "Rust" - - ```rust title="graph_adjacency_list.rs" - [class]{GraphAdjList}-[func]{} - ``` - -=== "C" - - ```c title="graph_adjacency_list.c" - [class]{graphAdjList}-[func]{} - ``` - -=== "Zig" - - ```zig title="graph_adjacency_list.zig" - [class]{GraphAdjList}-[func]{} - ``` +```src +[file]{graph_adjacency_list}-[class]{graph_adj_list}-[func]{} +``` ## 效率对比 diff --git a/docs/chapter_graph/graph_traversal.md b/docs/chapter_graph/graph_traversal.md index cc16218f1..db992b980 100644 --- a/docs/chapter_graph/graph_traversal.md +++ b/docs/chapter_graph/graph_traversal.md @@ -20,77 +20,9 @@ BFS 通常借助队列来实现。队列具有“先入先出”的性质,这 为了防止重复遍历顶点,我们需要借助一个哈希表 `visited` 来记录哪些节点已被访问。 -=== "Python" - - ```python title="graph_bfs.py" - [class]{}-[func]{graph_bfs} - ``` - -=== "C++" - - ```cpp title="graph_bfs.cpp" - [class]{}-[func]{graphBFS} - ``` - -=== "Java" - - ```java title="graph_bfs.java" - [class]{graph_bfs}-[func]{graphBFS} - ``` - -=== "C#" - - ```csharp title="graph_bfs.cs" - [class]{graph_bfs}-[func]{GraphBFS} - ``` - -=== "Go" - - ```go title="graph_bfs.go" - [class]{}-[func]{graphBFS} - ``` - -=== "Swift" - - ```swift title="graph_bfs.swift" - [class]{}-[func]{graphBFS} - ``` - -=== "JS" - - ```javascript title="graph_bfs.js" - [class]{}-[func]{graphBFS} - ``` - -=== "TS" - - ```typescript title="graph_bfs.ts" - [class]{}-[func]{graphBFS} - ``` - -=== "Dart" - - ```dart title="graph_bfs.dart" - [class]{}-[func]{graphBFS} - ``` - -=== "Rust" - - ```rust title="graph_bfs.rs" - [class]{}-[func]{graph_bfs} - ``` - -=== "C" - - ```c title="graph_bfs.c" - [class]{}-[func]{graphBFS} - ``` - -=== "Zig" - - ```zig title="graph_bfs.zig" - [class]{}-[func]{graphBFS} - ``` +```src +[file]{graph_bfs}-[class]{}-[func]{graph_bfs} +``` 代码相对抽象,建议对照下图来加深理解。 @@ -147,101 +79,9 @@ BFS 通常借助队列来实现。队列具有“先入先出”的性质,这 这种“走到尽头再返回”的算法范式通常基于递归来实现。与广度优先遍历类似,在深度优先遍历中我们也需要借助一个哈希表 `visited` 来记录已被访问的顶点,以避免重复访问顶点。 -=== "Python" - - ```python title="graph_dfs.py" - [class]{}-[func]{dfs} - - [class]{}-[func]{graph_dfs} - ``` - -=== "C++" - - ```cpp title="graph_dfs.cpp" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "Java" - - ```java title="graph_dfs.java" - [class]{graph_dfs}-[func]{dfs} - - [class]{graph_dfs}-[func]{graphDFS} - ``` - -=== "C#" - - ```csharp title="graph_dfs.cs" - [class]{graph_dfs}-[func]{DFS} - - [class]{graph_dfs}-[func]{GraphDFS} - ``` - -=== "Go" - - ```go title="graph_dfs.go" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "Swift" - - ```swift title="graph_dfs.swift" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "JS" - - ```javascript title="graph_dfs.js" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "TS" - - ```typescript title="graph_dfs.ts" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "Dart" - - ```dart title="graph_dfs.dart" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "Rust" - - ```rust title="graph_dfs.rs" - [class]{}-[func]{dfs} - - [class]{}-[func]{graph_dfs} - ``` - -=== "C" - - ```c title="graph_dfs.c" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` - -=== "Zig" - - ```zig title="graph_dfs.zig" - [class]{}-[func]{dfs} - - [class]{}-[func]{graphDFS} - ``` +```src +[file]{graph_dfs}-[class]{}-[func]{graph_dfs} +``` 深度优先遍历的算法流程如下图所示。 diff --git a/docs/chapter_greedy/fractional_knapsack_problem.md b/docs/chapter_greedy/fractional_knapsack_problem.md index 62e7e6b2e..324290bcc 100644 --- a/docs/chapter_greedy/fractional_knapsack_problem.md +++ b/docs/chapter_greedy/fractional_knapsack_problem.md @@ -29,101 +29,9 @@ 我们建立了一个物品类 `Item` ,以便将物品按照单位价值进行排序。循环进行贪心选择,当背包已满时跳出并返回解。 -=== "Python" - - ```python title="fractional_knapsack.py" - [class]{Item}-[func]{} - - [class]{}-[func]{fractional_knapsack} - ``` - -=== "C++" - - ```cpp title="fractional_knapsack.cpp" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "Java" - - ```java title="fractional_knapsack.java" - [class]{Item}-[func]{} - - [class]{fractional_knapsack}-[func]{fractionalKnapsack} - ``` - -=== "C#" - - ```csharp title="fractional_knapsack.cs" - [class]{Item}-[func]{} - - [class]{fractional_knapsack}-[func]{FractionalKnapsack} - ``` - -=== "Go" - - ```go title="fractional_knapsack.go" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "Swift" - - ```swift title="fractional_knapsack.swift" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "JS" - - ```javascript title="fractional_knapsack.js" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "TS" - - ```typescript title="fractional_knapsack.ts" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "Dart" - - ```dart title="fractional_knapsack.dart" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "Rust" - - ```rust title="fractional_knapsack.rs" - [class]{Item}-[func]{} - - [class]{}-[func]{fractional_knapsack} - ``` - -=== "C" - - ```c title="fractional_knapsack.c" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` - -=== "Zig" - - ```zig title="fractional_knapsack.zig" - [class]{Item}-[func]{} - - [class]{}-[func]{fractionalKnapsack} - ``` +```src +[file]{fractional_knapsack}-[class]{}-[func]{fractional_knapsack} +``` 最差情况下,需要遍历整个物品列表,**因此时间复杂度为 $O(n)$** ,其中 $n$ 为物品数量。 diff --git a/docs/chapter_greedy/greedy_algorithm.md b/docs/chapter_greedy/greedy_algorithm.md index 82b20ea8b..74156ca78 100644 --- a/docs/chapter_greedy/greedy_algorithm.md +++ b/docs/chapter_greedy/greedy_algorithm.md @@ -19,77 +19,9 @@ 实现代码如下所示。你可能会不由地发出感叹:So Clean !贪心算法仅用十行代码就解决了零钱兑换问题。 -=== "Python" - - ```python title="coin_change_greedy.py" - [class]{}-[func]{coin_change_greedy} - ``` - -=== "C++" - - ```cpp title="coin_change_greedy.cpp" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "Java" - - ```java title="coin_change_greedy.java" - [class]{coin_change_greedy}-[func]{coinChangeGreedy} - ``` - -=== "C#" - - ```csharp title="coin_change_greedy.cs" - [class]{coin_change_greedy}-[func]{CoinChangeGreedy} - ``` - -=== "Go" - - ```go title="coin_change_greedy.go" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "Swift" - - ```swift title="coin_change_greedy.swift" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "JS" - - ```javascript title="coin_change_greedy.js" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "TS" - - ```typescript title="coin_change_greedy.ts" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "Dart" - - ```dart title="coin_change_greedy.dart" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "Rust" - - ```rust title="coin_change_greedy.rs" - [class]{}-[func]{coin_change_greedy} - ``` - -=== "C" - - ```c title="coin_change_greedy.c" - [class]{}-[func]{coinChangeGreedy} - ``` - -=== "Zig" - - ```zig title="coin_change_greedy.zig" - [class]{}-[func]{coinChangeGreedy} - ``` +```src +[file]{coin_change_greedy}-[class]{}-[func]{coin_change_greedy} +``` ## 贪心优点与局限性 diff --git a/docs/chapter_greedy/max_capacity_problem.md b/docs/chapter_greedy/max_capacity_problem.md index 4f98da9e5..a759739b2 100644 --- a/docs/chapter_greedy/max_capacity_problem.md +++ b/docs/chapter_greedy/max_capacity_problem.md @@ -78,77 +78,9 @@ $$ 变量 $i$、$j$、$res$ 使用常数大小额外空间,**因此空间复杂度为 $O(1)$** 。 -=== "Python" - - ```python title="max_capacity.py" - [class]{}-[func]{max_capacity} - ``` - -=== "C++" - - ```cpp title="max_capacity.cpp" - [class]{}-[func]{maxCapacity} - ``` - -=== "Java" - - ```java title="max_capacity.java" - [class]{max_capacity}-[func]{maxCapacity} - ``` - -=== "C#" - - ```csharp title="max_capacity.cs" - [class]{max_capacity}-[func]{MaxCapacity} - ``` - -=== "Go" - - ```go title="max_capacity.go" - [class]{}-[func]{maxCapacity} - ``` - -=== "Swift" - - ```swift title="max_capacity.swift" - [class]{}-[func]{maxCapacity} - ``` - -=== "JS" - - ```javascript title="max_capacity.js" - [class]{}-[func]{maxCapacity} - ``` - -=== "TS" - - ```typescript title="max_capacity.ts" - [class]{}-[func]{maxCapacity} - ``` - -=== "Dart" - - ```dart title="max_capacity.dart" - [class]{}-[func]{maxCapacity} - ``` - -=== "Rust" - - ```rust title="max_capacity.rs" - [class]{}-[func]{max_capacity} - ``` - -=== "C" - - ```c title="max_capacity.c" - [class]{}-[func]{maxCapacity} - ``` - -=== "Zig" - - ```zig title="max_capacity.zig" - [class]{}-[func]{maxCapacity} - ``` +```src +[file]{max_capacity}-[class]{}-[func]{max_capacity} +``` ### 正确性证明 diff --git a/docs/chapter_greedy/max_product_cutting_problem.md b/docs/chapter_greedy/max_product_cutting_problem.md index c2fc30123..bdf6ca62c 100644 --- a/docs/chapter_greedy/max_product_cutting_problem.md +++ b/docs/chapter_greedy/max_product_cutting_problem.md @@ -63,77 +63,9 @@ $$ 请注意,对于 $n \leq 3$ 的边界情况,必须拆分出一个 $1$ ,乘积为 $1 \times (n - 1)$ 。 -=== "Python" - - ```python title="max_product_cutting.py" - [class]{}-[func]{max_product_cutting} - ``` - -=== "C++" - - ```cpp title="max_product_cutting.cpp" - [class]{}-[func]{maxProductCutting} - ``` - -=== "Java" - - ```java title="max_product_cutting.java" - [class]{max_product_cutting}-[func]{maxProductCutting} - ``` - -=== "C#" - - ```csharp title="max_product_cutting.cs" - [class]{max_product_cutting}-[func]{MaxProductCutting} - ``` - -=== "Go" - - ```go title="max_product_cutting.go" - [class]{}-[func]{maxProductCutting} - ``` - -=== "Swift" - - ```swift title="max_product_cutting.swift" - [class]{}-[func]{maxProductCutting} - ``` - -=== "JS" - - ```javascript title="max_product_cutting.js" - [class]{}-[func]{maxProductCutting} - ``` - -=== "TS" - - ```typescript title="max_product_cutting.ts" - [class]{}-[func]{maxProductCutting} - ``` - -=== "Dart" - - ```dart title="max_product_cutting.dart" - [class]{}-[func]{maxProductCutting} - ``` - -=== "Rust" - - ```rust title="max_product_cutting.rs" - [class]{}-[func]{max_product_cutting} - ``` - -=== "C" - - ```c title="max_product_cutting.c" - [class]{}-[func]{maxProductCutting} - ``` - -=== "Zig" - - ```zig title="max_product_cutting.zig" - [class]{}-[func]{maxProductCutting} - ``` +```src +[file]{max_product_cutting}-[class]{}-[func]{max_product_cutting} +``` ![最大切分乘积的计算方法](max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png) diff --git a/docs/chapter_hashing/hash_algorithm.md b/docs/chapter_hashing/hash_algorithm.md index 3bfc9f3b5..4c1365e6b 100644 --- a/docs/chapter_hashing/hash_algorithm.md +++ b/docs/chapter_hashing/hash_algorithm.md @@ -46,149 +46,9 @@ index = hash(key) % capacity - **异或哈希**:将输入数据的每个元素通过异或操作累积到一个哈希值中。 - **旋转哈希**:将每个字符的 ASCII 码累积到一个哈希值中,每次累积之前都会对哈希值进行旋转操作。 -=== "Python" - - ```python title="simple_hash.py" - [class]{}-[func]{add_hash} - - [class]{}-[func]{mul_hash} - - [class]{}-[func]{xor_hash} - - [class]{}-[func]{rot_hash} - ``` - -=== "C++" - - ```cpp title="simple_hash.cpp" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "Java" - - ```java title="simple_hash.java" - [class]{simple_hash}-[func]{addHash} - - [class]{simple_hash}-[func]{mulHash} - - [class]{simple_hash}-[func]{xorHash} - - [class]{simple_hash}-[func]{rotHash} - ``` - -=== "C#" - - ```csharp title="simple_hash.cs" - [class]{simple_hash}-[func]{AddHash} - - [class]{simple_hash}-[func]{MulHash} - - [class]{simple_hash}-[func]{XorHash} - - [class]{simple_hash}-[func]{RotHash} - ``` - -=== "Go" - - ```go title="simple_hash.go" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "Swift" - - ```swift title="simple_hash.swift" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "JS" - - ```javascript title="simple_hash.js" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "TS" - - ```typescript title="simple_hash.ts" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "Dart" - - ```dart title="simple_hash.dart" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "Rust" - - ```rust title="simple_hash.rs" - [class]{}-[func]{add_hash} - - [class]{}-[func]{mul_hash} - - [class]{}-[func]{xor_hash} - - [class]{}-[func]{rot_hash} - ``` - -=== "C" - - ```c title="simple_hash.c" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` - -=== "Zig" - - ```zig title="simple_hash.zig" - [class]{}-[func]{addHash} - - [class]{}-[func]{mulHash} - - [class]{}-[func]{xorHash} - - [class]{}-[func]{rotHash} - ``` +```src +[file]{simple_hash}-[class]{}-[func]{rot_hash} +``` 观察发现,每种哈希算法的最后一步都是对大质数 $1000000007$ 取模,以确保哈希值在合适的范围内。值得思考的是,为什么要强调对质数取模,或者说对合数取模的弊端是什么?这是一个有趣的问题。 diff --git a/docs/chapter_hashing/hash_collision.md b/docs/chapter_hashing/hash_collision.md index ba842699b..7e82482e5 100644 --- a/docs/chapter_hashing/hash_collision.md +++ b/docs/chapter_hashing/hash_collision.md @@ -31,79 +31,9 @@ - 使用列表(动态数组)代替链表,从而简化代码。在这种设定下,哈希表(数组)包含多个桶,每个桶都是一个列表。 - 以下实现包含哈希表扩容方法。当负载因子超过 $\frac{2}{3}$ 时,我们将哈希表扩容至 $2$ 倍。 -=== "Python" - - ```python title="hash_map_chaining.py" - [class]{HashMapChaining}-[func]{} - ``` - -=== "C++" - - ```cpp title="hash_map_chaining.cpp" - [class]{HashMapChaining}-[func]{} - ``` - -=== "Java" - - ```java title="hash_map_chaining.java" - [class]{HashMapChaining}-[func]{} - ``` - -=== "C#" - - ```csharp title="hash_map_chaining.cs" - [class]{HashMapChaining}-[func]{} - ``` - -=== "Go" - - ```go title="hash_map_chaining.go" - [class]{hashMapChaining}-[func]{} - ``` - -=== "Swift" - - ```swift title="hash_map_chaining.swift" - [class]{HashMapChaining}-[func]{} - ``` - -=== "JS" - - ```javascript title="hash_map_chaining.js" - [class]{HashMapChaining}-[func]{} - ``` - -=== "TS" - - ```typescript title="hash_map_chaining.ts" - [class]{HashMapChaining}-[func]{} - ``` - -=== "Dart" - - ```dart title="hash_map_chaining.dart" - [class]{HashMapChaining}-[func]{} - ``` - -=== "Rust" - - ```rust title="hash_map_chaining.rs" - [class]{HashMapChaining}-[func]{} - ``` - -=== "C" - - ```c title="hash_map_chaining.c" - [class]{node}-[func]{} - - [class]{hashMapChaining}-[func]{} - ``` - -=== "Zig" - - ```zig title="hash_map_chaining.zig" - [class]{HashMapChaining}-[func]{} - ``` +```src +[file]{hash_map_chaining}-[class]{hash_map_chaining}-[func]{} +``` 值得注意的是,当链表很长时,查询效率 $O(n)$ 很差。**此时可以将链表转换为“AVL 树”或“红黑树”**,从而将查询操作的时间复杂度优化至 $O(\log n)$ 。 @@ -138,77 +68,9 @@ 以下代码实现了一个包含懒删除的开放寻址(线性探测)哈希表。为了更加充分地使用哈希表的空间,我们将哈希表看作是一个“环形数组”,当越过数组尾部时,回到头部继续遍历。 -=== "Python" - - ```python title="hash_map_open_addressing.py" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "C++" - - ```cpp title="hash_map_open_addressing.cpp" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "Java" - - ```java title="hash_map_open_addressing.java" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "C#" - - ```csharp title="hash_map_open_addressing.cs" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "Go" - - ```go title="hash_map_open_addressing.go" - [class]{hashMapOpenAddressing}-[func]{} - ``` - -=== "Swift" - - ```swift title="hash_map_open_addressing.swift" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "JS" - - ```javascript title="hash_map_open_addressing.js" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "TS" - - ```typescript title="hash_map_open_addressing.ts" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "Dart" - - ```dart title="hash_map_open_addressing.dart" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "Rust" - - ```rust title="hash_map_open_addressing.rs" - [class]{HashMapOpenAddressing}-[func]{} - ``` - -=== "C" - - ```c title="hash_map_open_addressing.c" - [class]{hashMapOpenAddressing}-[func]{} - ``` - -=== "Zig" - - ```zig title="hash_map_open_addressing.zig" - [class]{HashMapOpenAddressing}-[func]{} - ``` +```src +[file]{hash_map_open_addressing}-[class]{hash_map_open_addressing}-[func]{} +``` ### 平方探测 diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index 8ae249e31..666ae508e 100755 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -491,110 +491,9 @@ index = hash(key) % capacity 以下代码实现了一个简单哈希表。其中,我们将 `key` 和 `value` 封装成一个类 `Pair` ,以表示键值对。 -=== "Python" - - ```python title="array_hash_map.py" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "C++" - - ```cpp title="array_hash_map.cpp" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "Java" - - ```java title="array_hash_map.java" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "C#" - - ```csharp title="array_hash_map.cs" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "Go" - - ```go title="array_hash_map.go" - [class]{pair}-[func]{} - - [class]{arrayHashMap}-[func]{} - ``` - -=== "Swift" - - ```swift title="array_hash_map.swift" - /* 键值对 */ - class Pair { - var key: Int - var val: String - - init(key: Int, val: String) { - self.key = key - self.val = val - } - } - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "JS" - - ```javascript title="array_hash_map.js" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "TS" - - ```typescript title="array_hash_map.ts" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "Dart" - - ```dart title="array_hash_map.dart" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "Rust" - - ```rust title="array_hash_map.rs" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` - -=== "C" - - ```c title="array_hash_map.c" - [class]{pair}-[func]{} - - [class]{arrayHashMap}-[func]{} - ``` - -=== "Zig" - - ```zig title="array_hash_map.zig" - [class]{Pair}-[func]{} - - [class]{ArrayHashMap}-[func]{} - ``` +```src +[file]{array_hash_map}-[class]{array_hash_map}-[func]{} +``` ## 哈希冲突与扩容 diff --git a/docs/chapter_heap/build_heap.md b/docs/chapter_heap/build_heap.md index 75222aebb..1b08830e8 100644 --- a/docs/chapter_heap/build_heap.md +++ b/docs/chapter_heap/build_heap.md @@ -23,77 +23,9 @@ 值得说明的是,**叶节点没有子节点,天然就是合法的子堆,因此无需堆化**。如以下代码所示,最后一个非叶节点是最后一个节点的父节点,我们从它开始倒序遍历并执行堆化。 -=== "Python" - - ```python title="my_heap.py" - [class]{MaxHeap}-[func]{__init__} - ``` - -=== "C++" - - ```cpp title="my_heap.cpp" - [class]{MaxHeap}-[func]{MaxHeap} - ``` - -=== "Java" - - ```java title="my_heap.java" - [class]{MaxHeap}-[func]{MaxHeap} - ``` - -=== "C#" - - ```csharp title="my_heap.cs" - [class]{MaxHeap}-[func]{MaxHeap} - ``` - -=== "Go" - - ```go title="my_heap.go" - [class]{maxHeap}-[func]{newMaxHeap} - ``` - -=== "Swift" - - ```swift title="my_heap.swift" - [class]{MaxHeap}-[func]{init} - ``` - -=== "JS" - - ```javascript title="my_heap.js" - [class]{MaxHeap}-[func]{constructor} - ``` - -=== "TS" - - ```typescript title="my_heap.ts" - [class]{MaxHeap}-[func]{constructor} - ``` - -=== "Dart" - - ```dart title="my_heap.dart" - [class]{MaxHeap}-[func]{MaxHeap} - ``` - -=== "Rust" - - ```rust title="my_heap.rs" - [class]{MaxHeap}-[func]{new} - ``` - -=== "C" - - ```c title="my_heap.c" - [class]{maxHeap}-[func]{newMaxHeap} - ``` - -=== "Zig" - - ```zig title="my_heap.zig" - [class]{MaxHeap}-[func]{init} - ``` +```src +[file]{my_heap}-[class]{max_heap}-[func]{__init__} +``` ## 复杂度分析 diff --git a/docs/chapter_heap/heap.md b/docs/chapter_heap/heap.md index bfaaf4eab..6bda1e378 100644 --- a/docs/chapter_heap/heap.md +++ b/docs/chapter_heap/heap.md @@ -361,201 +361,17 @@ 我们可以将索引映射公式封装成函数,方便后续使用。 -=== "Python" - - ```python title="my_heap.py" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "C++" - - ```cpp title="my_heap.cpp" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "Java" - - ```java title="my_heap.java" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "C#" - - ```csharp title="my_heap.cs" - [class]{MaxHeap}-[func]{Left} - - [class]{MaxHeap}-[func]{Right} - - [class]{MaxHeap}-[func]{Parent} - ``` - -=== "Go" - - ```go title="my_heap.go" - [class]{maxHeap}-[func]{left} - - [class]{maxHeap}-[func]{right} - - [class]{maxHeap}-[func]{parent} - ``` - -=== "Swift" - - ```swift title="my_heap.swift" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "JS" - - ```javascript title="my_heap.js" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "TS" - - ```typescript title="my_heap.ts" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "Dart" - - ```dart title="my_heap.dart" - [class]{MaxHeap}-[func]{_left} - - [class]{MaxHeap}-[func]{_right} - - [class]{MaxHeap}-[func]{_parent} - ``` - -=== "Rust" - - ```rust title="my_heap.rs" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` - -=== "C" - - ```c title="my_heap.c" - [class]{maxHeap}-[func]{left} - - [class]{maxHeap}-[func]{right} - - [class]{maxHeap}-[func]{parent} - ``` - -=== "Zig" - - ```zig title="my_heap.zig" - [class]{MaxHeap}-[func]{left} - - [class]{MaxHeap}-[func]{right} - - [class]{MaxHeap}-[func]{parent} - ``` +```src +[file]{my_heap}-[class]{max_heap}-[func]{parent} +``` ### 访问堆顶元素 堆顶元素即为二叉树的根节点,也就是列表的首个元素。 -=== "Python" - - ```python title="my_heap.py" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "C++" - - ```cpp title="my_heap.cpp" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "Java" - - ```java title="my_heap.java" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "C#" - - ```csharp title="my_heap.cs" - [class]{MaxHeap}-[func]{Peek} - ``` - -=== "Go" - - ```go title="my_heap.go" - [class]{maxHeap}-[func]{peek} - ``` - -=== "Swift" - - ```swift title="my_heap.swift" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "JS" - - ```javascript title="my_heap.js" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "TS" - - ```typescript title="my_heap.ts" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "Dart" - - ```dart title="my_heap.dart" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "Rust" - - ```rust title="my_heap.rs" - [class]{MaxHeap}-[func]{peek} - ``` - -=== "C" - - ```c title="my_heap.c" - [class]{maxHeap}-[func]{peek} - ``` - -=== "Zig" - - ```zig title="my_heap.zig" - [class]{MaxHeap}-[func]{peek} - ``` +```src +[file]{my_heap}-[class]{max_heap}-[func]{peek} +``` ### 元素入堆 @@ -592,101 +408,9 @@ 设节点总数为 $n$ ,则树的高度为 $O(\log n)$ 。由此可知,堆化操作的循环轮数最多为 $O(\log n)$ ,**元素入堆操作的时间复杂度为 $O(\log n)$** 。 -=== "Python" - - ```python title="my_heap.py" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{sift_up} - ``` - -=== "C++" - - ```cpp title="my_heap.cpp" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "Java" - - ```java title="my_heap.java" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "C#" - - ```csharp title="my_heap.cs" - [class]{MaxHeap}-[func]{Push} - - [class]{MaxHeap}-[func]{SiftUp} - ``` - -=== "Go" - - ```go title="my_heap.go" - [class]{maxHeap}-[func]{push} - - [class]{maxHeap}-[func]{siftUp} - ``` - -=== "Swift" - - ```swift title="my_heap.swift" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "JS" - - ```javascript title="my_heap.js" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "TS" - - ```typescript title="my_heap.ts" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "Dart" - - ```dart title="my_heap.dart" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` - -=== "Rust" - - ```rust title="my_heap.rs" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{sift_up} - ``` - -=== "C" - - ```c title="my_heap.c" - [class]{maxHeap}-[func]{push} - - [class]{maxHeap}-[func]{siftUp} - ``` - -=== "Zig" - - ```zig title="my_heap.zig" - [class]{MaxHeap}-[func]{push} - - [class]{MaxHeap}-[func]{siftUp} - ``` +```src +[file]{my_heap}-[class]{max_heap}-[func]{sift_up} +``` ### 堆顶元素出堆 @@ -730,101 +454,9 @@ 与元素入堆操作相似,堆顶元素出堆操作的时间复杂度也为 $O(\log n)$ 。 -=== "Python" - - ```python title="my_heap.py" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{sift_down} - ``` - -=== "C++" - - ```cpp title="my_heap.cpp" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "Java" - - ```java title="my_heap.java" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "C#" - - ```csharp title="my_heap.cs" - [class]{MaxHeap}-[func]{Pop} - - [class]{MaxHeap}-[func]{SiftDown} - ``` - -=== "Go" - - ```go title="my_heap.go" - [class]{maxHeap}-[func]{pop} - - [class]{maxHeap}-[func]{siftDown} - ``` - -=== "Swift" - - ```swift title="my_heap.swift" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "JS" - - ```javascript title="my_heap.js" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "TS" - - ```typescript title="my_heap.ts" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "Dart" - - ```dart title="my_heap.dart" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` - -=== "Rust" - - ```rust title="my_heap.rs" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{sift_down} - ``` - -=== "C" - - ```c title="my_heap.c" - [class]{maxHeap}-[func]{pop} - - [class]{maxHeap}-[func]{siftDown} - ``` - -=== "Zig" - - ```zig title="my_heap.zig" - [class]{MaxHeap}-[func]{pop} - - [class]{MaxHeap}-[func]{siftDown} - ``` +```src +[file]{my_heap}-[class]{max_heap}-[func]{sift_down} +``` ## 堆常见应用 diff --git a/docs/chapter_heap/top_k.md b/docs/chapter_heap/top_k.md index 34a28d765..af352fe6b 100644 --- a/docs/chapter_heap/top_k.md +++ b/docs/chapter_heap/top_k.md @@ -66,74 +66,6 @@ 另外,该方法适用于动态数据流的使用场景。在不断加入数据时,我们可以持续维护堆内的元素,从而实现最大 $k$ 个元素的动态更新。 -=== "Python" - - ```python title="top_k.py" - [class]{}-[func]{top_k_heap} - ``` - -=== "C++" - - ```cpp title="top_k.cpp" - [class]{}-[func]{topKHeap} - ``` - -=== "Java" - - ```java title="top_k.java" - [class]{top_k}-[func]{topKHeap} - ``` - -=== "C#" - - ```csharp title="top_k.cs" - [class]{top_k}-[func]{TopKHeap} - ``` - -=== "Go" - - ```go title="top_k.go" - [class]{}-[func]{topKHeap} - ``` - -=== "Swift" - - ```swift title="top_k.swift" - [class]{}-[func]{topKHeap} - ``` - -=== "JS" - - ```javascript title="top_k.js" - [class]{}-[func]{topKHeap} - ``` - -=== "TS" - - ```typescript title="top_k.ts" - [class]{}-[func]{topKHeap} - ``` - -=== "Dart" - - ```dart title="top_k.dart" - [class]{}-[func]{topKHeap} - ``` - -=== "Rust" - - ```rust title="top_k.rs" - [class]{}-[func]{top_k_heap} - ``` - -=== "C" - - ```c title="top_k.c" - [class]{}-[func]{topKHeap} - ``` - -=== "Zig" - - ```zig title="top_k.zig" - [class]{}-[func]{topKHeap} - ``` +```src +[file]{top_k}-[class]{}-[func]{top_k_heap} +``` diff --git a/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.jpg b/docs/chapter_preface/about_the_book.assets/hello_algo_mindmap.jpg index 2c379e27c43b6d355de9caadd89e0fe35cab0bae..9b0727f47f1daa45f38f01c67c23fbcb42d87f71 100644 GIT binary patch literal 164629 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

Tt{HJH94(jJ4*6yJ66E5y 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 z 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 TS|ktc$ShE0dsl$v+vtA-peq;G literal 161136 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 diff --git a/docs/chapter_searching/binary_search.md b/docs/chapter_searching/binary_search.md index d6291ffad..7f6f3cd91 100755 --- a/docs/chapter_searching/binary_search.md +++ b/docs/chapter_searching/binary_search.md @@ -43,77 +43,9 @@ 值得注意的是,由于 $i$ 和 $j$ 都是 `int` 类型,**因此 $i + j$ 可能会超出 `int` 类型的取值范围**。为了避免大数越界,我们通常采用公式 $m = \lfloor {i + (j - i) / 2} \rfloor$ 来计算中点。 -=== "Python" - - ```python title="binary_search.py" - [class]{}-[func]{binary_search} - ``` - -=== "C++" - - ```cpp title="binary_search.cpp" - [class]{}-[func]{binarySearch} - ``` - -=== "Java" - - ```java title="binary_search.java" - [class]{binary_search}-[func]{binarySearch} - ``` - -=== "C#" - - ```csharp title="binary_search.cs" - [class]{binary_search}-[func]{BinarySearch} - ``` - -=== "Go" - - ```go title="binary_search.go" - [class]{}-[func]{binarySearch} - ``` - -=== "Swift" - - ```swift title="binary_search.swift" - [class]{}-[func]{binarySearch} - ``` - -=== "JS" - - ```javascript title="binary_search.js" - [class]{}-[func]{binarySearch} - ``` - -=== "TS" - - ```typescript title="binary_search.ts" - [class]{}-[func]{binarySearch} - ``` - -=== "Dart" - - ```dart title="binary_search.dart" - [class]{}-[func]{binarySearch} - ``` - -=== "Rust" - - ```rust title="binary_search.rs" - [class]{}-[func]{binary_search} - ``` - -=== "C" - - ```c title="binary_search.c" - [class]{}-[func]{binarySearch} - ``` - -=== "Zig" - - ```zig title="binary_search.zig" - [class]{}-[func]{binarySearch} - ``` +```src +[file]{binary_search}-[class]{}-[func]{binary_search} +``` **时间复杂度 $O(\log n)$** :在二分循环中,区间每轮缩小一半,循环次数为 $\log_2 n$ 。 @@ -125,77 +57,9 @@ 我们可以基于该表示实现具有相同功能的二分查找算法。 -=== "Python" - - ```python title="binary_search.py" - [class]{}-[func]{binary_search_lcro} - ``` - -=== "C++" - - ```cpp title="binary_search.cpp" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "Java" - - ```java title="binary_search.java" - [class]{binary_search}-[func]{binarySearchLCRO} - ``` - -=== "C#" - - ```csharp title="binary_search.cs" - [class]{binary_search}-[func]{BinarySearchLCRO} - ``` - -=== "Go" - - ```go title="binary_search.go" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "Swift" - - ```swift title="binary_search.swift" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "JS" - - ```javascript title="binary_search.js" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "TS" - - ```typescript title="binary_search.ts" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "Dart" - - ```dart title="binary_search.dart" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "Rust" - - ```rust title="binary_search.rs" - [class]{}-[func]{binary_search_lcro} - ``` - -=== "C" - - ```c title="binary_search.c" - [class]{}-[func]{binarySearchLCRO} - ``` - -=== "Zig" - - ```zig title="binary_search.zig" - [class]{}-[func]{binarySearchLCRO} - ``` +```src +[file]{binary_search}-[class]{}-[func]{binary_search_lcro} +``` 如下图所示,在两种区间表示下,二分查找算法的初始化、循环条件和缩小区间操作皆有所不同。 diff --git a/docs/chapter_searching/binary_search_edge.md b/docs/chapter_searching/binary_search_edge.md index 7e2c995b3..039c9c983 100644 --- a/docs/chapter_searching/binary_search_edge.md +++ b/docs/chapter_searching/binary_search_edge.md @@ -15,77 +15,9 @@ 当遇到以上两种情况时,直接返回 $-1$ 即可。 -=== "Python" - - ```python title="binary_search_edge.py" - [class]{}-[func]{binary_search_left_edge} - ``` - -=== "C++" - - ```cpp title="binary_search_edge.cpp" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "Java" - - ```java title="binary_search_edge.java" - [class]{binary_search_edge}-[func]{binarySearchLeftEdge} - ``` - -=== "C#" - - ```csharp title="binary_search_edge.cs" - [class]{binary_search_edge}-[func]{BinarySearchLeftEdge} - ``` - -=== "Go" - - ```go title="binary_search_edge.go" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "Swift" - - ```swift title="binary_search_edge.swift" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "JS" - - ```javascript title="binary_search_edge.js" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "TS" - - ```typescript title="binary_search_edge.ts" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "Dart" - - ```dart title="binary_search_edge.dart" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "Rust" - - ```rust title="binary_search_edge.rs" - [class]{}-[func]{binary_search_left_edge} - ``` - -=== "C" - - ```c title="binary_search_edge.c" - [class]{}-[func]{binarySearchLeftEdge} - ``` - -=== "Zig" - - ```zig title="binary_search_edge.zig" - [class]{}-[func]{binarySearchLeftEdge} - ``` +```src +[file]{binary_search_edge}-[class]{}-[func]{binary_search_left_edge} +``` ## 查找右边界 @@ -103,77 +35,9 @@ 请注意,返回的插入点是 $i$ ,因此需要将其减 $1$ ,从而获得 $j$ 。 -=== "Python" - - ```python title="binary_search_edge.py" - [class]{}-[func]{binary_search_right_edge} - ``` - -=== "C++" - - ```cpp title="binary_search_edge.cpp" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "Java" - - ```java title="binary_search_edge.java" - [class]{binary_search_edge}-[func]{binarySearchRightEdge} - ``` - -=== "C#" - - ```csharp title="binary_search_edge.cs" - [class]{binary_search_edge}-[func]{BinarySearchRightEdge} - ``` - -=== "Go" - - ```go title="binary_search_edge.go" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "Swift" - - ```swift title="binary_search_edge.swift" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "JS" - - ```javascript title="binary_search_edge.js" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "TS" - - ```typescript title="binary_search_edge.ts" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "Dart" - - ```dart title="binary_search_edge.dart" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "Rust" - - ```rust title="binary_search_edge.rs" - [class]{}-[func]{binary_search_right_edge} - ``` - -=== "C" - - ```c title="binary_search_edge.c" - [class]{}-[func]{binarySearchRightEdge} - ``` - -=== "Zig" - - ```zig title="binary_search_edge.zig" - [class]{}-[func]{binarySearchRightEdge} - ``` +```src +[file]{binary_search_edge}-[class]{}-[func]{binary_search_right_edge} +``` ### 转化为查找元素 diff --git a/docs/chapter_searching/binary_search_insertion.md b/docs/chapter_searching/binary_search_insertion.md index 74f17e7b3..c5ed11e56 100644 --- a/docs/chapter_searching/binary_search_insertion.md +++ b/docs/chapter_searching/binary_search_insertion.md @@ -22,77 +22,9 @@ 因此二分结束时一定有:$i$ 指向首个大于 `target` 的元素,$j$ 指向首个小于 `target` 的元素。**易得当数组不包含 `target` 时,插入索引为 $i$** 。 -=== "Python" - - ```python title="binary_search_insertion.py" - [class]{}-[func]{binary_search_insertion_simple} - ``` - -=== "C++" - - ```cpp title="binary_search_insertion.cpp" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "Java" - - ```java title="binary_search_insertion.java" - [class]{binary_search_insertion}-[func]{binarySearchInsertionSimple} - ``` - -=== "C#" - - ```csharp title="binary_search_insertion.cs" - [class]{binary_search_insertion}-[func]{BinarySearchInsertionSimple} - ``` - -=== "Go" - - ```go title="binary_search_insertion.go" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "Swift" - - ```swift title="binary_search_insertion.swift" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "JS" - - ```javascript title="binary_search_insertion.js" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "TS" - - ```typescript title="binary_search_insertion.ts" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "Dart" - - ```dart title="binary_search_insertion.dart" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "Rust" - - ```rust title="binary_search_insertion.rs" - [class]{}-[func]{binary_search_insertion} - ``` - -=== "C" - - ```c title="binary_search_insertion.c" - [class]{}-[func]{binarySearchInsertionSimple} - ``` - -=== "Zig" - - ```zig title="binary_search_insertion.zig" - [class]{}-[func]{binarySearchInsertionSimple} - ``` +```src +[file]{binary_search_insertion}-[class]{}-[func]{binary_search_insertion_simple} +``` ## 存在重复元素的情况 @@ -146,77 +78,9 @@ 即便如此,我们仍然可以将判断条件保持展开,因为其逻辑更加清晰、可读性更好。 -=== "Python" - - ```python title="binary_search_insertion.py" - [class]{}-[func]{binary_search_insertion} - ``` - -=== "C++" - - ```cpp title="binary_search_insertion.cpp" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "Java" - - ```java title="binary_search_insertion.java" - [class]{binary_search_insertion}-[func]{binarySearchInsertion} - ``` - -=== "C#" - - ```csharp title="binary_search_insertion.cs" - [class]{binary_search_insertion}-[func]{BinarySearchInsertion} - ``` - -=== "Go" - - ```go title="binary_search_insertion.go" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "Swift" - - ```swift title="binary_search_insertion.swift" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "JS" - - ```javascript title="binary_search_insertion.js" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "TS" - - ```typescript title="binary_search_insertion.ts" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "Dart" - - ```dart title="binary_search_insertion.dart" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "Rust" - - ```rust title="binary_search_insertion.rs" - [class]{}-[func]{binary_search_insertion} - ``` - -=== "C" - - ```c title="binary_search_insertion.c" - [class]{}-[func]{binarySearchInsertion} - ``` - -=== "Zig" - - ```zig title="binary_search_insertion.zig" - [class]{}-[func]{binarySearchInsertion} - ``` +```src +[file]{binary_search_insertion}-[class]{}-[func]{binary_search_insertion} +``` !!! tip diff --git a/docs/chapter_searching/replace_linear_by_hashing.md b/docs/chapter_searching/replace_linear_by_hashing.md index 439bd66f0..180f0d350 100755 --- a/docs/chapter_searching/replace_linear_by_hashing.md +++ b/docs/chapter_searching/replace_linear_by_hashing.md @@ -12,77 +12,9 @@ ![线性查找求解两数之和](replace_linear_by_hashing.assets/two_sum_brute_force.png) -=== "Python" - - ```python title="two_sum.py" - [class]{}-[func]{two_sum_brute_force} - ``` - -=== "C++" - - ```cpp title="two_sum.cpp" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "Java" - - ```java title="two_sum.java" - [class]{two_sum}-[func]{twoSumBruteForce} - ``` - -=== "C#" - - ```csharp title="two_sum.cs" - [class]{two_sum}-[func]{TwoSumBruteForce} - ``` - -=== "Go" - - ```go title="two_sum.go" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "Swift" - - ```swift title="two_sum.swift" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "JS" - - ```javascript title="two_sum.js" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "TS" - - ```typescript title="two_sum.ts" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "Dart" - - ```dart title="two_sum.dart" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "Rust" - - ```rust title="two_sum.rs" - [class]{}-[func]{two_sum_brute_force} - ``` - -=== "C" - - ```c title="two_sum.c" - [class]{}-[func]{twoSumBruteForce} - ``` - -=== "Zig" - - ```zig title="two_sum.zig" - [class]{}-[func]{twoSumBruteForce} - ``` +```src +[file]{two_sum}-[class]{}-[func]{two_sum_brute_force} +``` 此方法的时间复杂度为 $O(n^2)$ ,空间复杂度为 $O(1)$ ,在大数据量下非常耗时。 @@ -104,79 +36,9 @@ 实现代码如下所示,仅需单层循环即可。 -=== "Python" - - ```python title="two_sum.py" - [class]{}-[func]{two_sum_hash_table} - ``` - -=== "C++" - - ```cpp title="two_sum.cpp" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "Java" - - ```java title="two_sum.java" - [class]{two_sum}-[func]{twoSumHashTable} - ``` - -=== "C#" - - ```csharp title="two_sum.cs" - [class]{two_sum}-[func]{TwoSumHashTable} - ``` - -=== "Go" - - ```go title="two_sum.go" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "Swift" - - ```swift title="two_sum.swift" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "JS" - - ```javascript title="two_sum.js" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "TS" - - ```typescript title="two_sum.ts" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "Dart" - - ```dart title="two_sum.dart" - [class]{}-[func]{twoSumHashTable} - ``` - -=== "Rust" - - ```rust title="two_sum.rs" - [class]{}-[func]{two_sum_hash_table} - ``` - -=== "C" - - ```c title="two_sum.c" - [class]{hashTable}-[func]{} - - [class]{}-[func]{twoSumHashTable} - ``` - -=== "Zig" - - ```zig title="two_sum.zig" - [class]{}-[func]{twoSumHashTable} - ``` +```src +[file]{two_sum}-[class]{}-[func]{two_sum_hash_table} +``` 此方法通过哈希查找将时间复杂度从 $O(n^2)$ 降低至 $O(n)$ ,大幅提升运行效率。 diff --git a/docs/chapter_sorting/bubble_sort.md b/docs/chapter_sorting/bubble_sort.md index 2d4bfb25d..63d631f4b 100755 --- a/docs/chapter_sorting/bubble_sort.md +++ b/docs/chapter_sorting/bubble_sort.md @@ -36,77 +36,9 @@ ![冒泡排序流程](bubble_sort.assets/bubble_sort_overview.png) -=== "Python" - - ```python title="bubble_sort.py" - [class]{}-[func]{bubble_sort} - ``` - -=== "C++" - - ```cpp title="bubble_sort.cpp" - [class]{}-[func]{bubbleSort} - ``` - -=== "Java" - - ```java title="bubble_sort.java" - [class]{bubble_sort}-[func]{bubbleSort} - ``` - -=== "C#" - - ```csharp title="bubble_sort.cs" - [class]{bubble_sort}-[func]{BubbleSort} - ``` - -=== "Go" - - ```go title="bubble_sort.go" - [class]{}-[func]{bubbleSort} - ``` - -=== "Swift" - - ```swift title="bubble_sort.swift" - [class]{}-[func]{bubbleSort} - ``` - -=== "JS" - - ```javascript title="bubble_sort.js" - [class]{}-[func]{bubbleSort} - ``` - -=== "TS" - - ```typescript title="bubble_sort.ts" - [class]{}-[func]{bubbleSort} - ``` - -=== "Dart" - - ```dart title="bubble_sort.dart" - [class]{}-[func]{bubbleSort} - ``` - -=== "Rust" - - ```rust title="bubble_sort.rs" - [class]{}-[func]{bubble_sort} - ``` - -=== "C" - - ```c title="bubble_sort.c" - [class]{}-[func]{bubbleSort} - ``` - -=== "Zig" - - ```zig title="bubble_sort.zig" - [class]{}-[func]{bubbleSort} - ``` +```src +[file]{bubble_sort}-[class]{}-[func]{bubble_sort} +``` ## 效率优化 @@ -114,77 +46,9 @@ 经过优化,冒泡排序的最差和平均时间复杂度仍为 $O(n^2)$ ;但当输入数组完全有序时,可达到最佳时间复杂度 $O(n)$ 。 -=== "Python" - - ```python title="bubble_sort.py" - [class]{}-[func]{bubble_sort_with_flag} - ``` - -=== "C++" - - ```cpp title="bubble_sort.cpp" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "Java" - - ```java title="bubble_sort.java" - [class]{bubble_sort}-[func]{bubbleSortWithFlag} - ``` - -=== "C#" - - ```csharp title="bubble_sort.cs" - [class]{bubble_sort}-[func]{BubbleSortWithFlag} - ``` - -=== "Go" - - ```go title="bubble_sort.go" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "Swift" - - ```swift title="bubble_sort.swift" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "JS" - - ```javascript title="bubble_sort.js" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "TS" - - ```typescript title="bubble_sort.ts" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "Dart" - - ```dart title="bubble_sort.dart" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "Rust" - - ```rust title="bubble_sort.rs" - [class]{}-[func]{bubble_sort_with_flag} - ``` - -=== "C" - - ```c title="bubble_sort.c" - [class]{}-[func]{bubbleSortWithFlag} - ``` - -=== "Zig" - - ```zig title="bubble_sort.zig" - [class]{}-[func]{bubbleSortWithFlag} - ``` +```src +[file]{bubble_sort}-[class]{}-[func]{bubble_sort_with_flag} +``` ## 算法特性 diff --git a/docs/chapter_sorting/bucket_sort.md b/docs/chapter_sorting/bucket_sort.md index c8992f348..bbba2e378 100644 --- a/docs/chapter_sorting/bucket_sort.md +++ b/docs/chapter_sorting/bucket_sort.md @@ -14,77 +14,9 @@ ![桶排序算法流程](bucket_sort.assets/bucket_sort_overview.png) -=== "Python" - - ```python title="bucket_sort.py" - [class]{}-[func]{bucket_sort} - ``` - -=== "C++" - - ```cpp title="bucket_sort.cpp" - [class]{}-[func]{bucketSort} - ``` - -=== "Java" - - ```java title="bucket_sort.java" - [class]{bucket_sort}-[func]{bucketSort} - ``` - -=== "C#" - - ```csharp title="bucket_sort.cs" - [class]{bucket_sort}-[func]{BucketSort} - ``` - -=== "Go" - - ```go title="bucket_sort.go" - [class]{}-[func]{bucketSort} - ``` - -=== "Swift" - - ```swift title="bucket_sort.swift" - [class]{}-[func]{bucketSort} - ``` - -=== "JS" - - ```javascript title="bucket_sort.js" - [class]{}-[func]{bucketSort} - ``` - -=== "TS" - - ```typescript title="bucket_sort.ts" - [class]{}-[func]{bucketSort} - ``` - -=== "Dart" - - ```dart title="bucket_sort.dart" - [class]{}-[func]{bucketSort} - ``` - -=== "Rust" - - ```rust title="bucket_sort.rs" - [class]{}-[func]{bucket_sort} - ``` - -=== "C" - - ```c title="bucket_sort.c" - [class]{}-[func]{bucketSort} - ``` - -=== "Zig" - - ```zig title="bucket_sort.zig" - [class]{}-[func]{bucketSort} - ``` +```src +[file]{bucket_sort}-[class]{}-[func]{bucket_sort} +``` ## 算法特性 diff --git a/docs/chapter_sorting/counting_sort.md b/docs/chapter_sorting/counting_sort.md index 704bf9eec..9dd83f5e9 100644 --- a/docs/chapter_sorting/counting_sort.md +++ b/docs/chapter_sorting/counting_sort.md @@ -12,77 +12,9 @@ ![计数排序流程](counting_sort.assets/counting_sort_overview.png) -=== "Python" - - ```python title="counting_sort.py" - [class]{}-[func]{counting_sort_naive} - ``` - -=== "C++" - - ```cpp title="counting_sort.cpp" - [class]{}-[func]{countingSortNaive} - ``` - -=== "Java" - - ```java title="counting_sort.java" - [class]{counting_sort}-[func]{countingSortNaive} - ``` - -=== "C#" - - ```csharp title="counting_sort.cs" - [class]{counting_sort}-[func]{CountingSortNaive} - ``` - -=== "Go" - - ```go title="counting_sort.go" - [class]{}-[func]{countingSortNaive} - ``` - -=== "Swift" - - ```swift title="counting_sort.swift" - [class]{}-[func]{countingSortNaive} - ``` - -=== "JS" - - ```javascript title="counting_sort.js" - [class]{}-[func]{countingSortNaive} - ``` - -=== "TS" - - ```typescript title="counting_sort.ts" - [class]{}-[func]{countingSortNaive} - ``` - -=== "Dart" - - ```dart title="counting_sort.dart" - [class]{}-[func]{countingSortNaive} - ``` - -=== "Rust" - - ```rust title="counting_sort.rs" - [class]{}-[func]{counting_sort_naive} - ``` - -=== "C" - - ```c title="counting_sort.c" - [class]{}-[func]{countingSortNaive} - ``` - -=== "Zig" - - ```zig title="counting_sort.zig" - [class]{}-[func]{countingSortNaive} - ``` +```src +[file]{counting_sort}-[class]{}-[func]{counting_sort_naive} +``` !!! note "计数排序与桶排序的联系" @@ -131,77 +63,9 @@ $$ 计数排序的实现代码如下所示。 -=== "Python" - - ```python title="counting_sort.py" - [class]{}-[func]{counting_sort} - ``` - -=== "C++" - - ```cpp title="counting_sort.cpp" - [class]{}-[func]{countingSort} - ``` - -=== "Java" - - ```java title="counting_sort.java" - [class]{counting_sort}-[func]{countingSort} - ``` - -=== "C#" - - ```csharp title="counting_sort.cs" - [class]{counting_sort}-[func]{CountingSort} - ``` - -=== "Go" - - ```go title="counting_sort.go" - [class]{}-[func]{countingSort} - ``` - -=== "Swift" - - ```swift title="counting_sort.swift" - [class]{}-[func]{countingSort} - ``` - -=== "JS" - - ```javascript title="counting_sort.js" - [class]{}-[func]{countingSort} - ``` - -=== "TS" - - ```typescript title="counting_sort.ts" - [class]{}-[func]{countingSort} - ``` - -=== "Dart" - - ```dart title="counting_sort.dart" - [class]{}-[func]{countingSort} - ``` - -=== "Rust" - - ```rust title="counting_sort.rs" - [class]{}-[func]{counting_sort} - ``` - -=== "C" - - ```c title="counting_sort.c" - [class]{}-[func]{countingSort} - ``` - -=== "Zig" - - ```zig title="counting_sort.zig" - [class]{}-[func]{countingSort} - ``` +```src +[file]{counting_sort}-[class]{}-[func]{counting_sort} +``` ## 算法特性 diff --git a/docs/chapter_sorting/heap_sort.md b/docs/chapter_sorting/heap_sort.md index 88ee0cc18..aa6bbeaaa 100644 --- a/docs/chapter_sorting/heap_sort.md +++ b/docs/chapter_sorting/heap_sort.md @@ -62,101 +62,9 @@ 在代码实现中,我们使用了与堆章节相同的从顶至底堆化 `sift_down()` 函数。值得注意的是,由于堆的长度会随着提取最大元素而减小,因此我们需要给 `sift_down()` 函数添加一个长度参数 $n$ ,用于指定堆的当前有效长度。 -=== "Python" - - ```python title="heap_sort.py" - [class]{}-[func]{sift_down} - - [class]{}-[func]{heap_sort} - ``` - -=== "C++" - - ```cpp title="heap_sort.cpp" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "Java" - - ```java title="heap_sort.java" - [class]{heap_sort}-[func]{siftDown} - - [class]{heap_sort}-[func]{heapSort} - ``` - -=== "C#" - - ```csharp title="heap_sort.cs" - [class]{heap_sort}-[func]{SiftDown} - - [class]{heap_sort}-[func]{HeapSort} - ``` - -=== "Go" - - ```go title="heap_sort.go" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "Swift" - - ```swift title="heap_sort.swift" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "JS" - - ```javascript title="heap_sort.js" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "TS" - - ```typescript title="heap_sort.ts" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "Dart" - - ```dart title="heap_sort.dart" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "Rust" - - ```rust title="heap_sort.rs" - [class]{}-[func]{sift_down} - - [class]{}-[func]{heap_sort} - ``` - -=== "C" - - ```c title="heap_sort.c" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` - -=== "Zig" - - ```zig title="heap_sort.zig" - [class]{}-[func]{siftDown} - - [class]{}-[func]{heapSort} - ``` +```src +[file]{heap_sort}-[class]{}-[func]{heap_sort} +``` ## 算法特性 diff --git a/docs/chapter_sorting/insertion_sort.md b/docs/chapter_sorting/insertion_sort.md index da0956d44..4de9841e8 100755 --- a/docs/chapter_sorting/insertion_sort.md +++ b/docs/chapter_sorting/insertion_sort.md @@ -19,77 +19,9 @@ ![插入排序流程](insertion_sort.assets/insertion_sort_overview.png) -=== "Python" - - ```python title="insertion_sort.py" - [class]{}-[func]{insertion_sort} - ``` - -=== "C++" - - ```cpp title="insertion_sort.cpp" - [class]{}-[func]{insertionSort} - ``` - -=== "Java" - - ```java title="insertion_sort.java" - [class]{insertion_sort}-[func]{insertionSort} - ``` - -=== "C#" - - ```csharp title="insertion_sort.cs" - [class]{insertion_sort}-[func]{InsertionSort} - ``` - -=== "Go" - - ```go title="insertion_sort.go" - [class]{}-[func]{insertionSort} - ``` - -=== "Swift" - - ```swift title="insertion_sort.swift" - [class]{}-[func]{insertionSort} - ``` - -=== "JS" - - ```javascript title="insertion_sort.js" - [class]{}-[func]{insertionSort} - ``` - -=== "TS" - - ```typescript title="insertion_sort.ts" - [class]{}-[func]{insertionSort} - ``` - -=== "Dart" - - ```dart title="insertion_sort.dart" - [class]{}-[func]{insertionSort} - ``` - -=== "Rust" - - ```rust title="insertion_sort.rs" - [class]{}-[func]{insertion_sort} - ``` - -=== "C" - - ```c title="insertion_sort.c" - [class]{}-[func]{insertionSort} - ``` - -=== "Zig" - - ```zig title="insertion_sort.zig" - [class]{}-[func]{insertionSort} - ``` +```src +[file]{insertion_sort}-[class]{}-[func]{insertion_sort} +``` ## 算法特性 diff --git a/docs/chapter_sorting/merge_sort.md b/docs/chapter_sorting/merge_sort.md index 76e528ffa..7a596fa30 100755 --- a/docs/chapter_sorting/merge_sort.md +++ b/docs/chapter_sorting/merge_sort.md @@ -51,101 +51,9 @@ - **后序遍历**:先递归左子树,再递归右子树,最后处理根节点。 - **归并排序**:先递归左子数组,再递归右子数组,最后处理合并。 -=== "Python" - - ```python title="merge_sort.py" - [class]{}-[func]{merge} - - [class]{}-[func]{merge_sort} - ``` - -=== "C++" - - ```cpp title="merge_sort.cpp" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "Java" - - ```java title="merge_sort.java" - [class]{merge_sort}-[func]{merge} - - [class]{merge_sort}-[func]{mergeSort} - ``` - -=== "C#" - - ```csharp title="merge_sort.cs" - [class]{merge_sort}-[func]{Merge} - - [class]{merge_sort}-[func]{MergeSort} - ``` - -=== "Go" - - ```go title="merge_sort.go" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "Swift" - - ```swift title="merge_sort.swift" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "JS" - - ```javascript title="merge_sort.js" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "TS" - - ```typescript title="merge_sort.ts" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "Dart" - - ```dart title="merge_sort.dart" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "Rust" - - ```rust title="merge_sort.rs" - [class]{}-[func]{merge} - - [class]{}-[func]{merge_sort} - ``` - -=== "C" - - ```c title="merge_sort.c" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` - -=== "Zig" - - ```zig title="merge_sort.zig" - [class]{}-[func]{merge} - - [class]{}-[func]{mergeSort} - ``` +```src +[file]{merge_sort}-[class]{}-[func]{merge_sort} +``` 实现合并函数 `merge()` 存在以下难点。 diff --git a/docs/chapter_sorting/quick_sort.md b/docs/chapter_sorting/quick_sort.md index 2e84b44ba..adf0a9728 100755 --- a/docs/chapter_sorting/quick_sort.md +++ b/docs/chapter_sorting/quick_sort.md @@ -41,95 +41,9 @@ 哨兵划分的实质是将一个较长数组的排序问题简化为两个较短数组的排序问题。 -=== "Python" - - ```python title="quick_sort.py" - [class]{QuickSort}-[func]{partition} - ``` - -=== "C++" - - ```cpp title="quick_sort.cpp" - [class]{QuickSort}-[func]{swap} - - [class]{QuickSort}-[func]{partition} - ``` - -=== "Java" - - ```java title="quick_sort.java" - [class]{QuickSort}-[func]{swap} - - [class]{QuickSort}-[func]{partition} - ``` - -=== "C#" - - ```csharp title="quick_sort.cs" - [class]{quickSort}-[func]{Swap} - - [class]{quickSort}-[func]{Partition} - ``` - -=== "Go" - - ```go title="quick_sort.go" - [class]{quickSort}-[func]{partition} - ``` - -=== "Swift" - - ```swift title="quick_sort.swift" - [class]{}-[func]{swap} - - [class]{}-[func]{partition} - ``` - -=== "JS" - - ```javascript title="quick_sort.js" - [class]{QuickSort}-[func]{swap} - - [class]{QuickSort}-[func]{partition} - ``` - -=== "TS" - - ```typescript title="quick_sort.ts" - [class]{QuickSort}-[func]{swap} - - [class]{QuickSort}-[func]{partition} - ``` - -=== "Dart" - - ```dart title="quick_sort.dart" - [class]{QuickSort}-[func]{_swap} - - [class]{QuickSort}-[func]{_partition} - ``` - -=== "Rust" - - ```rust title="quick_sort.rs" - [class]{QuickSort}-[func]{partition} - ``` - -=== "C" - - ```c title="quick_sort.c" - [class]{}-[func]{swap} - - [class]{}-[func]{partition} - ``` - -=== "Zig" - - ```zig title="quick_sort.zig" - [class]{QuickSort}-[func]{swap} - - [class]{QuickSort}-[func]{partition} - ``` +```src +[file]{quick_sort}-[class]{quick_sort}-[func]{partition} +``` ## 算法流程 @@ -141,77 +55,9 @@ ![快速排序流程](quick_sort.assets/quick_sort_overview.png) -=== "Python" - - ```python title="quick_sort.py" - [class]{QuickSort}-[func]{quick_sort} - ``` - -=== "C++" - - ```cpp title="quick_sort.cpp" - [class]{QuickSort}-[func]{quickSort} - ``` - -=== "Java" - - ```java title="quick_sort.java" - [class]{QuickSort}-[func]{quickSort} - ``` - -=== "C#" - - ```csharp title="quick_sort.cs" - [class]{quickSort}-[func]{QuickSort} - ``` - -=== "Go" - - ```go title="quick_sort.go" - [class]{quickSort}-[func]{quickSort} - ``` - -=== "Swift" - - ```swift title="quick_sort.swift" - [class]{}-[func]{quickSort} - ``` - -=== "JS" - - ```javascript title="quick_sort.js" - [class]{QuickSort}-[func]{quickSort} - ``` - -=== "TS" - - ```typescript title="quick_sort.ts" - [class]{QuickSort}-[func]{quickSort} - ``` - -=== "Dart" - - ```dart title="quick_sort.dart" - [class]{QuickSort}-[func]{quickSort} - ``` - -=== "Rust" - - ```rust title="quick_sort.rs" - [class]{QuickSort}-[func]{quick_sort} - ``` - -=== "C" - - ```c title="quick_sort.c" - [class]{}-[func]{quickSort} - ``` - -=== "Zig" - - ```zig title="quick_sort.zig" - [class]{QuickSort}-[func]{quickSort} - ``` +```src +[file]{quick_sort}-[class]{quick_sort}-[func]{quick_sort} +``` ## 算法特性 @@ -237,101 +83,9 @@ 为了进一步改进,我们可以在数组中选取三个候选元素(通常为数组的首、尾、中点元素),**并将这三个候选元素的中位数作为基准数**。这样一来,基准数“既不太小也不太大”的概率将大幅提升。当然,我们还可以选取更多候选元素,以进一步提高算法的稳健性。采用这种方法后,时间复杂度劣化至 $O(n^2)$ 的概率大大降低。 -=== "Python" - - ```python title="quick_sort.py" - [class]{QuickSortMedian}-[func]{median_three} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "C++" - - ```cpp title="quick_sort.cpp" - [class]{QuickSortMedian}-[func]{medianThree} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "Java" - - ```java title="quick_sort.java" - [class]{QuickSortMedian}-[func]{medianThree} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "C#" - - ```csharp title="quick_sort.cs" - [class]{QuickSortMedian}-[func]{MedianThree} - - [class]{QuickSortMedian}-[func]{Partition} - ``` - -=== "Go" - - ```go title="quick_sort.go" - [class]{quickSortMedian}-[func]{medianThree} - - [class]{quickSortMedian}-[func]{partition} - ``` - -=== "Swift" - - ```swift title="quick_sort.swift" - [class]{}-[func]{medianThree} - - [class]{}-[func]{partitionMedian} - ``` - -=== "JS" - - ```javascript title="quick_sort.js" - [class]{QuickSortMedian}-[func]{medianThree} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "TS" - - ```typescript title="quick_sort.ts" - [class]{QuickSortMedian}-[func]{medianThree} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "Dart" - - ```dart title="quick_sort.dart" - [class]{QuickSortMedian}-[func]{_medianThree} - - [class]{QuickSortMedian}-[func]{_partition} - ``` - -=== "Rust" - - ```rust title="quick_sort.rs" - [class]{QuickSortMedian}-[func]{median_three} - - [class]{QuickSortMedian}-[func]{partition} - ``` - -=== "C" - - ```c title="quick_sort.c" - [class]{}-[func]{medianThree} - - [class]{}-[func]{partitionMedian} - ``` - -=== "Zig" - - ```zig title="quick_sort.zig" - [class]{QuickSortMedian}-[func]{medianThree} - - [class]{QuickSortMedian}-[func]{partition} - ``` +```src +[file]{quick_sort}-[class]{quick_sort_median}-[func]{partition} +``` ## 尾递归优化 @@ -339,74 +93,6 @@ 为了防止栈帧空间的累积,我们可以在每轮哨兵排序完成后,比较两个子数组的长度,**仅对较短的子数组进行递归**。由于较短子数组的长度不会超过 $n / 2$ ,因此这种方法能确保递归深度不超过 $\log n$ ,从而将最差空间复杂度优化至 $O(\log n)$ 。 -=== "Python" - - ```python title="quick_sort.py" - [class]{QuickSortTailCall}-[func]{quick_sort} - ``` - -=== "C++" - - ```cpp title="quick_sort.cpp" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` - -=== "Java" - - ```java title="quick_sort.java" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` - -=== "C#" - - ```csharp title="quick_sort.cs" - [class]{QuickSortTailCall}-[func]{QuickSort} - ``` - -=== "Go" - - ```go title="quick_sort.go" - [class]{quickSortTailCall}-[func]{quickSort} - ``` - -=== "Swift" - - ```swift title="quick_sort.swift" - [class]{}-[func]{quickSortTailCall} - ``` - -=== "JS" - - ```javascript title="quick_sort.js" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` - -=== "TS" - - ```typescript title="quick_sort.ts" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` - -=== "Dart" - - ```dart title="quick_sort.dart" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` - -=== "Rust" - - ```rust title="quick_sort.rs" - [class]{QuickSortTailCall}-[func]{quick_sort} - ``` - -=== "C" - - ```c title="quick_sort.c" - [class]{}-[func]{quickSortTailCall} - ``` - -=== "Zig" - - ```zig title="quick_sort.zig" - [class]{QuickSortTailCall}-[func]{quickSort} - ``` +```src +[file]{quick_sort}-[class]{quick_sort_tail_call}-[func]{quick_sort} +``` diff --git a/docs/chapter_sorting/radix_sort.md b/docs/chapter_sorting/radix_sort.md index f36fd33fd..775ba8c18 100644 --- a/docs/chapter_sorting/radix_sort.md +++ b/docs/chapter_sorting/radix_sort.md @@ -24,125 +24,9 @@ $$ 此外,我们需要小幅改动计数排序代码,使之可以根据数字的第 $k$ 位进行排序。 -=== "Python" - - ```python title="radix_sort.py" - [class]{}-[func]{digit} - - [class]{}-[func]{counting_sort_digit} - - [class]{}-[func]{radix_sort} - ``` - -=== "C++" - - ```cpp title="radix_sort.cpp" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "Java" - - ```java title="radix_sort.java" - [class]{radix_sort}-[func]{digit} - - [class]{radix_sort}-[func]{countingSortDigit} - - [class]{radix_sort}-[func]{radixSort} - ``` - -=== "C#" - - ```csharp title="radix_sort.cs" - [class]{radix_sort}-[func]{Digit} - - [class]{radix_sort}-[func]{CountingSortDigit} - - [class]{radix_sort}-[func]{RadixSort} - ``` - -=== "Go" - - ```go title="radix_sort.go" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "Swift" - - ```swift title="radix_sort.swift" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "JS" - - ```javascript title="radix_sort.js" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "TS" - - ```typescript title="radix_sort.ts" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "Dart" - - ```dart title="radix_sort.dart" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "Rust" - - ```rust title="radix_sort.rs" - [class]{}-[func]{digit} - - [class]{}-[func]{counting_sort_digit} - - [class]{}-[func]{radix_sort} - ``` - -=== "C" - - ```c title="radix_sort.c" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` - -=== "Zig" - - ```zig title="radix_sort.zig" - [class]{}-[func]{digit} - - [class]{}-[func]{countingSortDigit} - - [class]{}-[func]{radixSort} - ``` +```src +[file]{radix_sort}-[class]{}-[func]{radix_sort} +``` !!! question "为什么从最低位开始排序?" diff --git a/docs/chapter_sorting/selection_sort.md b/docs/chapter_sorting/selection_sort.md index ff82b8d65..1518f44b1 100644 --- a/docs/chapter_sorting/selection_sort.md +++ b/docs/chapter_sorting/selection_sort.md @@ -45,77 +45,9 @@ 在代码中,我们用 $k$ 来记录未排序区间内的最小元素。 -=== "Python" - - ```python title="selection_sort.py" - [class]{}-[func]{selection_sort} - ``` - -=== "C++" - - ```cpp title="selection_sort.cpp" - [class]{}-[func]{selectionSort} - ``` - -=== "Java" - - ```java title="selection_sort.java" - [class]{selection_sort}-[func]{selectionSort} - ``` - -=== "C#" - - ```csharp title="selection_sort.cs" - [class]{selection_sort}-[func]{SelectionSort} - ``` - -=== "Go" - - ```go title="selection_sort.go" - [class]{}-[func]{selectionSort} - ``` - -=== "Swift" - - ```swift title="selection_sort.swift" - [class]{}-[func]{selectionSort} - ``` - -=== "JS" - - ```javascript title="selection_sort.js" - [class]{}-[func]{selectionSort} - ``` - -=== "TS" - - ```typescript title="selection_sort.ts" - [class]{}-[func]{selectionSort} - ``` - -=== "Dart" - - ```dart title="selection_sort.dart" - [class]{}-[func]{selectionSort} - ``` - -=== "Rust" - - ```rust title="selection_sort.rs" - [class]{}-[func]{selection_sort} - ``` - -=== "C" - - ```c title="selection_sort.c" - [class]{}-[func]{selectionSort} - ``` - -=== "Zig" - - ```zig title="selection_sort.zig" - [class]{}-[func]{selectionSort} - ``` +```src +[file]{selection_sort}-[class]{}-[func]{selection_sort} +``` ## 算法特性 diff --git a/docs/chapter_stack_and_queue/deque.md b/docs/chapter_stack_and_queue/deque.md index 1b61a845f..82b57f93b 100644 --- a/docs/chapter_stack_and_queue/deque.md +++ b/docs/chapter_stack_and_queue/deque.md @@ -371,99 +371,9 @@ 实现代码如下所示。 -=== "Python" - - ```python title="linkedlist_deque.py" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "C++" - - ```cpp title="linkedlist_deque.cpp" - [class]{DoublyListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "Java" - - ```java title="linkedlist_deque.java" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "C#" - - ```csharp title="linkedlist_deque.cs" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "Go" - - ```go title="linkedlist_deque.go" - [class]{linkedListDeque}-[func]{} - ``` - -=== "Swift" - - ```swift title="linkedlist_deque.swift" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "JS" - - ```javascript title="linkedlist_deque.js" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "TS" - - ```typescript title="linkedlist_deque.ts" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "Dart" - - ```dart title="linkedlist_deque.dart" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "Rust" - - ```rust title="linkedlist_deque.rs" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` - -=== "C" - - ```c title="linkedlist_deque.c" - [class]{doublyListNode}-[func]{} - - [class]{linkedListDeque}-[func]{} - ``` - -=== "Zig" - - ```zig title="linkedlist_deque.zig" - [class]{ListNode}-[func]{} - - [class]{LinkedListDeque}-[func]{} - ``` +```src +[file]{linkedlist_deque}-[class]{linked_list_deque}-[func]{} +``` ### 基于数组的实现 @@ -486,77 +396,9 @@ 在队列的实现基础上,仅需增加“队首入队”和“队尾出队”的方法。 -=== "Python" - - ```python title="array_deque.py" - [class]{ArrayDeque}-[func]{} - ``` - -=== "C++" - - ```cpp title="array_deque.cpp" - [class]{ArrayDeque}-[func]{} - ``` - -=== "Java" - - ```java title="array_deque.java" - [class]{ArrayDeque}-[func]{} - ``` - -=== "C#" - - ```csharp title="array_deque.cs" - [class]{ArrayDeque}-[func]{} - ``` - -=== "Go" - - ```go title="array_deque.go" - [class]{arrayDeque}-[func]{} - ``` - -=== "Swift" - - ```swift title="array_deque.swift" - [class]{ArrayDeque}-[func]{} - ``` - -=== "JS" - - ```javascript title="array_deque.js" - [class]{ArrayDeque}-[func]{} - ``` - -=== "TS" - - ```typescript title="array_deque.ts" - [class]{ArrayDeque}-[func]{} - ``` - -=== "Dart" - - ```dart title="array_deque.dart" - [class]{ArrayDeque}-[func]{} - ``` - -=== "Rust" - - ```rust title="array_deque.rs" - [class]{ArrayDeque}-[func]{} - ``` - -=== "C" - - ```c title="array_deque.c" - [class]{arrayDeque}-[func]{} - ``` - -=== "Zig" - - ```zig title="array_deque.zig" - [class]{ArrayDeque}-[func]{} - ``` +```src +[file]{array_deque}-[class]{array_deque}-[func]{} +``` ## 双向队列应用 diff --git a/docs/chapter_stack_and_queue/queue.md b/docs/chapter_stack_and_queue/queue.md index ed5b92011..c763f533f 100755 --- a/docs/chapter_stack_and_queue/queue.md +++ b/docs/chapter_stack_and_queue/queue.md @@ -325,77 +325,9 @@ 以下是用链表实现队列的代码。 -=== "Python" - - ```python title="linkedlist_queue.py" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "C++" - - ```cpp title="linkedlist_queue.cpp" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "Java" - - ```java title="linkedlist_queue.java" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "C#" - - ```csharp title="linkedlist_queue.cs" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "Go" - - ```go title="linkedlist_queue.go" - [class]{linkedListQueue}-[func]{} - ``` - -=== "Swift" - - ```swift title="linkedlist_queue.swift" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "JS" - - ```javascript title="linkedlist_queue.js" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "TS" - - ```typescript title="linkedlist_queue.ts" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "Dart" - - ```dart title="linkedlist_queue.dart" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "Rust" - - ```rust title="linkedlist_queue.rs" - [class]{LinkedListQueue}-[func]{} - ``` - -=== "C" - - ```c title="linkedlist_queue.c" - [class]{linkedListQueue}-[func]{} - ``` - -=== "Zig" - - ```zig title="linkedlist_queue.zig" - [class]{LinkedListQueue}-[func]{} - ``` +```src +[file]{linkedlist_queue}-[class]{linked_list_queue}-[func]{} +``` ### 基于数组的实现 @@ -423,77 +355,9 @@ 对于环形数组,我们需要让 `front` 或 `rear` 在越过数组尾部时,直接回到数组头部继续遍历。这种周期性规律可以通过“取余操作”来实现,代码如下所示。 -=== "Python" - - ```python title="array_queue.py" - [class]{ArrayQueue}-[func]{} - ``` - -=== "C++" - - ```cpp title="array_queue.cpp" - [class]{ArrayQueue}-[func]{} - ``` - -=== "Java" - - ```java title="array_queue.java" - [class]{ArrayQueue}-[func]{} - ``` - -=== "C#" - - ```csharp title="array_queue.cs" - [class]{ArrayQueue}-[func]{} - ``` - -=== "Go" - - ```go title="array_queue.go" - [class]{arrayQueue}-[func]{} - ``` - -=== "Swift" - - ```swift title="array_queue.swift" - [class]{ArrayQueue}-[func]{} - ``` - -=== "JS" - - ```javascript title="array_queue.js" - [class]{ArrayQueue}-[func]{} - ``` - -=== "TS" - - ```typescript title="array_queue.ts" - [class]{ArrayQueue}-[func]{} - ``` - -=== "Dart" - - ```dart title="array_queue.dart" - [class]{ArrayQueue}-[func]{} - ``` - -=== "Rust" - - ```rust title="array_queue.rs" - [class]{ArrayQueue}-[func]{} - ``` - -=== "C" - - ```c title="array_queue.c" - [class]{arrayQueue}-[func]{} - ``` - -=== "Zig" - - ```zig title="array_queue.zig" - [class]{ArrayQueue}-[func]{} - ``` +```src +[file]{array_queue}-[class]{array_queue}-[func]{} +``` 以上实现的队列仍然具有局限性,即其长度不可变。然而,这个问题不难解决,我们可以将数组替换为动态数组,从而引入扩容机制。有兴趣的同学可以尝试自行实现。 diff --git a/docs/chapter_stack_and_queue/stack.md b/docs/chapter_stack_and_queue/stack.md index cbddcb04d..e730af3d7 100755 --- a/docs/chapter_stack_and_queue/stack.md +++ b/docs/chapter_stack_and_queue/stack.md @@ -325,77 +325,9 @@ 以下是基于链表实现栈的示例代码。 -=== "Python" - - ```python title="linkedlist_stack.py" - [class]{LinkedListStack}-[func]{} - ``` - -=== "C++" - - ```cpp title="linkedlist_stack.cpp" - [class]{LinkedListStack}-[func]{} - ``` - -=== "Java" - - ```java title="linkedlist_stack.java" - [class]{LinkedListStack}-[func]{} - ``` - -=== "C#" - - ```csharp title="linkedlist_stack.cs" - [class]{LinkedListStack}-[func]{} - ``` - -=== "Go" - - ```go title="linkedlist_stack.go" - [class]{linkedListStack}-[func]{} - ``` - -=== "Swift" - - ```swift title="linkedlist_stack.swift" - [class]{LinkedListStack}-[func]{} - ``` - -=== "JS" - - ```javascript title="linkedlist_stack.js" - [class]{LinkedListStack}-[func]{} - ``` - -=== "TS" - - ```typescript title="linkedlist_stack.ts" - [class]{LinkedListStack}-[func]{} - ``` - -=== "Dart" - - ```dart title="linkedlist_stack.dart" - [class]{LinkedListStack}-[func]{} - ``` - -=== "Rust" - - ```rust title="linkedlist_stack.rs" - [class]{LinkedListStack}-[func]{} - ``` - -=== "C" - - ```c title="linkedlist_stack.c" - [class]{linkedListStack}-[func]{} - ``` - -=== "Zig" - - ```zig title="linkedlist_stack.zig" - [class]{LinkedListStack}-[func]{} - ``` +```src +[file]{linkedlist_stack}-[class]{linked_list_stack}-[func]{} +``` ### 基于数组的实现 @@ -412,77 +344,9 @@ 由于入栈的元素可能会源源不断地增加,因此我们可以使用动态数组,这样就无须自行处理数组扩容问题。以下为示例代码。 -=== "Python" - - ```python title="array_stack.py" - [class]{ArrayStack}-[func]{} - ``` - -=== "C++" - - ```cpp title="array_stack.cpp" - [class]{ArrayStack}-[func]{} - ``` - -=== "Java" - - ```java title="array_stack.java" - [class]{ArrayStack}-[func]{} - ``` - -=== "C#" - - ```csharp title="array_stack.cs" - [class]{ArrayStack}-[func]{} - ``` - -=== "Go" - - ```go title="array_stack.go" - [class]{arrayStack}-[func]{} - ``` - -=== "Swift" - - ```swift title="array_stack.swift" - [class]{ArrayStack}-[func]{} - ``` - -=== "JS" - - ```javascript title="array_stack.js" - [class]{ArrayStack}-[func]{} - ``` - -=== "TS" - - ```typescript title="array_stack.ts" - [class]{ArrayStack}-[func]{} - ``` - -=== "Dart" - - ```dart title="array_stack.dart" - [class]{ArrayStack}-[func]{} - ``` - -=== "Rust" - - ```rust title="array_stack.rs" - [class]{ArrayStack}-[func]{} - ``` - -=== "C" - - ```c title="array_stack.c" - [class]{arrayStack}-[func]{} - ``` - -=== "Zig" - - ```zig title="array_stack.zig" - [class]{ArrayStack}-[func]{} - ``` +```src +[file]{array_stack}-[class]{array_stack}-[func]{} +``` ## 两种实现对比 diff --git a/docs/chapter_tree/array_representation_of_tree.md b/docs/chapter_tree/array_representation_of_tree.md index 453f5fb51..cb9efcbef 100644 --- a/docs/chapter_tree/array_representation_of_tree.md +++ b/docs/chapter_tree/array_representation_of_tree.md @@ -131,77 +131,9 @@ - 给定某节点,获取它的值、左(右)子节点、父节点。 - 获取前序遍历、中序遍历、后序遍历、层序遍历序列。 -=== "Python" - - ```python title="array_binary_tree.py" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "C++" - - ```cpp title="array_binary_tree.cpp" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "Java" - - ```java title="array_binary_tree.java" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "C#" - - ```csharp title="array_binary_tree.cs" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "Go" - - ```go title="array_binary_tree.go" - [class]{arrayBinaryTree}-[func]{} - ``` - -=== "Swift" - - ```swift title="array_binary_tree.swift" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "JS" - - ```javascript title="array_binary_tree.js" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "TS" - - ```typescript title="array_binary_tree.ts" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "Dart" - - ```dart title="array_binary_tree.dart" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "Rust" - - ```rust title="array_binary_tree.rs" - [class]{ArrayBinaryTree}-[func]{} - ``` - -=== "C" - - ```c title="array_binary_tree.c" - [class]{arrayBinaryTree}-[func]{} - ``` - -=== "Zig" - - ```zig title="array_binary_tree.zig" - [class]{ArrayBinaryTree}-[func]{} - ``` +```src +[file]{array_binary_tree}-[class]{array_binary_tree}-[func]{} +``` ## 优势与局限性 diff --git a/docs/chapter_tree/avl_tree.md b/docs/chapter_tree/avl_tree.md index 1a1e32a06..a5dfdd1cd 100644 --- a/docs/chapter_tree/avl_tree.md +++ b/docs/chapter_tree/avl_tree.md @@ -211,177 +211,17 @@ AVL 树既是二叉搜索树也是平衡二叉树,同时满足这两类二叉 “节点高度”是指从该节点到最远叶节点的距离,即所经过的“边”的数量。需要特别注意的是,叶节点的高度为 0 ,而空节点的高度为 -1 。我们将创建两个工具函数,分别用于获取和更新节点的高度。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{update_height} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{Height} - - [class]{AVLTree}-[func]{UpdateHeight} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{height} - - [class]{aVLTree}-[func]{updateHeight} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{update_height} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{}-[func]{height} - - [class]{}-[func]{updateHeight} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{height} - - [class]{AVLTree}-[func]{updateHeight} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{update_height} +``` ### 节点平衡因子 节点的「平衡因子 balance factor」定义为节点左子树的高度减去右子树的高度,同时规定空节点的平衡因子为 0 。我们同样将获取节点平衡因子的功能封装成函数,方便后续使用。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{balance_factor} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{BalanceFactor} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{balanceFactor} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{balanceFactor} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{balance_factor} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{}-[func]{balanceFactor} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{balanceFactor} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{balance_factor} +``` !!! note @@ -415,77 +255,9 @@ AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中 “向右旋转”是一种形象化的说法,实际上需要通过修改节点指针来实现,代码如下所示。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{right_rotate} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{RightRotate} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{rightRotate} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{rightRotate} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{right_rotate} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{}-[func]{rightRotate} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{rightRotate} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{right_rotate} +``` ### 左旋 @@ -499,77 +271,9 @@ AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中 可以观察到,**右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的**。基于对称性,我们只需将右旋的实现代码中的所有的 `left` 替换为 `right` ,将所有的 `right` 替换为 `left` ,即可得到左旋的实现代码。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{left_rotate} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{LeftRotate} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{leftRotate} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{leftRotate} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{left_rotate} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{}-[func]{leftRotate} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{leftRotate} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{left_rotate} +``` ### 先左旋后右旋 @@ -602,77 +306,9 @@ AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中 为了便于使用,我们将旋转操作封装成一个函数。**有了这个函数,我们就能对各种失衡情况进行旋转,使失衡节点重新恢复平衡**。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{Rotate} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{rotate} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{rotate} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{}-[func]{rotate} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{rotate} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{rotate} +``` ## AVL 树常用操作 @@ -680,201 +316,17 @@ AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中 AVL 树的节点插入操作与二叉搜索树在主体上类似。唯一的区别在于,在 AVL 树中插入节点后,从该节点到根节点的路径上可能会出现一系列失衡节点。因此,**我们需要从这个节点开始,自底向上执行旋转操作,使所有失衡节点恢复平衡**。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insert_helper} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{Insert} - - [class]{AVLTree}-[func]{InsertHelper} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{insert} - - [class]{aVLTree}-[func]{insertHelper} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insert_helper} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{aVLTree}-[func]{insert} - - [class]{}-[func]{insertHelper} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{insert} - - [class]{AVLTree}-[func]{insertHelper} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{insert_helper} +``` ### 删除节点 类似地,在二叉搜索树的删除节点方法的基础上,需要从底至顶地执行旋转操作,使所有失衡节点恢复平衡。 -=== "Python" - - ```python title="avl_tree.py" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{remove_helper} - ``` - -=== "C++" - - ```cpp title="avl_tree.cpp" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "Java" - - ```java title="avl_tree.java" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "C#" - - ```csharp title="avl_tree.cs" - [class]{AVLTree}-[func]{Remove} - - [class]{AVLTree}-[func]{RemoveHelper} - ``` - -=== "Go" - - ```go title="avl_tree.go" - [class]{aVLTree}-[func]{remove} - - [class]{aVLTree}-[func]{removeHelper} - ``` - -=== "Swift" - - ```swift title="avl_tree.swift" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "JS" - - ```javascript title="avl_tree.js" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "TS" - - ```typescript title="avl_tree.ts" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "Dart" - - ```dart title="avl_tree.dart" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` - -=== "Rust" - - ```rust title="avl_tree.rs" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{remove_helper} - ``` - -=== "C" - - ```c title="avl_tree.c" - [class]{aVLTree}-[func]{removeItem} - - [class]{}-[func]{removeHelper} - ``` - -=== "Zig" - - ```zig title="avl_tree.zig" - [class]{AVLTree}-[func]{remove} - - [class]{AVLTree}-[func]{removeHelper} - ``` +```src +[file]{avl_tree}-[class]{a_v_l_tree}-[func]{remove_helper} +``` ### 查找节点 diff --git a/docs/chapter_tree/binary_search_tree.md b/docs/chapter_tree/binary_search_tree.md index a9b1c5512..f7d4d7d80 100755 --- a/docs/chapter_tree/binary_search_tree.md +++ b/docs/chapter_tree/binary_search_tree.md @@ -33,77 +33,9 @@ 二叉搜索树的查找操作与二分查找算法的工作原理一致,都是每轮排除一半情况。循环次数最多为二叉树的高度,当二叉树平衡时,使用 $O(\log n)$ 时间。 -=== "Python" - - ```python title="binary_search_tree.py" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "C++" - - ```cpp title="binary_search_tree.cpp" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "Java" - - ```java title="binary_search_tree.java" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "C#" - - ```csharp title="binary_search_tree.cs" - [class]{BinarySearchTree}-[func]{Search} - ``` - -=== "Go" - - ```go title="binary_search_tree.go" - [class]{binarySearchTree}-[func]{search} - ``` - -=== "Swift" - - ```swift title="binary_search_tree.swift" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "JS" - - ```javascript title="binary_search_tree.js" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "TS" - - ```typescript title="binary_search_tree.ts" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "Dart" - - ```dart title="binary_search_tree.dart" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "Rust" - - ```rust title="binary_search_tree.rs" - [class]{BinarySearchTree}-[func]{search} - ``` - -=== "C" - - ```c title="binary_search_tree.c" - [class]{binarySearchTree}-[func]{search} - ``` - -=== "Zig" - - ```zig title="binary_search_tree.zig" - [class]{BinarySearchTree}-[func]{search} - ``` +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{search} +``` ### 插入节点 @@ -119,77 +51,9 @@ - 二叉搜索树不允许存在重复节点,否则将违反其定义。因此,若待插入节点在树中已存在,则不执行插入,直接返回。 - 为了实现插入节点,我们需要借助节点 `pre` 保存上一轮循环的节点。这样在遍历至 $\text{None}$ 时,我们可以获取到其父节点,从而完成节点插入操作。 -=== "Python" - - ```python title="binary_search_tree.py" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "C++" - - ```cpp title="binary_search_tree.cpp" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "Java" - - ```java title="binary_search_tree.java" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "C#" - - ```csharp title="binary_search_tree.cs" - [class]{BinarySearchTree}-[func]{Insert} - ``` - -=== "Go" - - ```go title="binary_search_tree.go" - [class]{binarySearchTree}-[func]{insert} - ``` - -=== "Swift" - - ```swift title="binary_search_tree.swift" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "JS" - - ```javascript title="binary_search_tree.js" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "TS" - - ```typescript title="binary_search_tree.ts" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "Dart" - - ```dart title="binary_search_tree.dart" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "Rust" - - ```rust title="binary_search_tree.rs" - [class]{BinarySearchTree}-[func]{insert} - ``` - -=== "C" - - ```c title="binary_search_tree.c" - [class]{binarySearchTree}-[func]{insert} - ``` - -=== "Zig" - - ```zig title="binary_search_tree.zig" - [class]{BinarySearchTree}-[func]{insert} - ``` +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{insert} +``` 与查找节点相同,插入节点使用 $O(\log n)$ 时间。 @@ -230,77 +94,9 @@ 删除节点操作同样使用 $O(\log n)$ 时间,其中查找待删除节点需要 $O(\log n)$ 时间,获取中序遍历后继节点需要 $O(\log n)$ 时间。 -=== "Python" - - ```python title="binary_search_tree.py" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "C++" - - ```cpp title="binary_search_tree.cpp" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "Java" - - ```java title="binary_search_tree.java" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "C#" - - ```csharp title="binary_search_tree.cs" - [class]{BinarySearchTree}-[func]{Remove} - ``` - -=== "Go" - - ```go title="binary_search_tree.go" - [class]{binarySearchTree}-[func]{remove} - ``` - -=== "Swift" - - ```swift title="binary_search_tree.swift" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "JS" - - ```javascript title="binary_search_tree.js" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "TS" - - ```typescript title="binary_search_tree.ts" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "Dart" - - ```dart title="binary_search_tree.dart" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "Rust" - - ```rust title="binary_search_tree.rs" - [class]{BinarySearchTree}-[func]{remove} - ``` - -=== "C" - - ```c title="binary_search_tree.c" - [class]{binarySearchTree}-[func]{removeItem} - ``` - -=== "Zig" - - ```zig title="binary_search_tree.zig" - [class]{BinarySearchTree}-[func]{remove} - ``` +```src +[file]{binary_search_tree}-[class]{binary_search_tree}-[func]{remove} +``` ### 中序遍历有序 diff --git a/docs/chapter_tree/binary_tree_traversal.md b/docs/chapter_tree/binary_tree_traversal.md index 8e57ab209..a155b2860 100755 --- a/docs/chapter_tree/binary_tree_traversal.md +++ b/docs/chapter_tree/binary_tree_traversal.md @@ -16,77 +16,9 @@ 广度优先遍历通常借助“队列”来实现。队列遵循“先进先出”的规则,而广度优先遍历则遵循“逐层推进”的规则,两者背后的思想是一致的。 -=== "Python" - - ```python title="binary_tree_bfs.py" - [class]{}-[func]{level_order} - ``` - -=== "C++" - - ```cpp title="binary_tree_bfs.cpp" - [class]{}-[func]{levelOrder} - ``` - -=== "Java" - - ```java title="binary_tree_bfs.java" - [class]{binary_tree_bfs}-[func]{levelOrder} - ``` - -=== "C#" - - ```csharp title="binary_tree_bfs.cs" - [class]{binary_tree_bfs}-[func]{LevelOrder} - ``` - -=== "Go" - - ```go title="binary_tree_bfs.go" - [class]{}-[func]{levelOrder} - ``` - -=== "Swift" - - ```swift title="binary_tree_bfs.swift" - [class]{}-[func]{levelOrder} - ``` - -=== "JS" - - ```javascript title="binary_tree_bfs.js" - [class]{}-[func]{levelOrder} - ``` - -=== "TS" - - ```typescript title="binary_tree_bfs.ts" - [class]{}-[func]{levelOrder} - ``` - -=== "Dart" - - ```dart title="binary_tree_bfs.dart" - [class]{}-[func]{levelOrder} - ``` - -=== "Rust" - - ```rust title="binary_tree_bfs.rs" - [class]{}-[func]{level_order} - ``` - -=== "C" - - ```c title="binary_tree_bfs.c" - [class]{}-[func]{levelOrder} - ``` - -=== "Zig" - - ```zig title="binary_tree_bfs.zig" - [class]{}-[func]{levelOrder} - ``` +```src +[file]{binary_tree_bfs}-[class]{}-[func]{level_order} +``` ### 复杂度分析 @@ -105,125 +37,9 @@ 深度优先搜索通常基于递归实现: -=== "Python" - - ```python title="binary_tree_dfs.py" - [class]{}-[func]{pre_order} - - [class]{}-[func]{in_order} - - [class]{}-[func]{post_order} - ``` - -=== "C++" - - ```cpp title="binary_tree_dfs.cpp" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "Java" - - ```java title="binary_tree_dfs.java" - [class]{binary_tree_dfs}-[func]{preOrder} - - [class]{binary_tree_dfs}-[func]{inOrder} - - [class]{binary_tree_dfs}-[func]{postOrder} - ``` - -=== "C#" - - ```csharp title="binary_tree_dfs.cs" - [class]{binary_tree_dfs}-[func]{PreOrder} - - [class]{binary_tree_dfs}-[func]{InOrder} - - [class]{binary_tree_dfs}-[func]{PostOrder} - ``` - -=== "Go" - - ```go title="binary_tree_dfs.go" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "Swift" - - ```swift title="binary_tree_dfs.swift" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "JS" - - ```javascript title="binary_tree_dfs.js" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "TS" - - ```typescript title="binary_tree_dfs.ts" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "Dart" - - ```dart title="binary_tree_dfs.dart" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "Rust" - - ```rust title="binary_tree_dfs.rs" - [class]{}-[func]{pre_order} - - [class]{}-[func]{in_order} - - [class]{}-[func]{post_order} - ``` - -=== "C" - - ```c title="binary_tree_dfs.c" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` - -=== "Zig" - - ```zig title="binary_tree_dfs.zig" - [class]{}-[func]{preOrder} - - [class]{}-[func]{inOrder} - - [class]{}-[func]{postOrder} - ``` +```src +[file]{binary_tree_dfs}-[class]{}-[func]{post_order} +``` !!! note