From 9a2c1355ec53838f627b8c85d25fab582ec44a60 Mon Sep 17 00:00:00 2001 From: K3v123 <123932560+K3v123@users.noreply.github.com> Date: Mon, 18 Nov 2024 01:47:41 +1300 Subject: [PATCH 1/8] translation: Update index.md (#1548) * translation: Update index.md refined some parts of the sentences. changed 'in' to 'on' as it conveys a sense of movement along a path * translation: Update index.md changed some words per Thomas's suggestions. --- en/docs/chapter_searching/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/docs/chapter_searching/index.md b/en/docs/chapter_searching/index.md index f8e3b8bc8..cf8ac7f2f 100644 --- a/en/docs/chapter_searching/index.md +++ b/en/docs/chapter_searching/index.md @@ -4,6 +4,6 @@ !!! abstract - Searching is an unknown adventure, where we may need to traverse every corner of a mysterious space, or perhaps quickly pinpoint our target. + Searching is an adventure into the unknown; where we may need to traverse every corner of a mysterious space, or perhaps we’ll quickly locate our target. - In this journey of discovery, each exploration may yield an unexpected answer. + On this journey of discovery, each exploration may end up with an unexpected answer. From fb04ff65356083d5b3e335b471910c37bd4b4bb7 Mon Sep 17 00:00:00 2001 From: K3v123 <123932560+K3v123@users.noreply.github.com> Date: Mon, 18 Nov 2024 01:49:26 +1300 Subject: [PATCH 2/8] translation update: Update summary.md (#1549) * translation update: Update summary.md added and refined some parts. I feel like that this chapter is already pretty well translated. * translation: Update summary.md rewritten some parts of the sentence as per Thomas suggested. please note that some parts I re-wrote it a bit differently. * translation update: summary.md Added what Ymmma suggested --- en/docs/chapter_searching/summary.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/en/docs/chapter_searching/summary.md b/en/docs/chapter_searching/summary.md index 7c49cbdab..d6169a17a 100644 --- a/en/docs/chapter_searching/summary.md +++ b/en/docs/chapter_searching/summary.md @@ -1,8 +1,8 @@ # Summary - Binary search depends on the order of data and performs the search by iteratively halving the search interval. It requires the input data to be sorted and is only applicable to arrays or array-based data structures. -- Brute force search locates data by traversing the data structure. Linear search is suitable for arrays and linked lists, while breadth-first search and depth-first search are suitable for graphs and trees. These algorithms are highly versatile, requiring no preprocessing of data, but have a higher time complexity of $O(n)$. -- Hash search, tree search, and binary search are efficient searching methods, capable of quickly locating target elements in specific data structures. These algorithms are highly efficient, with time complexities reaching $O(\log n)$ or even $O(1)$, but they usually require additional data structures. -- In practice, we need to analyze factors such as data volume, search performance requirements, data query and update frequencies, etc., to choose the appropriate search method. -- Linear search is suitable for small or frequently updated data; binary search is suitable for large, sorted data; hash search is suitable for scenarios requiring high query efficiency without the need for range queries; tree search is appropriate for large dynamic data that needs to maintain order and support range queries. -- Replacing linear search with hash search is a common strategy to optimize runtime, reducing the time complexity from $O(n)$ to $O(1)$. +- Brute force search may be required to locate an entry in an unordered dataset. Different search algorithms can be applied based on the data structure: Linear search is suitable for arrays and linked lists, while breadth-first search (BFS) and depth-first search (DFS) are suitable for graphs and trees. These algorithms are highly versatile, requiring no preprocessing of data, but they have a higher time complexity of $O(n)$. +- Hash search, tree search, and binary search are efficient search methods that can quickly locate target elements within specific data structures. These algorithms are highly efficient, with time complexities reaching $O(\log n)$ or even $O(1)$, but they usually require extra space to accommodate additional data structures. +- In practice, we need to analyze factors such as data volume, search performance requirements, data query and update frequencies, etc., to choose an appropriate search method. +- Linear search is ideal for small or frequently updated (volatile) data. Binary search works well for large and sorted data. Hash search is suitable for data that requires high query efficiency and does not need range queries. Tree search is best suited for large dynamic data that require maintaining order and need to support range queries. +- Replacing linear search with hash search is a common strategy to optimize runtime performance, reducing the time complexity from $O(n)$ to $O(1)$. From 05e0e1d2440da85fba9e39bb935b3e7ffc6967be Mon Sep 17 00:00:00 2001 From: qinmu Date: Sun, 17 Nov 2024 13:49:36 +0100 Subject: [PATCH 3/8] translation: chapter_tree/binary_tree.md (#1502) * doc: translate chapter_tree/binary_tree.md to English * Update binary_tree.md --------- Co-authored-by: Yudong Jin --- en/docs/chapter_tree/binary_tree.md | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/en/docs/chapter_tree/binary_tree.md b/en/docs/chapter_tree/binary_tree.md index b855e1a82..befce86cb 100644 --- a/en/docs/chapter_tree/binary_tree.md +++ b/en/docs/chapter_tree/binary_tree.md @@ -1,6 +1,6 @@ # Binary tree -A binary tree is a non-linear data structure that represents the hierarchical relationship between ancestors and descendants, embodying the divide-and-conquer logic of "splitting into two". Similar to a linked list, the basic unit of a binary tree is a node, each containing a value, a reference to the left child node, and a reference to the right child node. +A binary tree is a non-linear data structure that represents the hierarchical relationship between ancestors and descendants and embodies the divide-and-conquer logic of "splitting into two". Similar to a linked list, the basic unit of a binary tree is a node, and each node contains a value, a reference to its left child node, and a reference to its right child node. === "Python" @@ -198,9 +198,9 @@ A binary tree is a non-linear data structure that represents the hierarch ``` -Each node has two references (pointers), pointing to the left-child node and right-child node, respectively. This node is called the parent node of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes under it the left subtree of this node. Similarly, the right subtree can be defined. +Each node has two references (pointers), pointing respectively to the left-child node and right-child node. This node is called the parent node of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes below it the left subtree of this node. Similarly, the right subtree can be defined. -**In a binary tree, except for leaf nodes, all other nodes contain child nodes and non-empty subtrees.** As shown in the figure below, if "Node 2" is considered as the parent node, then its left and right child nodes are "Node 4" and "Node 5," respectively. The left subtree is "the tree formed by Node 4 and all nodes under it," and the right subtree is "the tree formed by Node 5 and all nodes under it." +**In a binary tree, except leaf nodes, all other nodes contain child nodes and non-empty subtrees.** As shown in the figure below, if "Node 2" is regarded as a parent node, its left and right child nodes are "Node 4" and "Node 5" respectively. The left subtree is formed by "Node 4" and all nodes beneath it, while the right subtree is formed by "Node 5" and all nodes beneath it. ![Parent Node, child Node, subtree](binary_tree.assets/binary_tree_definition.png) @@ -208,26 +208,26 @@ Each node has two references (pointers), pointing to the left-child node The commonly used terminology of binary trees is shown in the figure below. -- Root node: The node at the top level of the binary tree, which has no parent node. -- Leaf node: A node with no children, both of its pointers point to `None`. -- Edge: The line segment connecting two nodes, i.e., node reference (pointer). -- The level of a node: Incrementing from top to bottom, with the root node's level being 1. -- The degree of a node: The number of children a node has. In a binary tree, the degree can be 0, 1, or 2. -- The height of a binary tree: The number of edges passed from the root node to the farthest leaf node. -- The depth of a node: The number of edges passed from the root node to the node. +- Root node: The node at the top level of a binary tree, which does not have a parent node. +- Leaf node: A node that does not have any child nodes, with both of its pointers pointing to `None`. +- Edge: A line segment that connects two nodes, representing a reference (pointer) between the nodes. +- The level of a node: It increases from top to bottom, with the root node being at level 1. +- The degree of a node: The number of child nodes that a node has. In a binary tree, the degree can be 0, 1, or 2. +- The height of a binary tree: The number of edges from the root node to the farthest leaf node. +- The depth of a node: The number of edges from the root node to the node. - The height of a node: The number of edges from the farthest leaf node to the node. ![Common Terminology of Binary Trees](binary_tree.assets/binary_tree_terminology.png) !!! tip - Please note that we typically define "height" and "depth" as "the number of edges traversed", but some problems or textbooks may define them as "the number of nodes traversed". In such cases, both height and depth need to be incremented by 1. + Please note that we usually define "height" and "depth" as "the number of edges traversed", but some questions or textbooks may define them as "the number of nodes traversed". In this case, both height and depth need to be incremented by 1. ## Basic operations of binary trees ### Initializing a binary tree -Similar to a linked list, begin by initialize nodes, then construct references (pointers). +Similar to a linked list, the initialization of a binary tree involves first creating the nodes and then establishing the references (pointers) between them. === "Python" @@ -609,13 +609,13 @@ Similar to a linked list, inserting and removing nodes in a binary tree can be a !!! tip - It's important to note that inserting nodes may change the original logical structure of the binary tree, while removing nodes typically involves removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a coordinated set of operations to achieve meaningful outcomes. + It should be noted that inserting nodes may change the original logical structure of the binary tree, while removing nodes typically involves removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a set of operations to achieve meaningful outcomes. ## Common types of binary trees ### Perfect binary tree -As shown in the figure below, in a perfect binary tree, all levels of nodes are fully filled. In a perfect binary tree, the degree of leaf nodes is $0$, while the degree of all other nodes is $2$; if the tree's height is $h$, then the total number of nodes is $2^{h+1} - 1$, showing a standard exponential relationship, reflecting the common phenomenon of cell division in nature. +As shown in the figure below, in a perfect binary tree, all levels are completely filled with nodes. In a perfect binary tree, leaf nodes have a degree of $0$, while all other nodes have a degree of $2$. The total number of nodes can be calculated as $2^{h+1} - 1$, where $h$ is the height of the tree. This exhibits a standard exponential relationship, reflecting the common phenomenon of cell division in nature. !!! tip @@ -625,19 +625,19 @@ As shown in the figure below, in a perfect binary tree, all levels of nod ### Complete binary tree -As shown in the figure below, a complete binary tree has only the bottom level nodes not fully filled, and the bottom level nodes are filled as far left as possible. +As shown in the figure below, a complete binary tree is a binary tree where only the nodes in the bottom level are not completely filled, and the nodes in the bottom level are filled from left to right as much as possible. Please note that a perfect binary tree is also a complete binary tree. ![Complete binary tree](binary_tree.assets/complete_binary_tree.png) ### Full binary tree -As shown in the figure below, a full binary tree has all nodes except leaf nodes having two children. +As shown in the figure below, a full binary tree, except for the leaf nodes, has two child nodes for all other nodes. ![Full binary tree](binary_tree.assets/full_binary_tree.png) ### Balanced binary tree -As shown in the figure below, in a balanced binary tree, the absolute difference in height between the left and right subtrees of any node does not exceed 1. +As shown in the figure below, in a balanced binary tree, the absolute difference between the height of the left and right subtrees of any node does not exceed 1. ![Balanced binary tree](binary_tree.assets/balanced_binary_tree.png) @@ -645,12 +645,12 @@ As shown in the figure below, in a balanced binary tree, the absolute dif The figure below shows the ideal and degenerate structures of binary trees. A binary tree becomes a "perfect binary tree" when every level is filled; while it degenerates into a "linked list" when all nodes are biased toward one side. -- The perfect binary tree is the ideal situation, fully leveraging the "divide and conquer" advantage of binary trees. -- A linked list is another extreme, where operations become linear, degrading the time complexity to $O(n)$. +- A perfect binary tree is an ideal scenario where the "divide and conquer" advantage of a binary tree can be fully utilized. +- On the other hand, a linked list represents another extreme where all operations become linear, resulting in a time complexity of $O(n)$. ![The Best and Worst Structures of Binary Trees](binary_tree.assets/binary_tree_best_worst_cases.png) -As shown in the table below, in the best and worst structures, the number of leaf nodes, total number of nodes, and height of the binary tree reach their maximum or minimum values. +As shown in the table below, in the best and worst structures, the binary tree achieves either maximum or minimum values for leaf node count, total number of nodes, and height.

Table   The Best and Worst Structures of Binary Trees

From 954169d61887de58117b8e519dcf41dd6cd2495e Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Wed, 20 Nov 2024 19:45:03 +0800 Subject: [PATCH 4/8] Update CONTRIBUTING.md (#1564) --- en/CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/en/CONTRIBUTING.md b/en/CONTRIBUTING.md index b14906fcf..42aa00b28 100644 --- a/en/CONTRIBUTING.md +++ b/en/CONTRIBUTING.md @@ -7,6 +7,8 @@ We are working on translating "Hello Algo" from Chinese to English with the foll 3. **Pull request review**: The optimized translation will be double checked by the reviewers through GitHub pull request workflow. 4. Repeat steps `2.` and `3.` for further improvements. +translation_pipeline + ## Join us We're seeking contributors who meet the following criteria. From 14608d4e9241cbccc9d3f926c97fd97164544a89 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Wed, 20 Nov 2024 20:38:48 +0800 Subject: [PATCH 5/8] Update CONTRIBUTING.md (#1565) --- en/CONTRIBUTING.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/en/CONTRIBUTING.md b/en/CONTRIBUTING.md index 42aa00b28..d131c8714 100644 --- a/en/CONTRIBUTING.md +++ b/en/CONTRIBUTING.md @@ -22,7 +22,10 @@ That is, our contributors are computer scientists, engineers, and students from - **Native Chinese with professional working English**: Ensuring translation accuracy and consistency between CN and EN versions. - **Native English**: Enhance the authenticity and fluency of the English content to flow naturally and to be engaging. -Don't hesitate to join us via WeChat `krahets-jyd` or on [Discord](https://discord.gg/nvspS56295)! +> [!note] +> If you are interested in joining us, don't hesitate to contact me via krahetx@gmail.com or WeChat `krahets-jyd`. +> +> We use this [Notion page](https://hello-algo.notion.site/chinese-to-english) to track progress and assign tasks. Please visit it for more details. ## Translation process From 894e3d536b9925515d795f0a438400a2f4f6e4f5 Mon Sep 17 00:00:00 2001 From: sslmj2020 <57456161+sslmj2020@users.noreply.github.com> Date: Sun, 24 Nov 2024 00:39:33 +0800 Subject: [PATCH 6/8] Update array_binary_tree.cpp (#1568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 打印的小错误 --- codes/cpp/chapter_tree/array_binary_tree.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/codes/cpp/chapter_tree/array_binary_tree.cpp b/codes/cpp/chapter_tree/array_binary_tree.cpp index 031c664c2..0b76df48a 100644 --- a/codes/cpp/chapter_tree/array_binary_tree.cpp +++ b/codes/cpp/chapter_tree/array_binary_tree.cpp @@ -115,9 +115,9 @@ int main() { int i = 1; int l = abt.left(i), r = abt.right(i), p = abt.parent(i); cout << "\n当前节点的索引为 " << i << ",值为 " << abt.val(i) << "\n"; - cout << "其左子节点的索引为 " << l << ",值为 " << (l != INT_MAX ? to_string(abt.val(l)) : "nullptr") << "\n"; - cout << "其右子节点的索引为 " << r << ",值为 " << (r != INT_MAX ? to_string(abt.val(r)) : "nullptr") << "\n"; - cout << "其父节点的索引为 " << p << ",值为 " << (p != INT_MAX ? to_string(abt.val(p)) : "nullptr") << "\n"; + cout << "其左子节点的索引为 " << l << ",值为 " << (abt.val(l) != INT_MAX ? to_string(abt.val(l)) : "nullptr") << "\n"; + cout << "其右子节点的索引为 " << r << ",值为 " << (abt.val(r) != INT_MAX ? to_string(abt.val(r)) : "nullptr") << "\n"; + cout << "其父节点的索引为 " << p << ",值为 " << (abt.val(p) != INT_MAX ? to_string(abt.val(p)) : "nullptr") << "\n"; // 遍历树 vector res = abt.levelOrder(); From 01a5f7b09fb3714dc68a44567d0859e37aa405bd Mon Sep 17 00:00:00 2001 From: Anurag Pandey Date: Mon, 25 Nov 2024 16:45:06 +0530 Subject: [PATCH 7/8] Improved HTML Structure for Better Accessibility and Maintainability (#1434) * Improved HTML Structure for Better Accessibility and Maintainability Commit Description: Semantic Sectioning and Class Names: Updated class names to be more descriptive. Ensured better readability and maintainability. Alt Text for Images: Added alt attributes to all tags to improve accessibility. SVG Elements: Added appropriate role attributes to SVG elements. External Links: Updated external links to open in a new tab using target="_blank". Added rel="noopener noreferrer" for security reasons. CSS Separation: Inlined styles for demonstration purposes but recommended moving them to a separate stylesheet for better separation of concerns. * Update index.html * Update index.html * Update index.html * Update index.html * Update index.html * Update index.html --------- Co-authored-by: Yudong Jin --- docs/index.html | 77 ++++++++++------------------ en/docs/index.html | 109 ++++++++++++++-------------------------- zh-hant/docs/index.html | 83 +++++++++++------------------- 3 files changed, 91 insertions(+), 178 deletions(-) diff --git a/docs/index.html b/docs/index.html index 146e0aefb..f97ab5cba 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,30 +1,24 @@ - -
+ +
- - + + 初识算法 - + 复杂度 - + 数组与链表 - + 栈与队列 @@ -52,8 +46,7 @@ 排序 - + 分治 @@ -61,8 +54,7 @@ 回溯 - + 动态规划 @@ -73,25 +65,20 @@ @@ -148,8 +133,7 @@
获取纸质书 - +
@@ -162,8 +146,7 @@
在线阅读 - +
@@ -174,8 +157,7 @@
下载 PDF - +
@@ -209,8 +191,7 @@
- +

动画图解

@@ -227,8 +208,7 @@
- +

一键运行

@@ -243,8 +223,7 @@
- +

互助学习

@@ -280,16 +259,14 @@
- Reviewer: curtishd + Reviewer: curtishd
curtishd
Kotlin
@@ -338,8 +315,7 @@
- Reviewer: night-cruise + Reviewer: night-cruise
night-cruise
Rust
@@ -373,9 +349,8 @@

贡献者

本书在开源社区一百多位贡献者的共同努力下不断完善,感谢他们付出的时间与精力!

- Contributors + Contributors
-
\ No newline at end of file +
diff --git a/en/docs/index.html b/en/docs/index.html index 07a650021..e6910529d 100644 --- a/en/docs/index.html +++ b/en/docs/index.html @@ -1,30 +1,24 @@ - -
+ +
- - + + Encounter with Algorithms - + Complexity analysis - + Array and linked list - + Stack and queue @@ -52,8 +46,7 @@ Sorting - + Divide and conquer @@ -61,8 +54,7 @@ Backtracking - + Dynamic programming @@ -73,25 +65,20 @@ @@ -148,8 +133,7 @@
Paperbook - +
@@ -162,8 +146,7 @@
Read online - +
@@ -174,8 +157,7 @@
Download PDF - +
@@ -209,8 +191,7 @@
- +

Animated illustrations

@@ -227,8 +208,7 @@
- +

Off-the-shelf code

@@ -243,8 +223,7 @@
- +

Learning together

@@ -280,16 +259,14 @@
- Reviewer: curtishd + Reviewer: curtishd
curtishd
Kotlin
@@ -338,8 +315,7 @@
- Reviewer: night-cruise + Reviewer: night-cruise
night-cruise
Rust
@@ -374,71 +350,61 @@
@@ -448,11 +414,10 @@

Contributors

-

This book has been enhanced through the collaborative efforts of more than 100 contributors. Thanks for their invaluable time and input!

+

This book has been optimized by the efforts of over 180 contributors. We sincerely thank them for their invaluable time and contributions!

- Contributors + Contributors
-
\ No newline at end of file +
diff --git a/zh-hant/docs/index.html b/zh-hant/docs/index.html index 72dce4b1c..681f66b53 100644 --- a/zh-hant/docs/index.html +++ b/zh-hant/docs/index.html @@ -1,30 +1,24 @@ - -
+ +
- - + + 初識演算法 - + 複雜度 - + 陣列與鏈結串列 - + 堆疊與佇列 @@ -52,8 +46,7 @@ 排序 - + 分治 @@ -61,8 +54,7 @@ 回溯 - + 動態規劃 @@ -73,25 +65,20 @@ @@ -148,8 +133,7 @@
紙質書(簡中) - +
@@ -162,8 +146,7 @@
線上閱讀 - +
@@ -174,8 +157,7 @@
PDF(簡中) - +
@@ -209,8 +191,7 @@
- +

動畫圖解

@@ -227,8 +208,7 @@
- +

一鍵執行

@@ -243,8 +223,7 @@
- +

互助學習

@@ -280,16 +259,14 @@
- Reviewer: curtishd + Reviewer: curtishd
curtishd
Kotlin
@@ -338,8 +315,7 @@
- Reviewer: night-cruise + Reviewer: night-cruise
night-cruise
Rust
@@ -374,15 +350,13 @@
@@ -394,9 +368,8 @@

貢獻者

本書在開源社群一百多位貢獻者的共同努力下不斷完善,感謝他們付出的時間與精力!

- Contributors + Contributors
-
\ No newline at end of file +
From 2a9db6d0394847bd509939b15ffc67ab4ebfb1dc Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Mon, 25 Nov 2024 19:21:11 +0800 Subject: [PATCH 8/8] Bug fixes and improvements (#1572) * Sync zh and zh-hant versions. * Remove the polyfill.io link from mkdocs.yml * Update contributors' info for code reviewers and en/zh-hant versions reviewers. * Fix graph.md * Update avatars for English version reviewers. * Sync zh and zh-hant versions. * Fix two_sum_brute_force.png * Sync zh and zh-hant versions. Optimize structrue of index.html. * Format index.html --- .../two_sum_brute_force.png | Bin 13071 -> 13087 bytes docs/index.html | 2 +- .../two_sum_brute_force.png | Bin 15075 -> 13263 bytes en/docs/index.html | 2 +- zh-hant/codes/c/chapter_searching/two_sum.c | 10 +- .../codes/c/chapter_sorting/counting_sort.c | 1 + zh-hant/codes/c/chapter_sorting/radix_sort.c | 6 +- .../min_path_sum.cs | 8 +- zh-hant/codes/csharp/chapter_heap/heap.cs | 4 +- .../min_path_sum.dart | 8 +- .../min_path_sum_test.go | 8 +- .../min_path_sum.py | 8 +- .../min_path_sum.rb | 8 +- .../chapter_array_and_linkedlist/array.rs | 3 +- .../linked_list.rs | 4 +- .../rust/chapter_array_and_linkedlist/list.rs | 3 +- .../chapter_array_and_linkedlist/my_list.rs | 2 +- .../preorder_traversal_i_compact.rs | 4 +- .../preorder_traversal_ii_compact.rs | 4 +- .../preorder_traversal_iii_compact.rs | 4 +- .../preorder_traversal_iii_template.rs | 4 +- .../space_complexity.rs | 5 +- .../worst_best_time_complexity.rs | 3 +- .../chapter_divide_and_conquer/build_tree.rs | 3 +- .../chapter_graph/graph_adjacency_list.rs | 2 +- .../rust/chapter_hashing/build_in_hash.rs | 3 +- .../codes/rust/chapter_hashing/hash_map.rs | 2 +- zh-hant/codes/rust/chapter_heap/heap.rs | 2 +- zh-hant/codes/rust/chapter_heap/my_heap.rs | 2 +- zh-hant/codes/rust/chapter_heap/top_k.rs | 2 +- .../rust/chapter_searching/hashing_search.rs | 4 +- .../rust/chapter_searching/linear_search.rs | 4 +- .../codes/rust/chapter_searching/two_sum.rs | 3 +- .../codes/rust/chapter_sorting/bubble_sort.rs | 2 +- .../codes/rust/chapter_sorting/bucket_sort.rs | 2 +- .../rust/chapter_sorting/counting_sort.rs | 2 +- .../codes/rust/chapter_sorting/heap_sort.rs | 2 +- .../rust/chapter_sorting/insertion_sort.rs | 2 +- .../codes/rust/chapter_sorting/radix_sort.rs | 2 +- .../rust/chapter_sorting/selection_sort.rs | 2 +- .../chapter_stack_and_queue/array_deque.rs | 4 +- .../chapter_stack_and_queue/array_stack.rs | 2 +- .../rust/chapter_stack_and_queue/deque.rs | 3 +- .../linkedlist_deque.rs | 2 +- .../linkedlist_queue.rs | 3 +- .../linkedlist_stack.rs | 3 +- .../rust/chapter_stack_and_queue/queue.rs | 2 +- .../rust/chapter_stack_and_queue/stack.rs | 2 +- .../rust/chapter_tree/array_binary_tree.rs | 13 +-- zh-hant/codes/rust/chapter_tree/avl_tree.rs | 3 +- .../rust/chapter_tree/binary_search_tree.rs | 12 +- .../codes/rust/chapter_tree/binary_tree.rs | 3 +- .../rust/chapter_tree/binary_tree_bfs.rs | 4 +- .../rust/chapter_tree/binary_tree_dfs.rs | 50 ++++++--- zh-hant/codes/rust/src/include/list_node.rs | 57 ++++++++++ zh-hant/codes/rust/src/include/mod.rs | 16 +++ zh-hant/codes/rust/src/include/print_util.rs | 103 ++++++++++++++++++ zh-hant/codes/rust/src/include/tree_node.rs | 92 ++++++++++++++++ zh-hant/codes/rust/src/include/vertex.rs | 21 ++++ zh-hant/codes/rust/src/lib.rs | 1 + .../min_path_sum.swift | 8 +- zh-hant/docs/chapter_heap/heap.md | 4 +- .../two_sum_brute_force.png | Bin 14870 -> 13209 bytes zh-hant/docs/chapter_tree/avl_tree.md | 2 +- zh-hant/docs/index.html | 2 +- 65 files changed, 414 insertions(+), 140 deletions(-) create mode 100644 zh-hant/codes/rust/src/include/list_node.rs create mode 100644 zh-hant/codes/rust/src/include/mod.rs create mode 100644 zh-hant/codes/rust/src/include/print_util.rs create mode 100644 zh-hant/codes/rust/src/include/tree_node.rs create mode 100644 zh-hant/codes/rust/src/include/vertex.rs create mode 100644 zh-hant/codes/rust/src/lib.rs diff --git a/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 33fca976ab7f3704de7bd37cfc08319341cd410b..a9db1579dde2da50a6b57e4bc2cfdef2d5466827 100644 GIT binary patch literal 13087 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 literal 13071 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 z - + \ No newline at end of file diff --git a/en/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/en/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 6e942957ada76c5fbb8446d7940fd4d55a54c3d9..8481ea4eccb6b4655ce4e66fed53043ce788542d 100644 GIT binary patch literal 13263 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 literal 15075 zcmd6OcQ{;K*Y}wjJz6A^=t2-gNknue5hVoCdr1UA^xg+a5S{2fh#G|Gh7rB@-bU}e zm*G3^`+lGIdEe{${&@cQuIoG3aAwBd`|P#$TEF#MYi|K>d8=iqgEes*?tetLR# za&mHfc6@kxbaZ^Ycf5Cac({LXad2?3d%UxCw6%4(wQ;bqw|}&^x3{~yyS;O?w!gNr zx3amly|J;ezP`S)ak{d)w!FMNzdeuMnwi~1&uq@jtSyYJj0`Rh_Am7>E-sENq8Anx z=I6oJ{M`J)+}zyk+`{ba?9AL28jYTwS(urbnVy~=nnicab+pVhk4&sjO-)TsPEJfr zjE|3xjg5_rj*pCt3=a{M@^zolXbnro81E|0|Nscearp*{e69XsIj`< z-rkm;?Vg^V?(XhC?Q30KU7eks9UUF*?d@%CZLO`XEiEmmW^{9Nb5m1OV`F1OL&Kjx zf9mV&Q7BaPSXKE*dF4<=$x!j{!IGkZ!ovQ7{GPn*o~(?njPIRkRBv$M0ZvNAI>)6>(_($Z2= zQj(IA;P|Q#;L@_#6(3!MMg$OL_~y#hlhoQ zg@%TPgoFeK2L}ZOef|11ARxf|+oV(An7_ZjpP%2CFJC@=`sD5HjX)qgJw45QCJf!i zOgsnO+}vDUU0qyUoSd8-931TJ?d|OBY;0_-t*x!BtSl`pEi5cPe*9=|Zm#bgwv~=xA$eOTX_I z)#(+`=+V;B($v&cS65e4Q&Uw{eX7#^M5&AGO&5oJmx_vtl9H05qN0L=g1o%EoSfY2 z*RN$|Wo2Y!UcGuHEiEl2B_$~-DIp>8^5si$aq$-~UOa#P91e$ziHV7dii(Jc2n!1f z2?_n$&6@-OzT{UgpQ|{JZ%*B?k37Vj>{>YjQ(R^VCRzx!vy$zNjm-Alz>)Xgln zMJ|{|KEt<2Ydd!cd0?6>oBY({d@|zUwNL(kdcmX2RMC3ocIz1SB~4*Q!0b=lacCcG~WPOqRGEZzVbQ4Q~zdIdPIa z+Zmgxj!CIL8kn0yj;v`r#H^bO#aN6X-MmG%BtkdJ;z_4eQH zAu>4n^I5Lb$h-B8rvQ*EfM|OA!z%@+aJvGfo9E^jh=ClWLj<4;Bh$JbUW>d#a-=3P4dq=L6>5$X!t8LfvH zEEI5?hX{54q;bu29+Nb2cyn%887ItiUriYDv1li@2DOa?KMb72%~l6SR#io&8fj*M z0_`G$FYb~|*P|D*Miso6fCo7|psaZ0c8X;a7Y@7&=Z$W$ zdqd_mG>PmK4_(@u2q?ye|it#r9$O7ehD!e zBen&k!OgiO?Z)b5k9bHDBVyBmn1$9hw@dnmib_*lF$?F>VHUueU6SE!yXqlRVnVLlQxv zeiDVBbaZThW#n-gh8Zo`vLJeG15->(gLjjvdDh1{1|c;DvcG}xJiie^lZHpi?Sv)h z*T{DjhLv{5TF3UQ4`_X<;C0e;c4OM_AJtI+L!1qX7d7)^9Mx9E>gz`zbxgMLYEpFo zxzi)dF-l>QopI#R2cZ{P^`lO8hZ`XrEH_cZVy$S}d1l%8Ak6`tDN23{PGQqc! zYYPe5l@FWq60*XxEMj!-K6r)oW{QnrhNkx_X#Ne5h@W+`dBi{E1jzHOJ5D

}#HE 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 UU zHSq#WV;j4B4Udd|14}Exuk2=ip3R+aSOYVT#NS@tFaV8Jx=q^c@e4X8kh&^?)OATC z5R5j9y38&3Hdzcl+Cpt?v5cYNNZaG|hMQ3@mbK;}5T7D? zY_}fMt!Qw5;?IeWS{HQ?bWReG&d=H{Nx225p9PMDI490EF^BrAB1?()T&e{@lkn7Ic7C19o2SP4Q6;}$>UDgjg|Cy} z+~*A5*iMXGn*<8N)A`;@kbp9rUH-$F*>9)oW$yh&aV3T){Jzf6j;$Wky3HI-o#d^#!{l zAe-?r)b_)hK|qVkkC-MFma+X6OV8d<+x~Uo=<1c|+Pfw^G+B67Vieb@-Aka0ay9^> z2)lP!z{GOEuv*#%OCw>?HJZlD@;VC^h(7nmnz>Z80YoBKkAJrAGS)l!XzWk2#(q9{ z^lN#($VYZtb8Cmn)rsHliKF)Lp^!N4vt;%<{ho9AF#W1+tg-4x)crdN(s=Y?Z-Ac@ zPOHfttJFCgC!e}g+)GFHbx2iM+C1~k zNLFX{yW7=G^1#ogtD(pfkTHKPF$wUMUBlx9Lvllb*Fea)o$I;7NnO{u5O|hP7Pb04?}}mAw?c2mElB`kZ2qBUT{tDc6=UV6 z-}Ic6z71f|O9O^eXWfP|{Z+O>>EV6+wq}N4R2ITLBCX(M7SRfXw z2S0osZw3;3^h3OA0OAM*$^1u{uPy?}Ll|I_8jzFbgNISS^1NN4gF~KQ0R(twxNqPY zsm~IjL}BnfT+~pu5mmSUtKE}Q(^r@ON!c2%$#GuJxgS~MW!Lvn+Ov|~f&n^O zx$U18U8`2O?Ee-?B|&5mSwm@;0S&o*`#BN?)LE@kqKPD3oBJ{@Oq z_=a3ofhWCq2~P0u6B3m()WYq9Y$ieaYW7mvYH8kDejMxK48E|8L z?|5Tzl3c~a+Vi;nQkLTTS=P{Fsblz6t5J68s+Dt%a_jV)(N9af|l5 zI?zF)<1|_1%9ifpEO>Y^HPq|PW<^-X2n=Nu)SYK~US+C>=BRJUNWKKT)?VhPi{-tF zl*Q1bV-;1`#r1n{WN3x{T8%dP-Q7;{_`$na+DkPVqI=pb!qzYSefcJ<*G}yQ(Y0%4 z;7O=)!u2VSm7*;VT**o$QG|=9w&geA&dECKP-jY3{Nfm8E{-^69w#)I(7^nP=&ttV zg}*oBvnDQwf(oabaA2sQC)E>qKFOV7@{N5FHaeCvrDcAH32}NUd2`)HGP%x9gqQmX zA~&>PIn1~Z$8xjB_MeWNP6sR9Q&PcQ0k#r3OTM^Ig9r_%+}8O))_?-ZlmfopY9#oHQR23R-HSQ>FGs<(O-Y4-l=$_j+_GJD&D+= zIao_Od|h$jF>c?9r*HbyaWHc@_Wt1?<*k*vDhIBsQRdmVYrzykMG6W@NPlnNlHP<` zSV?t|8AVkfctp^#3v@j@9Vg)XZQNxU& zS|pR_CyRRcuZlS5iy6LDR;bTh8g?~XI-}8#RHmj4FD|L#KX2vcsXxQLlTDj`N)F-Y zT^r&!kF4rit2pM(TSxY1>&3mLdfI - + \ No newline at end of file diff --git a/zh-hant/codes/c/chapter_searching/two_sum.c b/zh-hant/codes/c/chapter_searching/two_sum.c index 30f32dd9e..b753b354a 100644 --- a/zh-hant/codes/c/chapter_searching/two_sum.c +++ b/zh-hant/codes/c/chapter_searching/two_sum.c @@ -37,12 +37,12 @@ HashTable *find(HashTable *h, int key) { } /* 雜湊表元素插入 */ -void insert(HashTable *h, int key, int val) { - HashTable *t = find(h, key); +void insert(HashTable **h, int key, int val) { + HashTable *t = find(*h, key); if (t == NULL) { HashTable *tmp = malloc(sizeof(HashTable)); tmp->key = key, tmp->val = val; - HASH_ADD_INT(h, key, tmp); + HASH_ADD_INT(*h, key, tmp); } else { t->val = val; } @@ -59,7 +59,7 @@ int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) { *returnSize = 2; return res; } - insert(hashtable, nums[i], i); + insert(&hashtable, nums[i], i); } *returnSize = 0; return NULL; @@ -83,4 +83,4 @@ int main() { printArray(res, returnSize); return 0; -} +} \ No newline at end of file diff --git a/zh-hant/codes/c/chapter_sorting/counting_sort.c b/zh-hant/codes/c/chapter_sorting/counting_sort.c index 3c887a981..ba1759fab 100644 --- a/zh-hant/codes/c/chapter_sorting/counting_sort.c +++ b/zh-hant/codes/c/chapter_sorting/counting_sort.c @@ -65,6 +65,7 @@ void countingSort(int nums[], int size) { // 使用結果陣列 res 覆蓋原陣列 nums memcpy(nums, res, size * sizeof(int)); // 5. 釋放記憶體 + free(res); free(counter); } diff --git a/zh-hant/codes/c/chapter_sorting/radix_sort.c b/zh-hant/codes/c/chapter_sorting/radix_sort.c index 6598dd0e7..cdb7effb9 100644 --- a/zh-hant/codes/c/chapter_sorting/radix_sort.c +++ b/zh-hant/codes/c/chapter_sorting/radix_sort.c @@ -16,6 +16,7 @@ int digit(int num, int exp) { void countingSortDigit(int nums[], int size, int exp) { // 十進位制的位範圍為 0~9 ,因此需要長度為 10 的桶陣列 int *counter = (int *)malloc((sizeof(int) * 10)); + memset(counter, 0, sizeof(int) * 10); // 初始化為 0 以支持後續記憶體釋放 // 統計 0~9 各數字的出現次數 for (int i = 0; i < size; i++) { // 獲取 nums[i] 第 k 位,記為 d @@ -39,13 +40,16 @@ void countingSortDigit(int nums[], int size, int exp) { for (int i = 0; i < size; i++) { nums[i] = res[i]; } + // 釋放記憶體 + free(res); + free(counter); } /* 基數排序 */ void radixSort(int nums[], int size) { // 獲取陣列的最大元素,用於判斷最大位數 int max = INT32_MIN; - for (size_t i = 0; i < size - 1; i++) { + for (int i = 0; i < size; i++) { if (nums[i] > max) { max = nums[i]; } diff --git a/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs b/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs index c25f149d8..f3f77e09c 100644 --- a/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs +++ b/zh-hant/codes/csharp/chapter_dynamic_programming/min_path_sum.cs @@ -105,7 +105,7 @@ public class min_path_sum { // 暴力搜尋 int res = MinPathSumDFS(grid, n - 1, m - 1); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 記憶化搜尋 int[][] mem = new int[n][]; @@ -114,14 +114,14 @@ public class min_path_sum { Array.Fill(mem[i], -1); } res = MinPathSumDFSMem(grid, mem, n - 1, m - 1); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 動態規劃 res = MinPathSumDP(grid); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); // 空間最佳化後的動態規劃 res = MinPathSumDPComp(grid); - Console.WriteLine("從左上角到右下角的做小路徑和為 " + res); + Console.WriteLine("從左上角到右下角的最小路徑和為 " + res); } } diff --git a/zh-hant/codes/csharp/chapter_heap/heap.cs b/zh-hant/codes/csharp/chapter_heap/heap.cs index ac8b34d54..71289029e 100644 --- a/zh-hant/codes/csharp/chapter_heap/heap.cs +++ b/zh-hant/codes/csharp/chapter_heap/heap.cs @@ -24,8 +24,8 @@ public class heap { /* 初始化堆積 */ // 初始化小頂堆積 PriorityQueue minHeap = new(); - // 初始化大頂堆積(使用 lambda 表示式修改 Comparator 即可) - PriorityQueue maxHeap = new(Comparer.Create((x, y) => y - x)); + // 初始化大頂堆積(使用 lambda 表示式修改 Comparer 即可) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); Console.WriteLine("以下測試樣例為大頂堆積"); /* 元素入堆積 */ diff --git a/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart b/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart index 4cf15a754..6e897cb68 100644 --- a/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart +++ b/zh-hant/codes/dart/chapter_dynamic_programming/min_path_sum.dart @@ -103,18 +103,18 @@ void main() { // 暴力搜尋 int res = minPathSumDFS(grid, n - 1, m - 1); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 記憶化搜尋 List> mem = List.generate(n, (i) => List.filled(m, -1)); res = minPathSumDFSMem(grid, mem, n - 1, m - 1); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 動態規劃 res = minPathSumDP(grid); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid); - print("從左上角到右下角的做小路徑和為 $res"); + print("從左上角到右下角的最小路徑和為 $res"); } diff --git a/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go b/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go index 9a57c6c31..e8e8ce51a 100644 --- a/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go +++ b/zh-hant/codes/go/chapter_dynamic_programming/min_path_sum_test.go @@ -20,7 +20,7 @@ func TestMinPathSum(t *testing.T) { // 暴力搜尋 res := minPathSumDFS(grid, n-1, m-1) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 記憶化搜尋 mem := make([][]int, n) @@ -31,13 +31,13 @@ func TestMinPathSum(t *testing.T) { } } res = minPathSumDFSMem(grid, mem, n-1, m-1) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 動態規劃 res = minPathSumDP(grid) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid) - fmt.Printf("從左上角到右下角的做小路徑和為 %d\n", res) + fmt.Printf("從左上角到右下角的最小路徑和為 %d\n", res) } diff --git a/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py b/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py index 97d20e9d8..f202abcae 100644 --- a/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py +++ b/zh-hant/codes/python/chapter_dynamic_programming/min_path_sum.py @@ -88,17 +88,17 @@ if __name__ == "__main__": # 暴力搜尋 res = min_path_sum_dfs(grid, n - 1, m - 1) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 記憶化搜尋 mem = [[-1] * m for _ in range(n)] res = min_path_sum_dfs_mem(grid, mem, n - 1, m - 1) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 動態規劃 res = min_path_sum_dp(grid) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") # 空間最佳化後的動態規劃 res = min_path_sum_dp_comp(grid) - print(f"從左上角到右下角的做小路徑和為 {res}") + print(f"從左上角到右下角的最小路徑和為 {res}") diff --git a/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb b/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb index 32591613e..141d1b92d 100644 --- a/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb +++ b/zh-hant/codes/ruby/chapter_dynamic_programming/min_path_sum.rb @@ -76,18 +76,18 @@ if __FILE__ == $0 # 暴力搜尋 res = min_path_sum_dfs(grid, n - 1, m - 1) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 記憶化搜尋 mem = Array.new(n) { Array.new(m, - 1) } res = min_path_sum_dfs_mem(grid, mem, n - 1, m -1) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 動態規劃 res = min_path_sum_dp(grid) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" # 空間最佳化後的動態規劃 res = min_path_sum_dp_comp(grid) - puts "從左上角到右下角的做小路徑和為 #{res}" + puts "從左上角到右下角的最小路徑和為 #{res}" end diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs index f276b6d74..1184dcfff 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/array.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use rand::Rng; /* 隨機訪問元素 */ diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs index d9020ed8c..916cb5121 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/linked_list.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::{print_util, ListNode}; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs index dd0d8706b..e7ab8b05a 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/list.rs @@ -3,8 +3,7 @@ * Created Time: 2023-01-18 * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ - -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* Driver Code */ fn main() { diff --git a/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs b/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs index 04a8a6612..8c6991d64 100644 --- a/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs +++ b/zh-hant/codes/rust/chapter_array_and_linkedlist/my_list.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 串列類別 */ #[allow(dead_code)] diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs index 7e94e8c53..cae60f54d 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題一 */ fn pre_order(res: &mut Vec>>, root: Option<&Rc>>) { diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs index d709738a0..b627ebae2 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_ii_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題二 */ fn pre_order( diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs index f61b86288..9e449bdbb 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪:例題三 */ fn pre_order( diff --git a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs index 8b7deff79..7a1663b7d 100644 --- a/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs +++ b/zh-hant/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs @@ -4,10 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 判斷當前狀態是否為解 */ fn is_solution(state: &mut Vec>>) -> bool { diff --git a/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs b/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs index d542f2be2..a21f08bdf 100644 --- a/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs +++ b/zh-hant/codes/rust/chapter_computational_complexity/space_complexity.rs @@ -4,13 +4,10 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::{print_util, ListNode, TreeNode}; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; -use tree_node::TreeNode; /* 函式 */ fn function() -> i32 { diff --git a/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs b/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs index f54e7c734..ab912d9ed 100644 --- a/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs +++ b/zh-hant/codes/rust/chapter_computational_complexity/worst_best_time_complexity.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use rand::seq::SliceRandom; use rand::thread_rng; diff --git a/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs b/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs index 96aa1c61b..4bf9f73d8 100644 --- a/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs +++ b/zh-hant/codes/rust/chapter_divide_and_conquer/build_tree.rs @@ -4,10 +4,9 @@ * Author: codingonion (coderonion@gmail.com) */ +use hello_algo_rust::include::{print_util, TreeNode}; use std::collections::HashMap; use std::{cell::RefCell, rc::Rc}; -include!("../include/include.rs"); -use tree_node::TreeNode; /* 構建二元樹:分治 */ fn dfs( diff --git a/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs b/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs index 07b02caa6..c06e5fae9 100644 --- a/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs +++ b/zh-hant/codes/rust/chapter_graph/graph_adjacency_list.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/vertex.rs"); +pub use hello_algo_rust::include::{vals_to_vets, vets_to_vals, Vertex}; use std::collections::HashMap; diff --git a/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs b/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs index 47e327619..f4dee23bd 100644 --- a/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs +++ b/zh-hant/codes/rust/chapter_hashing/build_in_hash.rs @@ -4,9 +4,8 @@ * Author: WSL0809 (wslzzy@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::ListNode; -use crate::list_node::ListNode; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; diff --git a/zh-hant/codes/rust/chapter_hashing/hash_map.rs b/zh-hant/codes/rust/chapter_hashing/hash_map.rs index ad32c45eb..330f66c8c 100644 --- a/zh-hant/codes/rust/chapter_hashing/hash_map.rs +++ b/zh-hant/codes/rust/chapter_hashing/hash_map.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::HashMap; diff --git a/zh-hant/codes/rust/chapter_heap/heap.rs b/zh-hant/codes/rust/chapter_heap/heap.rs index 979e83e14..1bf198cea 100644 --- a/zh-hant/codes/rust/chapter_heap/heap.rs +++ b/zh-hant/codes/rust/chapter_heap/heap.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::BinaryHeap; diff --git a/zh-hant/codes/rust/chapter_heap/my_heap.rs b/zh-hant/codes/rust/chapter_heap/my_heap.rs index 7a3652a8d..493986a7a 100644 --- a/zh-hant/codes/rust/chapter_heap/my_heap.rs +++ b/zh-hant/codes/rust/chapter_heap/my_heap.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 大頂堆積 */ struct MaxHeap { diff --git a/zh-hant/codes/rust/chapter_heap/top_k.rs b/zh-hant/codes/rust/chapter_heap/top_k.rs index d978b7c8a..d16a3c28e 100644 --- a/zh-hant/codes/rust/chapter_heap/top_k.rs +++ b/zh-hant/codes/rust/chapter_heap/top_k.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cmp::Reverse; use std::collections::BinaryHeap; diff --git a/zh-hant/codes/rust/chapter_searching/hashing_search.rs b/zh-hant/codes/rust/chapter_searching/hashing_search.rs index 1f8e6ead4..d2b94c7a9 100644 --- a/zh-hant/codes/rust/chapter_searching/hashing_search.rs +++ b/zh-hant/codes/rust/chapter_searching/hashing_search.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::ListNode; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_searching/linear_search.rs b/zh-hant/codes/rust/chapter_searching/linear_search.rs index e731bf1d0..1ef589ccc 100644 --- a/zh-hant/codes/rust/chapter_searching/linear_search.rs +++ b/zh-hant/codes/rust/chapter_searching/linear_search.rs @@ -4,9 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - -use list_node::ListNode; +use hello_algo_rust::include::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_searching/two_sum.rs b/zh-hant/codes/rust/chapter_searching/two_sum.rs index 3cf044dbe..5192d3acc 100644 --- a/zh-hant/codes/rust/chapter_searching/two_sum.rs +++ b/zh-hant/codes/rust/chapter_searching/two_sum.rs @@ -4,8 +4,7 @@ * Author: xBLACICEx (xBLACKICEx@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use std::collections::HashMap; /* 方法一:暴力列舉 */ diff --git a/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs b/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs index f68602589..8a8902317 100644 --- a/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/bubble_sort.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 泡沫排序 */ fn bubble_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs b/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs index c85d64f87..5efbebe1d 100644 --- a/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/bucket_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 桶排序 */ fn bucket_sort(nums: &mut [f64]) { diff --git a/zh-hant/codes/rust/chapter_sorting/counting_sort.rs b/zh-hant/codes/rust/chapter_sorting/counting_sort.rs index e854b88bb..eac4c3f6d 100644 --- a/zh-hant/codes/rust/chapter_sorting/counting_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/counting_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 計數排序 */ // 簡單實現,無法用於排序物件 diff --git a/zh-hant/codes/rust/chapter_sorting/heap_sort.rs b/zh-hant/codes/rust/chapter_sorting/heap_sort.rs index 2d71c348c..db1cbc95c 100644 --- a/zh-hant/codes/rust/chapter_sorting/heap_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/heap_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 堆積的長度為 n ,從節點 i 開始,從頂至底堆積化 */ fn sift_down(nums: &mut [i32], n: usize, mut i: usize) { diff --git a/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs b/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs index a804c668a..f99716f87 100644 --- a/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/insertion_sort.rs @@ -4,7 +4,7 @@ * Author: xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 插入排序 */ fn insertion_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_sorting/radix_sort.rs b/zh-hant/codes/rust/chapter_sorting/radix_sort.rs index d818a58f1..b991e915f 100644 --- a/zh-hant/codes/rust/chapter_sorting/radix_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/radix_sort.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 獲取元素 num 的第 k 位,其中 exp = 10^(k-1) */ fn digit(num: i32, exp: i32) -> usize { diff --git a/zh-hant/codes/rust/chapter_sorting/selection_sort.rs b/zh-hant/codes/rust/chapter_sorting/selection_sort.rs index 70f51dce0..9c47336a7 100644 --- a/zh-hant/codes/rust/chapter_sorting/selection_sort.rs +++ b/zh-hant/codes/rust/chapter_sorting/selection_sort.rs @@ -4,7 +4,7 @@ * Author: WSL0809 (wslzzy@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 選擇排序 */ fn selection_sort(nums: &mut [i32]) { diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs index f9308ea7d..5dbe16ef1 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/array_deque.rs @@ -3,9 +3,7 @@ * Created Time: 2023-03-11 * Author: codingonion (coderonion@gmail.com) */ - -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; /* 基於環形陣列實現的雙向佇列 */ struct ArrayDeque { nums: Vec, // 用於儲存雙向佇列元素的陣列 diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs index 8eaa0117e..6a850f8c7 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/array_stack.rs @@ -4,7 +4,7 @@ * Author: WSL0809 (wslzzy@outlook.com), codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* 基於陣列實現的堆疊 */ struct ArrayStack { diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs index 287808cc1..e5ad4abe1 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/deque.rs @@ -4,8 +4,7 @@ * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); - +use hello_algo_rust::include::print_util; use std::collections::VecDeque; /* Driver Code */ diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs index 93e288531..bbc7a5588 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_deque.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs index d12329002..4e114e70d 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_queue.rs @@ -4,9 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, ListNode}; -use list_node::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs index d5ca545ba..ac07580fb 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/linkedlist_stack.rs @@ -4,9 +4,8 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, ListNode}; -use list_node::ListNode; use std::cell::RefCell; use std::rc::Rc; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs b/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs index 10e0d1b59..2605a4111 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/queue.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::collections::VecDeque; diff --git a/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs b/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs index cc871dbdd..83f895c71 100644 --- a/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs +++ b/zh-hant/codes/rust/chapter_stack_and_queue/stack.rs @@ -4,7 +4,7 @@ * Author: codingonion (coderonion@gmail.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; /* Driver Code */ pub fn main() { diff --git a/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs b/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs index 2a60242a3..a7f32721d 100644 --- a/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/array_binary_tree.rs @@ -4,7 +4,7 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, tree_node}; /* 陣列表示下的二元樹類別 */ struct ArrayBinaryTree { @@ -49,18 +49,11 @@ impl ArrayBinaryTree { /* 層序走訪 */ fn level_order(&self) -> Vec { - let mut res = vec![]; - // 直接走訪陣列 - for i in 0..self.size() { - if let Some(val) = self.val(i) { - res.push(val) - } - } - res + self.tree.iter().filter_map(|&x| x).collect() } /* 深度優先走訪 */ - fn dfs(&self, i: i32, order: &str, res: &mut Vec) { + fn dfs(&self, i: i32, order: &'static str, res: &mut Vec) { if self.val(i).is_none() { return; } diff --git a/zh-hant/codes/rust/chapter_tree/avl_tree.rs b/zh-hant/codes/rust/chapter_tree/avl_tree.rs index c414a06e4..eb48530cf 100644 --- a/zh-hant/codes/rust/chapter_tree/avl_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/avl_tree.rs @@ -4,12 +4,11 @@ * Author: night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, TreeNode}; use std::cell::RefCell; use std::cmp::Ordering; use std::rc::Rc; -use tree_node::TreeNode; type OptionTreeNodeRc = Option>>; diff --git a/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs b/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs index 99bf6ae61..1186f6bca 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_search_tree.rs @@ -4,13 +4,13 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com)、night-cruise (2586447362@qq.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::print_util; use std::cell::RefCell; use std::cmp::Ordering; use std::rc::Rc; -use tree_node::TreeNode; +use hello_algo_rust::include::TreeNode; type OptionTreeNodeRc = Option>>; @@ -126,7 +126,7 @@ impl BinarySearchTree { // 刪除節點 cur if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) { let left = pre.borrow().left.clone(); - if left.is_some() && Rc::ptr_eq(&left.as_ref().unwrap(), &cur) { + if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) { pre.borrow_mut().left = child; } else { pre.borrow_mut().right = child; @@ -147,11 +147,11 @@ impl BinarySearchTree { break; } } - let tmpval = tmp.unwrap().borrow().val; + let tmp_val = tmp.unwrap().borrow().val; // 遞迴刪除節點 tmp - self.remove(tmpval); + self.remove(tmp_val); // 用 tmp 覆蓋 cur - cur.borrow_mut().val = tmpval; + cur.borrow_mut().val = tmp_val; } } } diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree.rs b/zh-hant/codes/rust/chapter_tree/binary_tree.rs index f87b7f891..22da1089a 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree.rs @@ -4,8 +4,7 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ use std::rc::Rc; -include!("../include/include.rs"); -use tree_node::TreeNode; +use hello_algo_rust::include::{print_util, TreeNode}; /* Driver Code */ fn main() { diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs b/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs index 01a19adfd..20ef8b005 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree_bfs.rs @@ -4,11 +4,11 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; use std::collections::VecDeque; use std::{cell::RefCell, rc::Rc}; -use tree_node::{vec_to_tree, TreeNode}; /* 層序走訪 */ fn level_order(root: &Rc>) -> Vec { diff --git a/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs b/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs index dc0c00564..35f236d0a 100644 --- a/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs +++ b/zh-hant/codes/rust/chapter_tree/binary_tree_dfs.rs @@ -4,22 +4,27 @@ * Author: xBLACKICEx (xBLACKICE@outlook.com) */ -include!("../include/include.rs"); +use hello_algo_rust::include::{print_util, vec_to_tree, TreeNode}; +use hello_algo_rust::op_vec; use std::cell::RefCell; use std::rc::Rc; -use tree_node::{vec_to_tree, TreeNode}; /* 前序走訪 */ fn pre_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:根節點 -> 左子樹 -> 右子樹 - result.push(node.borrow().val); - result.extend(pre_order(node.borrow().left.as_ref())); - result.extend(pre_order(node.borrow().right.as_ref())); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:根節點 -> 左子樹 -> 右子樹 + let node = node.borrow(); + res.push(node.val); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + } } + dfs(root, &mut result); + result } @@ -27,12 +32,17 @@ fn pre_order(root: Option<&Rc>>) -> Vec { fn in_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:左子樹 -> 根節點 -> 右子樹 - result.extend(in_order(node.borrow().left.as_ref())); - result.push(node.borrow().val); - result.extend(in_order(node.borrow().right.as_ref())); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:左子樹 -> 根節點 -> 右子樹 + let node = node.borrow(); + dfs(node.left.as_ref(), res); + res.push(node.val); + dfs(node.right.as_ref(), res); + } } + dfs(root, &mut result); + result } @@ -40,12 +50,18 @@ fn in_order(root: Option<&Rc>>) -> Vec { fn post_order(root: Option<&Rc>>) -> Vec { let mut result = vec![]; - if let Some(node) = root { - // 訪問優先順序:左子樹 -> 右子樹 -> 根節點 - result.extend(post_order(node.borrow().left.as_ref())); - result.extend(post_order(node.borrow().right.as_ref())); - result.push(node.borrow().val); + fn dfs(root: Option<&Rc>>, res: &mut Vec) { + if let Some(node) = root { + // 訪問優先順序:左子樹 -> 右子樹 -> 根節點 + let node = node.borrow(); + dfs(node.left.as_ref(), res); + dfs(node.right.as_ref(), res); + res.push(node.val); + } } + + dfs(root, &mut result); + result } diff --git a/zh-hant/codes/rust/src/include/list_node.rs b/zh-hant/codes/rust/src/include/list_node.rs new file mode 100644 index 000000000..941e334c3 --- /dev/null +++ b/zh-hant/codes/rust/src/include/list_node.rs @@ -0,0 +1,57 @@ +/* + * File: list_node.rs + * Created Time: 2023-03-05 + * Author: codingonion (coderonion@gmail.com), rongyi (hiarongyi@gmail.com) + */ + +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; + +#[derive(Debug)] +pub struct ListNode { + pub val: T, + pub next: Option>>>, +} + +impl ListNode { + pub fn new(val: T) -> Rc>> { + Rc::new(RefCell::new(ListNode { val, next: None })) + } + + /* 將陣列反序列化為鏈結串列 */ + pub fn arr_to_linked_list(array: &[T]) -> Option>>> + where + T: Copy + Clone, + { + let mut head = None; + // insert in reverse order + for item in array.iter().rev() { + let node = Rc::new(RefCell::new(ListNode { + val: *item, + next: head.take(), + })); + head = Some(node); + } + head + } + + /* 將鏈結串列轉化為雜湊表 */ + pub fn linked_list_to_hashmap( + linked_list: Option>>>, + ) -> HashMap>>> + where + T: std::hash::Hash + Eq + Copy + Clone, + { + let mut hashmap = HashMap::new(); + let mut node = linked_list; + + while let Some(cur) = node { + let borrow = cur.borrow(); + hashmap.insert(borrow.val.clone(), cur.clone()); + node = borrow.next.clone(); + } + + hashmap + } +} diff --git a/zh-hant/codes/rust/src/include/mod.rs b/zh-hant/codes/rust/src/include/mod.rs new file mode 100644 index 000000000..6cba6f9a5 --- /dev/null +++ b/zh-hant/codes/rust/src/include/mod.rs @@ -0,0 +1,16 @@ +/* + * File: include.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICE@outlook.com) + */ + +pub mod list_node; +pub mod print_util; +pub mod tree_node; +pub mod vertex; + +// rexport to include +pub use list_node::*; +pub use print_util::*; +pub use tree_node::*; +pub use vertex::*; diff --git a/zh-hant/codes/rust/src/include/print_util.rs b/zh-hant/codes/rust/src/include/print_util.rs new file mode 100644 index 000000000..fd93f3626 --- /dev/null +++ b/zh-hant/codes/rust/src/include/print_util.rs @@ -0,0 +1,103 @@ +/* + * File: print_util.rs + * Created Time: 2023-02-05 + * Author: codingonion (coderonion@gmail.com), xBLACKICEx (xBLACKICEx@outlook.com) + */ + +use std::cell::{Cell, RefCell}; +use std::fmt::Display; +use std::collections::{HashMap, VecDeque}; +use std::rc::Rc; + +use super::list_node::ListNode; +use super::tree_node::{TreeNode, vec_to_tree}; + +struct Trunk<'a, 'b> { + prev: Option<&'a Trunk<'a, 'b>>, + str: Cell<&'b str>, +} + +/* 列印陣列 */ +pub fn print_array(nums: &[T]) { + print!("["); + if nums.len() > 0 { + for (i, num) in nums.iter().enumerate() { + print!("{}{}", num, if i == nums.len() - 1 {"]"} else {", "} ); + } + } else { + print!("]"); + } +} + +/* 列印雜湊表 */ +pub fn print_hash_map(map: &HashMap) { + for (key, value) in map { + println!("{key} -> {value}"); + } +} + +/* 列印佇列(雙向佇列) */ +pub fn print_queue(queue: &VecDeque) { + print!("["); + let iter = queue.iter(); + for (i, data) in iter.enumerate() { + print!("{}{}", data, if i == queue.len() - 1 {"]"} else {", "} ); + } +} + +/* 列印鏈結串列 */ +pub fn print_linked_list(head: &Rc>>) { + print!("{}{}", head.borrow().val, if head.borrow().next.is_none() {"\n"} else {" -> "}); + if let Some(node) = &head.borrow().next { + return print_linked_list(node); + } +} + +/* 列印二元樹 */ +pub fn print_tree(root: &Rc>) { + _print_tree(Some(root), None, false); +} + +/* 列印二元樹 */ +fn _print_tree(root: Option<&Rc>>, prev: Option<&Trunk>, is_right: bool) { + if let Some(node) = root { + let mut prev_str = " "; + let trunk = Trunk { prev, str: Cell::new(prev_str) }; + _print_tree(node.borrow().right.as_ref(), Some(&trunk), true); + + if prev.is_none() { + trunk.str.set("———"); + } else if is_right { + trunk.str.set("/———"); + prev_str = " |"; + } else { + trunk.str.set("\\———"); + prev.as_ref().unwrap().str.set(prev_str); + } + + show_trunks(Some(&trunk)); + println!(" {}", node.borrow().val); + if let Some(prev) = prev { + prev.str.set(prev_str); + } + trunk.str.set(" |"); + + _print_tree(node.borrow().left.as_ref(), Some(&trunk), false); + } +} + +fn show_trunks(trunk: Option<&Trunk>) { + if let Some(trunk) = trunk { + show_trunks(trunk.prev); + print!("{}", trunk.str.get()); + } +} + +/* 列印堆積 */ +pub fn print_heap(heap: Vec) { + println!("堆積的陣列表示:{:?}", heap); + println!("堆積的樹狀表示:"); + if let Some(root) = vec_to_tree(heap.into_iter().map(|val| Some(val)).collect()) { + print_tree(&root); + } +} diff --git a/zh-hant/codes/rust/src/include/tree_node.rs b/zh-hant/codes/rust/src/include/tree_node.rs new file mode 100644 index 000000000..514491862 --- /dev/null +++ b/zh-hant/codes/rust/src/include/tree_node.rs @@ -0,0 +1,92 @@ +/* + * File: tree_node.rs + * Created Time: 2023-02-27 + * Author: xBLACKICEx (xBLACKICE@outlook.com), night-cruise (2586447362@qq.com) + */ + +use std::cell::RefCell; +use std::rc::Rc; + +/* 二元樹節點型別 */ +#[derive(Debug)] +pub struct TreeNode { + pub val: i32, + pub height: i32, + pub parent: Option>>, + pub left: Option>>, + pub right: Option>>, +} + +impl TreeNode { + /* 建構子 */ + pub fn new(val: i32) -> Rc> { + Rc::new(RefCell::new(Self { + val, + height: 0, + parent: None, + left: None, + right: None, + })) + } +} + +#[macro_export] +macro_rules! op_vec { + ( $( $x:expr ),* ) => { + vec![ + $( Option::from($x).map(|x| x) ),* + ] + }; +} + +// 序列化編碼規則請參考: +// https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ +// 二元樹的陣列表示: +// [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15] +// 二元樹的鏈結串列表示: +// /——— 15 +// /——— 7 +// /——— 3 +// | \——— 6 +// | \——— 12 +// ——— 1 +// \——— 2 +// | /——— 9 +// \——— 4 +// \——— 8 + +/* 將串列反序列化為二元樹:遞迴 */ +fn vec_to_tree_dfs(arr: &[Option], i: usize) -> Option>> { + if i >= arr.len() || arr[i].is_none() { + return None; + } + let root = TreeNode::new(arr[i].unwrap()); + root.borrow_mut().left = vec_to_tree_dfs(arr, 2 * i + 1); + root.borrow_mut().right = vec_to_tree_dfs(arr, 2 * i + 2); + Some(root) +} + +/* 將串列反序列化為二元樹 */ +pub fn vec_to_tree(arr: Vec>) -> Option>> { + vec_to_tree_dfs(&arr, 0) +} + +/* 將二元樹序列化為串列:遞迴 */ +fn tree_to_vec_dfs(root: Option<&Rc>>, i: usize, res: &mut Vec>) { + if let Some(root) = root { + // i + 1 is the minimum valid size to access index i + while res.len() < i + 1 { + res.push(None); + } + res[i] = Some(root.borrow().val); + tree_to_vec_dfs(root.borrow().left.as_ref(), 2 * i + 1, res); + tree_to_vec_dfs(root.borrow().right.as_ref(), 2 * i + 2, res); + } +} + +/* 將二元樹序列化為串列 */ +pub fn tree_to_vec(root: Option>>) -> Vec> { + let mut res = vec![]; + tree_to_vec_dfs(root.as_ref(), 0, &mut res); + res +} diff --git a/zh-hant/codes/rust/src/include/vertex.rs b/zh-hant/codes/rust/src/include/vertex.rs new file mode 100644 index 000000000..6d9b5e550 --- /dev/null +++ b/zh-hant/codes/rust/src/include/vertex.rs @@ -0,0 +1,21 @@ +/* + * File: vertex.rs + * Created Time: 2023-07-13 + * Author: night-cruise (2586447362@qq.com) + */ + +/* 頂點型別 */ +#[derive(Copy, Clone, Hash, PartialEq, Eq)] +pub struct Vertex { + pub val: i32, +} + +/* 輸入值串列 vals ,返回頂點串列 vets */ +pub fn vals_to_vets(vals: Vec) -> Vec { + vals.into_iter().map(|val| Vertex { val }).collect() +} + +/* 輸入頂點串列 vets ,返回值串列 vals */ +pub fn vets_to_vals(vets: Vec) -> Vec { + vets.into_iter().map(|vet| vet.val).collect() +} diff --git a/zh-hant/codes/rust/src/lib.rs b/zh-hant/codes/rust/src/lib.rs new file mode 100644 index 000000000..2883b9104 --- /dev/null +++ b/zh-hant/codes/rust/src/lib.rs @@ -0,0 +1 @@ +pub mod include; diff --git a/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift b/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift index f2621f089..ca3048e04 100644 --- a/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift +++ b/zh-hant/codes/swift/chapter_dynamic_programming/min_path_sum.swift @@ -105,19 +105,19 @@ enum MinPathSum { // 暴力搜尋 var res = minPathSumDFS(grid: grid, i: n - 1, j: m - 1) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 記憶化搜尋 var mem = Array(repeating: Array(repeating: -1, count: m), count: n) res = minPathSumDFSMem(grid: grid, mem: &mem, i: n - 1, j: m - 1) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 動態規劃 res = minPathSumDP(grid: grid) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") // 空間最佳化後的動態規劃 res = minPathSumDPComp(grid: grid) - print("從左上角到右下角的做小路徑和為 \(res)") + print("從左上角到右下角的最小路徑和為 \(res)") } } diff --git a/zh-hant/docs/chapter_heap/heap.md b/zh-hant/docs/chapter_heap/heap.md index 7d04a45d3..00a321b4f 100644 --- a/zh-hant/docs/chapter_heap/heap.md +++ b/zh-hant/docs/chapter_heap/heap.md @@ -157,8 +157,8 @@ /* 初始化堆積 */ // 初始化小頂堆積 PriorityQueue minHeap = new(); - // 初始化大頂堆積(使用 lambda 表示式修改 Comparator 即可) - PriorityQueue maxHeap = new(Comparer.Create((x, y) => y - x)); + // 初始化大頂堆積(使用 lambda 表示式修改 Comparer 即可) + PriorityQueue maxHeap = new(Comparer.Create((x, y) => y.CompareTo(x))); /* 元素入堆積 */ maxHeap.Enqueue(1, 1); diff --git a/zh-hant/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/zh-hant/docs/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png index 74017260e84ab9fb7017d81eb3dc989457b5d253..985012db71e3e7463968e3396d6e89ee0cc3f58a 100644 GIT binary patch literal 13209 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 literal 14870 zcmd731yCGc*FM-YxD!KyhJ=tHfk1+55+Fen+$CsmcNqd9xCV!T;0}S{HVN*|;DdYc z!5Oymd*AQf|9-o*RbSQqtF~)uW~%4j+kJ1J^PKZM_e}761!)q(`-A`hki2{QMhO6L zz^~9Dd@S(eEQ`Y!0I-1faw?KHH#Zmz<{EPi9#>bGtE;Pvt4r`W2VdtGCl@EDXV+(E zXQ!v9Xz+zTIX*rGyVT#`-`CgI+uPgI)6?DE-PP6A z+1c6A(b3-C-qzOEI`(?&?0@2da(%jr!*Sg-+)YRD6*wE1M z6Y;0Cxj&&jKBhG~yd^BSDdfPceh{|3L5`r^;^ezmo=H8nNW)zwv1RX>0JEUaEF z{LxoYQSsx)kMi>J%+mR?va-~om6DQ@;^N|>qN2jW!h(W={QUgH+}XUmyxiQ}?Ck8U ztgP?fzo)0C!{P9>w6v6zl;q^(#KgpegoK#9>8Ol_kW`dwiHmNkj%t!hTwL6@Z{K2L zW22*^KgTcl#>~5iPe(;XMMg$OL_~y#hlhrShJ=I!2M2%s`ZX{x@XMDk0RaL2{{DV` zelQr!*VorEXwoKN#sY@4^DZ}VoAC1T^7Qm{b8~Zcb~bV-addRFx3{;mv$M6ewXw0W zwzjskwEXnxlexLMnVFfXsi~2X(Z`P;4Gj$q3=H)3^>uZ1b#!#JwY9ahv@|s}H8eET z)zuX&Mx~8LM0JLE)dtkm)KpbfRa8{CmHN5f_diqYS5{V5Qd0Wx;lum)?-dmlITZR8 z6cps;{fo#6A;iroPKlKa4I@z zW;!5X8Yr-St+g#^mR@-(Fxq$CNf) z?ghK6&F;8w4#mtHj7^^1i2H|UO}`lM#HT!-a&qofzNNev)y+Z6#3$QQ6s}yiCTlQP z7#*;*gcL87VJ+MzT0qmyi&a;vU`?X)yVT)8waCHGi<&K^=!+|N;M?4p>)HM|t2SOB z8NnYOfBqpvofucmjO@rfLS>D6p>=n9A7x~pACx|_6 z)Tqbr-F&nDfzMiloS^2WN56 zG21n@q96w5CorQo_xCBG?@g20b@F*!>=u82X+G%V$Do0VX$?bdc0km6L~D)HO{Jm~w}D;M3wl%udZxc!bW zo6k{S$L3*)8rC8Mx_0s{f3{SQe6eav)vvO<3utAVx!(i^g{-UX>u1ZrlTM(ps+qLa zaXl#oBMi~WTJL^I+!RZ6JNETXo=9GRDWq24Q6fX~AWu!timZRt=NG(Txal-aIO`Eo( zJUPpoW=np7zWn4bE*JB`Bg3cUniQy

MK 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 diff --git a/zh-hant/docs/chapter_tree/avl_tree.md b/zh-hant/docs/chapter_tree/avl_tree.md index 38da5155b..1a2c0a93d 100644 --- a/zh-hant/docs/chapter_tree/avl_tree.md +++ b/zh-hant/docs/chapter_tree/avl_tree.md @@ -180,7 +180,7 @@ AVL 樹既是二元搜尋樹,也是平衡二元樹,同時滿足這兩類二 ```c title="" /* AVL 樹節點結構體 */ - TreeNode struct TreeNode { + typedef struct TreeNode { int val; int height; struct TreeNode *left; diff --git a/zh-hant/docs/index.html b/zh-hant/docs/index.html index 681f66b53..10919b59f 100644 --- a/zh-hant/docs/index.html +++ b/zh-hant/docs/index.html @@ -372,4 +372,4 @@ - + \ No newline at end of file