From 881d57379036f9f680caa46f8db22d191cd64194 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Mon, 17 Apr 2023 18:22:18 +0800 Subject: [PATCH] Refactor the articles related to searching algorithm. Add the chapter of binary search. Add the section of searching algorithm revisited. (#464) --- codes/c/CMakeLists.txt | 5 +- codes/c/chapter_binary_search/CMakeLists.txt | 1 + .../binary_search.c | 0 .../CMakeLists.txt | 1 - codes/c/chapter_searching/CMakeLists.txt | 5 +- .../leetcode_two_sum.c | 0 codes/cpp/CMakeLists.txt | 1 + .../cpp/chapter_binary_search/CMakeLists.txt | 1 + .../binary_search.cpp | 0 .../CMakeLists.txt | 3 +- codes/cpp/chapter_searching/CMakeLists.txt | 2 +- .../leetcode_two_sum.cpp | 0 .../binary_search.cs | 2 +- .../leetcode_two_sum.cs | 2 +- .../binary_search.go | 2 +- .../binary_search_test.go | 2 +- .../leetcode_two_sum.go | 2 +- .../leetcode_two_sum_test.go | 2 +- .../backtrack_find_constrained_paths.java | 2 + .../preorder_find_constrained_paths.java | 2 + .../preorder_find_nodes.java | 2 + .../preorder_find_paths.java | 2 + .../binary_search.java | 2 +- .../leetcode_two_sum.java | 2 +- .../binary_search.js | 0 .../leetcode_two_sum.js | 0 .../binary_search.py | 0 .../leetcode_two_sum.py | 0 .../binary_search.rs | 0 .../binary_search.swift | 0 .../leetcode_two_sum.swift | 0 .../binary_search.ts | 0 .../leetcode_two_sum.ts | 0 .../binary_search.zig | 1 - .../leetcode_two_sum.zig | 0 .../binary_search_step1.png | Bin .../binary_search_step2.png | Bin .../binary_search_step3.png | Bin .../binary_search_step4.png | Bin .../binary_search_step5.png | Bin .../binary_search_step6.png | Bin .../binary_search_step7.png | Bin .../binary_search.md | 168 +++++++++--------- .../space_complexity.md | 8 + .../summary.md | 6 +- docs/chapter_hashing/hash_map.md | 21 +-- .../hash_search_listnode.png | Bin 70105 -> 0 bytes docs/chapter_searching/hashing_search.md | 152 ---------------- docs/chapter_searching/linear_search.md | 143 --------------- .../hashing_search.png} | Bin .../linear_search.png | Bin .../replace_linear_by_hashing.md} | 30 ++-- .../searching_algorithms.png | Bin 0 -> 104675 bytes .../searching_algorithm_revisited.md | 81 +++++++++ docs/chapter_searching/summary.md | 18 +- docs/chapter_tree/binary_search_tree.md | 31 +--- mkdocs.yml | 68 +++---- 57 files changed, 265 insertions(+), 505 deletions(-) create mode 100644 codes/c/chapter_binary_search/CMakeLists.txt rename codes/c/{chapter_searching => chapter_binary_search}/binary_search.c (100%) rename codes/c/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.c (100%) create mode 100644 codes/cpp/chapter_binary_search/CMakeLists.txt rename codes/cpp/{chapter_searching => chapter_binary_search}/binary_search.cpp (100%) rename codes/cpp/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.cpp (100%) rename codes/csharp/{chapter_searching => chapter_binary_search}/binary_search.cs (98%) rename codes/csharp/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.cs (96%) rename codes/go/{chapter_searching => chapter_binary_search}/binary_search.go (97%) rename codes/go/{chapter_searching => chapter_binary_search}/binary_search_test.go (94%) rename codes/go/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.go (94%) rename codes/go/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum_test.go (91%) rename codes/java/{chapter_searching => chapter_binary_search}/binary_search.java (98%) rename codes/java/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.java (97%) rename codes/javascript/{chapter_searching => chapter_binary_search}/binary_search.js (100%) rename codes/javascript/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.js (100%) rename codes/python/{chapter_searching => chapter_binary_search}/binary_search.py (100%) rename codes/python/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.py (100%) rename codes/rust/{chapter_searching => chapter_binary_search}/binary_search.rs (100%) rename codes/swift/{chapter_searching => chapter_binary_search}/binary_search.swift (100%) rename codes/swift/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.swift (100%) rename codes/typescript/{chapter_searching => chapter_binary_search}/binary_search.ts (100%) rename codes/typescript/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.ts (100%) rename codes/zig/{chapter_searching => chapter_binary_search}/binary_search.zig (99%) rename codes/zig/{chapter_computational_complexity => chapter_searching}/leetcode_two_sum.zig (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step1.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step2.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step3.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step4.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step5.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step6.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.assets/binary_search_step7.png (100%) rename docs/{chapter_searching => chapter_binary_search}/binary_search.md (93%) delete mode 100644 docs/chapter_searching/hashing_search.assets/hash_search_listnode.png delete mode 100755 docs/chapter_searching/hashing_search.md delete mode 100755 docs/chapter_searching/linear_search.md rename docs/chapter_searching/{hashing_search.assets/hash_search_index.png => replace_linear_by_hashing.assets/hashing_search.png} (100%) rename docs/chapter_searching/{linear_search.assets => replace_linear_by_hashing.assets}/linear_search.png (100%) rename docs/{chapter_computational_complexity/space_time_tradeoff.md => chapter_searching/replace_linear_by_hashing.md} (59%) create mode 100644 docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png create mode 100644 docs/chapter_searching/searching_algorithm_revisited.md diff --git a/codes/c/CMakeLists.txt b/codes/c/CMakeLists.txt index 853475b5f..588025726 100644 --- a/codes/c/CMakeLists.txt +++ b/codes/c/CMakeLists.txt @@ -8,8 +8,7 @@ include_directories(./include) add_subdirectory(include) add_subdirectory(chapter_computational_complexity) add_subdirectory(chapter_array_and_linkedlist) -add_subdirectory(chapter_sorting) -add_subdirectory(chapter_tree) add_subdirectory(chapter_stack_and_queue) +add_subdirectory(chapter_binary_search) add_subdirectory(chapter_heap) -add_subdirectory(chapter_searching) \ No newline at end of file +add_subdirectory(chapter_searching) diff --git a/codes/c/chapter_binary_search/CMakeLists.txt b/codes/c/chapter_binary_search/CMakeLists.txt new file mode 100644 index 000000000..f7ddf6761 --- /dev/null +++ b/codes/c/chapter_binary_search/CMakeLists.txt @@ -0,0 +1 @@ +add_executable(linear_search linear_search.c) \ No newline at end of file diff --git a/codes/c/chapter_searching/binary_search.c b/codes/c/chapter_binary_search/binary_search.c similarity index 100% rename from codes/c/chapter_searching/binary_search.c rename to codes/c/chapter_binary_search/binary_search.c diff --git a/codes/c/chapter_computational_complexity/CMakeLists.txt b/codes/c/chapter_computational_complexity/CMakeLists.txt index 30646d4e1..b11e25877 100644 --- a/codes/c/chapter_computational_complexity/CMakeLists.txt +++ b/codes/c/chapter_computational_complexity/CMakeLists.txt @@ -1,4 +1,3 @@ add_executable(time_complexity time_complexity.c) add_executable(worst_best_time_complexity worst_best_time_complexity.c) -add_executable(leetcode_two_sum leetcode_two_sum.c) add_executable(space_complexity space_complexity.c) \ No newline at end of file diff --git a/codes/c/chapter_searching/CMakeLists.txt b/codes/c/chapter_searching/CMakeLists.txt index d6ef4b895..58f81dd39 100644 --- a/codes/c/chapter_searching/CMakeLists.txt +++ b/codes/c/chapter_searching/CMakeLists.txt @@ -1,3 +1,2 @@ -add_executable(binary_search binary_search.c ) -add_executable(linear_search linear_search.c) -add_executable(hashing_search hashing_search.c) \ No newline at end of file +add_executable(binary_search binary_search.c) +add_executable(leetcode_two_sum leetcode_two_sum.c) \ No newline at end of file diff --git a/codes/c/chapter_computational_complexity/leetcode_two_sum.c b/codes/c/chapter_searching/leetcode_two_sum.c similarity index 100% rename from codes/c/chapter_computational_complexity/leetcode_two_sum.c rename to codes/c/chapter_searching/leetcode_two_sum.c diff --git a/codes/cpp/CMakeLists.txt b/codes/cpp/CMakeLists.txt index 9e3f5583a..164e94c81 100644 --- a/codes/cpp/CMakeLists.txt +++ b/codes/cpp/CMakeLists.txt @@ -8,6 +8,7 @@ include_directories(./include) add_subdirectory(chapter_computational_complexity) add_subdirectory(chapter_array_and_linkedlist) add_subdirectory(chapter_stack_and_queue) +add_subdirectory(chapter_binary_search) add_subdirectory(chapter_hashing) add_subdirectory(chapter_tree) add_subdirectory(chapter_heap) diff --git a/codes/cpp/chapter_binary_search/CMakeLists.txt b/codes/cpp/chapter_binary_search/CMakeLists.txt new file mode 100644 index 000000000..304737e1f --- /dev/null +++ b/codes/cpp/chapter_binary_search/CMakeLists.txt @@ -0,0 +1 @@ +add_executable(binary_search binary_search.cpp) \ No newline at end of file diff --git a/codes/cpp/chapter_searching/binary_search.cpp b/codes/cpp/chapter_binary_search/binary_search.cpp similarity index 100% rename from codes/cpp/chapter_searching/binary_search.cpp rename to codes/cpp/chapter_binary_search/binary_search.cpp diff --git a/codes/cpp/chapter_computational_complexity/CMakeLists.txt b/codes/cpp/chapter_computational_complexity/CMakeLists.txt index b484b3af2..4c1c11261 100644 --- a/codes/cpp/chapter_computational_complexity/CMakeLists.txt +++ b/codes/cpp/chapter_computational_complexity/CMakeLists.txt @@ -1,4 +1,3 @@ -add_executable(leetcode_two_sum leetcode_two_sum.cpp) -add_executable(space_complexity space_complexity.cpp ) +add_executable(space_complexity space_complexity.cpp) add_executable(time_complexity time_complexity.cpp) add_executable(worst_best_time_complexity worst_best_time_complexity.cpp) \ No newline at end of file diff --git a/codes/cpp/chapter_searching/CMakeLists.txt b/codes/cpp/chapter_searching/CMakeLists.txt index 9d2a23995..04448bf5d 100644 --- a/codes/cpp/chapter_searching/CMakeLists.txt +++ b/codes/cpp/chapter_searching/CMakeLists.txt @@ -1,3 +1,3 @@ -add_executable(binary_search binary_search.cpp) add_executable(hashing_search hashing_search.cpp) +add_executable(leetcode_two_sum leetcode_two_sum.cpp) add_executable(linear_search linear_search.cpp) \ No newline at end of file diff --git a/codes/cpp/chapter_computational_complexity/leetcode_two_sum.cpp b/codes/cpp/chapter_searching/leetcode_two_sum.cpp similarity index 100% rename from codes/cpp/chapter_computational_complexity/leetcode_two_sum.cpp rename to codes/cpp/chapter_searching/leetcode_two_sum.cpp diff --git a/codes/csharp/chapter_searching/binary_search.cs b/codes/csharp/chapter_binary_search/binary_search.cs similarity index 98% rename from codes/csharp/chapter_searching/binary_search.cs rename to codes/csharp/chapter_binary_search/binary_search.cs index 361f40723..0820399f4 100644 --- a/codes/csharp/chapter_searching/binary_search.cs +++ b/codes/csharp/chapter_binary_search/binary_search.cs @@ -6,7 +6,7 @@ using NUnit.Framework; -namespace hello_algo.chapter_searching; +namespace hello_algo.chapter_binary_search; public class binary_search { diff --git a/codes/csharp/chapter_computational_complexity/leetcode_two_sum.cs b/codes/csharp/chapter_searching/leetcode_two_sum.cs similarity index 96% rename from codes/csharp/chapter_computational_complexity/leetcode_two_sum.cs rename to codes/csharp/chapter_searching/leetcode_two_sum.cs index 4d716f971..e2557508a 100644 --- a/codes/csharp/chapter_computational_complexity/leetcode_two_sum.cs +++ b/codes/csharp/chapter_searching/leetcode_two_sum.cs @@ -6,7 +6,7 @@ using NUnit.Framework; -namespace hello_algo.chapter_computational_complexity; +namespace hello_algo.chapter_searching; public class leetcode_two_sum { diff --git a/codes/go/chapter_searching/binary_search.go b/codes/go/chapter_binary_search/binary_search.go similarity index 97% rename from codes/go/chapter_searching/binary_search.go rename to codes/go/chapter_binary_search/binary_search.go index cbaa85162..159524bd9 100644 --- a/codes/go/chapter_searching/binary_search.go +++ b/codes/go/chapter_binary_search/binary_search.go @@ -2,7 +2,7 @@ // Created Time: 2022-12-05 // Author: Slone123c (274325721@qq.com) -package chapter_searching +package chapter_binary_search /* 二分查找(双闭区间) */ func binarySearch(nums []int, target int) int { diff --git a/codes/go/chapter_searching/binary_search_test.go b/codes/go/chapter_binary_search/binary_search_test.go similarity index 94% rename from codes/go/chapter_searching/binary_search_test.go rename to codes/go/chapter_binary_search/binary_search_test.go index 3dada9593..0cfedbdcd 100644 --- a/codes/go/chapter_searching/binary_search_test.go +++ b/codes/go/chapter_binary_search/binary_search_test.go @@ -2,7 +2,7 @@ // Created Time: 2022-12-05 // Author: Slone123c (274325721@qq.com) -package chapter_searching +package chapter_binary_search import ( "fmt" diff --git a/codes/go/chapter_computational_complexity/leetcode_two_sum.go b/codes/go/chapter_searching/leetcode_two_sum.go similarity index 94% rename from codes/go/chapter_computational_complexity/leetcode_two_sum.go rename to codes/go/chapter_searching/leetcode_two_sum.go index 663020381..138ea88c5 100644 --- a/codes/go/chapter_computational_complexity/leetcode_two_sum.go +++ b/codes/go/chapter_searching/leetcode_two_sum.go @@ -2,7 +2,7 @@ // Created Time: 2022-11-25 // Author: reanon (793584285@qq.com) -package chapter_computational_complexity +package chapter_searching /* 方法一:暴力枚举 */ func twoSumBruteForce(nums []int, target int) []int { diff --git a/codes/go/chapter_computational_complexity/leetcode_two_sum_test.go b/codes/go/chapter_searching/leetcode_two_sum_test.go similarity index 91% rename from codes/go/chapter_computational_complexity/leetcode_two_sum_test.go rename to codes/go/chapter_searching/leetcode_two_sum_test.go index 6e44eef98..e45d5fb21 100644 --- a/codes/go/chapter_computational_complexity/leetcode_two_sum_test.go +++ b/codes/go/chapter_searching/leetcode_two_sum_test.go @@ -2,7 +2,7 @@ // Created Time: 2022-11-25 // Author: reanon (793584285@qq.com) -package chapter_computational_complexity +package chapter_searching import ( "fmt" diff --git a/codes/java/chapter_backtracking/backtrack_find_constrained_paths.java b/codes/java/chapter_backtracking/backtrack_find_constrained_paths.java index 420c469e0..61e555ada 100644 --- a/codes/java/chapter_backtracking/backtrack_find_constrained_paths.java +++ b/codes/java/chapter_backtracking/backtrack_find_constrained_paths.java @@ -4,6 +4,8 @@ * Author: Krahets (krahets@163.com) */ +package chapter_backtracking; + import include.*; import java.util.*; diff --git a/codes/java/chapter_backtracking/preorder_find_constrained_paths.java b/codes/java/chapter_backtracking/preorder_find_constrained_paths.java index 3653710ed..304d3dbfe 100644 --- a/codes/java/chapter_backtracking/preorder_find_constrained_paths.java +++ b/codes/java/chapter_backtracking/preorder_find_constrained_paths.java @@ -4,6 +4,8 @@ * Author: Krahets (krahets@163.com) */ +package chapter_backtracking; + import include.*; import java.util.*; diff --git a/codes/java/chapter_backtracking/preorder_find_nodes.java b/codes/java/chapter_backtracking/preorder_find_nodes.java index 085a76593..966d1b7e6 100644 --- a/codes/java/chapter_backtracking/preorder_find_nodes.java +++ b/codes/java/chapter_backtracking/preorder_find_nodes.java @@ -4,6 +4,8 @@ * Author: Krahets (krahets@163.com) */ +package chapter_backtracking; + import include.*; import java.util.*; diff --git a/codes/java/chapter_backtracking/preorder_find_paths.java b/codes/java/chapter_backtracking/preorder_find_paths.java index 39568dcda..3131673e5 100644 --- a/codes/java/chapter_backtracking/preorder_find_paths.java +++ b/codes/java/chapter_backtracking/preorder_find_paths.java @@ -4,6 +4,8 @@ * Author: Krahets (krahets@163.com) */ +package chapter_backtracking; + import include.*; import java.util.*; diff --git a/codes/java/chapter_searching/binary_search.java b/codes/java/chapter_binary_search/binary_search.java similarity index 98% rename from codes/java/chapter_searching/binary_search.java rename to codes/java/chapter_binary_search/binary_search.java index 491b47757..3e20efb56 100644 --- a/codes/java/chapter_searching/binary_search.java +++ b/codes/java/chapter_binary_search/binary_search.java @@ -4,7 +4,7 @@ * Author: Krahets (krahets@163.com) */ -package chapter_searching; +package chapter_binary_search; public class binary_search { /* 二分查找(双闭区间) */ diff --git a/codes/java/chapter_computational_complexity/leetcode_two_sum.java b/codes/java/chapter_searching/leetcode_two_sum.java similarity index 97% rename from codes/java/chapter_computational_complexity/leetcode_two_sum.java rename to codes/java/chapter_searching/leetcode_two_sum.java index 6b9784759..690e07bef 100644 --- a/codes/java/chapter_computational_complexity/leetcode_two_sum.java +++ b/codes/java/chapter_searching/leetcode_two_sum.java @@ -4,7 +4,7 @@ * Author: Krahets (krahets@163.com) */ -package chapter_computational_complexity; +package chapter_searching; import java.util.*; diff --git a/codes/javascript/chapter_searching/binary_search.js b/codes/javascript/chapter_binary_search/binary_search.js similarity index 100% rename from codes/javascript/chapter_searching/binary_search.js rename to codes/javascript/chapter_binary_search/binary_search.js diff --git a/codes/javascript/chapter_computational_complexity/leetcode_two_sum.js b/codes/javascript/chapter_searching/leetcode_two_sum.js similarity index 100% rename from codes/javascript/chapter_computational_complexity/leetcode_two_sum.js rename to codes/javascript/chapter_searching/leetcode_two_sum.js diff --git a/codes/python/chapter_searching/binary_search.py b/codes/python/chapter_binary_search/binary_search.py similarity index 100% rename from codes/python/chapter_searching/binary_search.py rename to codes/python/chapter_binary_search/binary_search.py diff --git a/codes/python/chapter_computational_complexity/leetcode_two_sum.py b/codes/python/chapter_searching/leetcode_two_sum.py similarity index 100% rename from codes/python/chapter_computational_complexity/leetcode_two_sum.py rename to codes/python/chapter_searching/leetcode_two_sum.py diff --git a/codes/rust/chapter_searching/binary_search.rs b/codes/rust/chapter_binary_search/binary_search.rs similarity index 100% rename from codes/rust/chapter_searching/binary_search.rs rename to codes/rust/chapter_binary_search/binary_search.rs diff --git a/codes/swift/chapter_searching/binary_search.swift b/codes/swift/chapter_binary_search/binary_search.swift similarity index 100% rename from codes/swift/chapter_searching/binary_search.swift rename to codes/swift/chapter_binary_search/binary_search.swift diff --git a/codes/swift/chapter_computational_complexity/leetcode_two_sum.swift b/codes/swift/chapter_searching/leetcode_two_sum.swift similarity index 100% rename from codes/swift/chapter_computational_complexity/leetcode_two_sum.swift rename to codes/swift/chapter_searching/leetcode_two_sum.swift diff --git a/codes/typescript/chapter_searching/binary_search.ts b/codes/typescript/chapter_binary_search/binary_search.ts similarity index 100% rename from codes/typescript/chapter_searching/binary_search.ts rename to codes/typescript/chapter_binary_search/binary_search.ts diff --git a/codes/typescript/chapter_computational_complexity/leetcode_two_sum.ts b/codes/typescript/chapter_searching/leetcode_two_sum.ts similarity index 100% rename from codes/typescript/chapter_computational_complexity/leetcode_two_sum.ts rename to codes/typescript/chapter_searching/leetcode_two_sum.ts diff --git a/codes/zig/chapter_searching/binary_search.zig b/codes/zig/chapter_binary_search/binary_search.zig similarity index 99% rename from codes/zig/chapter_searching/binary_search.zig rename to codes/zig/chapter_binary_search/binary_search.zig index 0a2f754f4..300b7c491 100644 --- a/codes/zig/chapter_searching/binary_search.zig +++ b/codes/zig/chapter_binary_search/binary_search.zig @@ -62,4 +62,3 @@ pub fn main() !void { _ = try std.io.getStdIn().reader().readByte(); } - diff --git a/codes/zig/chapter_computational_complexity/leetcode_two_sum.zig b/codes/zig/chapter_searching/leetcode_two_sum.zig similarity index 100% rename from codes/zig/chapter_computational_complexity/leetcode_two_sum.zig rename to codes/zig/chapter_searching/leetcode_two_sum.zig diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step1.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step1.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step1.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step1.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step2.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step2.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step2.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step2.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step3.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step3.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step3.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step3.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step4.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step4.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step4.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step4.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step5.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step5.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step5.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step5.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step6.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step6.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step6.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step6.png diff --git a/docs/chapter_searching/binary_search.assets/binary_search_step7.png b/docs/chapter_binary_search/binary_search.assets/binary_search_step7.png similarity index 100% rename from docs/chapter_searching/binary_search.assets/binary_search_step7.png rename to docs/chapter_binary_search/binary_search.assets/binary_search_step7.png diff --git a/docs/chapter_searching/binary_search.md b/docs/chapter_binary_search/binary_search.md similarity index 93% rename from docs/chapter_searching/binary_search.md rename to docs/chapter_binary_search/binary_search.md index 126b685c5..23d762a20 100755 --- a/docs/chapter_searching/binary_search.md +++ b/docs/chapter_binary_search/binary_search.md @@ -2,8 +2,6 @@ 「二分查找 Binary Search」利用数据的有序性,通过每轮减少一半搜索范围来定位目标元素。 -## 算法实现 - 给定一个长度为 $n$ 的有序数组 `nums` ,元素按从小到大的顺序排列。数组索引的取值范围为: $$ @@ -12,10 +10,10 @@ $$ 我们通常使用以下两种方法来表示这个取值范围: -1. **双闭区间 $[0, n-1]$** ,即两个边界都包含自身;在此方法下,区间 $[0, 0]$ 仍包含 $1$ 个元素; -2. **左闭右开 $[0, n)$** ,即左边界包含自身、右边界不包含自身;在此方法下,区间 $[0, 0)$ 不包含元素; +1. **双闭区间 $[0, n-1]$** ,即两个边界都包含自身;在此方法下,区间 $[i, i]$ 仍包含 $1$ 个元素; +2. **左闭右开 $[0, n)$** ,即左边界包含自身、右边界不包含自身;在此方法下,区间 $[i, i)$ 不包含元素; -### “双闭区间”实现 +## 双闭区间实现 首先,我们采用“双闭区间”表示法,在数组 `nums` 中查找目标元素 `target` 的对应索引。 @@ -102,88 +100,7 @@ $$ [class]{}-[func]{binarySearch} ``` -### “左闭右开”实现 - -此外,我们也可以采用“左闭右开”的表示法,编写具有相同功能的二分查找代码。 - -=== "Java" - - ```java title="binary_search.java" - [class]{binary_search}-[func]{binarySearch1} - ``` - -=== "C++" - - ```cpp title="binary_search.cpp" - [class]{}-[func]{binarySearch1} - ``` - -=== "Python" - - ```python title="binary_search.py" - [class]{}-[func]{binary_search1} - ``` - -=== "Go" - - ```go title="binary_search.go" - [class]{}-[func]{binarySearch1} - ``` - -=== "JavaScript" - - ```javascript title="binary_search.js" - [class]{}-[func]{binarySearch1} - ``` - -=== "TypeScript" - - ```typescript title="binary_search.ts" - [class]{}-[func]{binarySearch1} - ``` - -=== "C" - - ```c title="binary_search.c" - [class]{}-[func]{binarySearch1} - ``` - -=== "C#" - - ```csharp title="binary_search.cs" - [class]{binary_search}-[func]{binarySearch1} - ``` - -=== "Swift" - - ```swift title="binary_search.swift" - [class]{}-[func]{binarySearch1} - ``` - -=== "Zig" - - ```zig title="binary_search.zig" - [class]{}-[func]{binarySearch1} - ``` - -### 两种表示对比 - -对比这两种代码写法,我们可以发现以下不同点: - -
- -| 表示方法 | 初始化指针 | 缩小区间 | 循环终止条件 | -| ------------------- | ------------------- | ------------------------- | ------------ | -| 双闭区间 $[0, n-1]$ | $i = 0$ , $j = n-1$ | $i = m + 1$ , $j = m - 1$ | $i > j$ | -| 左闭右开 $[0, n)$ | $i = 0$ , $j = n$ | $i = m + 1$ , $j = m$ | $i = j$ | - -
- -在“双闭区间”表示法中,由于对左右两边界的定义相同,因此缩小区间的 $i$ 和 $j$ 的处理方法也是对称的,这样更不容易出错。因此,**建议采用“双闭区间”的写法**。 - -### 大数越界处理 - -当数组长度非常大时,加法 $i + j$ 的结果可能会超出 `int` 类型的取值范围。在这种情况下,我们需要采用一种更安全的计算中点的方法。 +需要注意的是,**当数组长度非常大时,加法 $i + j$ 的结果可能会超出 `int` 类型的取值范围**。在这种情况下,我们需要采用一种更安全的计算中点的方法。 === "Java" @@ -267,6 +184,83 @@ $$ ``` +## 左闭右开实现 + +我们可以采用“左闭右开”的表示法,编写具有相同功能的二分查找代码。 + +=== "Java" + + ```java title="binary_search.java" + [class]{binary_search}-[func]{binarySearch1} + ``` + +=== "C++" + + ```cpp title="binary_search.cpp" + [class]{}-[func]{binarySearch1} + ``` + +=== "Python" + + ```python title="binary_search.py" + [class]{}-[func]{binary_search1} + ``` + +=== "Go" + + ```go title="binary_search.go" + [class]{}-[func]{binarySearch1} + ``` + +=== "JavaScript" + + ```javascript title="binary_search.js" + [class]{}-[func]{binarySearch1} + ``` + +=== "TypeScript" + + ```typescript title="binary_search.ts" + [class]{}-[func]{binarySearch1} + ``` + +=== "C" + + ```c title="binary_search.c" + [class]{}-[func]{binarySearch1} + ``` + +=== "C#" + + ```csharp title="binary_search.cs" + [class]{binary_search}-[func]{binarySearch1} + ``` + +=== "Swift" + + ```swift title="binary_search.swift" + [class]{}-[func]{binarySearch1} + ``` + +=== "Zig" + + ```zig title="binary_search.zig" + [class]{}-[func]{binarySearch1} + ``` + +对比这两种代码写法,我们可以发现以下不同点: + +
+ +| 表示方法 | 初始化指针 | 缩小区间 | 循环终止条件 | +| ------------------- | ------------------- | ------------------------- | ------------ | +| 双闭区间 $[0, n-1]$ | $i = 0$ , $j = n-1$ | $i = m + 1$ , $j = m - 1$ | $i > j$ | +| 左闭右开 $[0, n)$ | $i = 0$ , $j = n$ | $i = m + 1$ , $j = m$ | $i = j$ | + +
+ +在“双闭区间”表示法中,由于对左右两边界的定义相同,因此缩小区间的 $i$ 和 $j$ 的处理方法也是对称的,这样更不容易出错。因此,**建议采用“双闭区间”的写法**。 + ## 复杂度分析 **时间复杂度 $O(\log n)$** :其中 $n$ 为数组长度;每轮排除一半的区间,因此循环轮数为 $\log_2 n$ ,使用 $O(\log n)$ 时间。 diff --git a/docs/chapter_computational_complexity/space_complexity.md b/docs/chapter_computational_complexity/space_complexity.md index 8fa733858..ad42dbefa 100755 --- a/docs/chapter_computational_complexity/space_complexity.md +++ b/docs/chapter_computational_complexity/space_complexity.md @@ -961,3 +961,11 @@ $$ 例如“归并排序”算法,输入长度为 $n$ 的数组,每轮递归将数组从中点划分为两半,形成高度为 $\log n$ 的递归树,使用 $O(\log n)$ 栈帧空间。 再例如“数字转化为字符串”,输入任意正整数 $n$ ,它的位数为 $\log_{10} n$ ,即对应字符串长度为 $\log_{10} n$ ,因此空间复杂度为 $O(\log_{10} n) = O(\log n)$ 。 + +## 权衡时间与空间 + +理想情况下,我们希望算法的时间复杂度和空间复杂度都能达到最优。然而在实际情况中,同时优化时间复杂度和空间复杂度通常是非常困难的。 + +**降低时间复杂度通常需要以提升空间复杂度为代价,反之亦然**。我们将牺牲内存空间来提升算法运行速度的思路称为“以空间换时间”;反之,则称为“以时间换空间”。 + +选择哪种思路取决于我们更看重哪个方面。在大多数情况下,时间比空间更宝贵,因此以空间换时间通常是更常用的策略。当然,在数据量很大的情况下,控制空间复杂度也是非常重要的。 diff --git a/docs/chapter_computational_complexity/summary.md b/docs/chapter_computational_complexity/summary.md index 973fac6cd..ad2e3889f 100644 --- a/docs/chapter_computational_complexity/summary.md +++ b/docs/chapter_computational_complexity/summary.md @@ -1,12 +1,12 @@ # 小结 -### 算法效率评估 +**算法效率评估** - 时间效率和空间效率是评价算法性能的两个关键维度。 - 我们可以通过实际测试来评估算法效率,但难以消除测试环境的影响,且会耗费大量计算资源。 - 复杂度分析可以克服实际测试的弊端,分析结果适用于所有运行平台,并且能够揭示算法在不同数据规模下的效率。 -### 时间复杂度 +**时间复杂度** - 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可能失效,如在输入数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 - 最差时间复杂度使用大 $O$ 符号表示,即函数渐近上界,反映当 $n$ 趋向正无穷时,$T(n)$ 的增长级别。 @@ -15,7 +15,7 @@ - 某些算法的时间复杂度非固定,而是与输入数据的分布有关。时间复杂度分为最差、最佳、平均时间复杂度,最佳时间复杂度几乎不用,因为输入数据一般需要满足严格条件才能达到最佳情况。 - 平均时间复杂度反映算法在随机数据输入下的运行效率,最接近实际应用中的算法性能。计算平均时间复杂度需要统计输入数据分布以及综合后的数学期望。 -### 空间复杂度 +**空间复杂度** - 类似于时间复杂度,空间复杂度用于衡量算法占用空间随数据量增长的趋势。 - 算法运行过程中的相关内存空间可分为输入空间、暂存空间、输出空间。通常情况下,输入空间不计入空间复杂度计算。暂存空间可分为指令空间、数据空间、栈帧空间,其中栈帧空间通常仅在递归函数中影响空间复杂度。 diff --git a/docs/chapter_hashing/hash_map.md b/docs/chapter_hashing/hash_map.md index a5a0a9abb..35acbd227 100755 --- a/docs/chapter_hashing/hash_map.md +++ b/docs/chapter_hashing/hash_map.md @@ -6,24 +6,17 @@ ![哈希表的抽象表示](hash_map.assets/hash_map.png) -## 哈希表效率 +除哈希表外,我们还可以使用数组或链表实现查询功能,各项操作的时间复杂度如下表所示。 -除哈希表外,还可以使用以下数据结构来实现上述查询功能: - -1. **无序数组**:每个元素为 `[学号, 姓名]` ; -2. **有序数组**:将 `1.` 中的数组按照学号从小到大排序; -3. **链表**:每个节点的值为 `[学号, 姓名]` ; -4. **二叉搜索树**:每个节点的值为 `[学号, 姓名]` ,根据学号大小来构建树; - -各项操作的时间复杂度如下表所示(详解可见[二叉搜索树章节](https://www.hello-algo.com/chapter_tree/binary_search_tree/))。无论是查找元素还是增删元素,哈希表的时间复杂度都是 $O(1)$ ,全面胜出! +在哈希表中增删查改的时间复杂度都是 $O(1)$ ,全面胜出!因此,哈希表常用于对查找效率要求较高的场景。
-| | 无序数组 | 有序数组 | 链表 | 二叉搜索树 | 哈希表 | -| -------- | -------- | ----------- | ------ | ----------- | ------ | -| 查找元素 | $O(n)$ | $O(\log n)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | -| 插入元素 | $O(1)$ | $O(n)$ | $O(1)$ | $O(\log n)$ | $O(1)$ | -| 删除元素 | $O(n)$ | $O(n)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | +| | 数组 | 链表 | 哈希表 | +| -------- | ------ | ------ | ------ | +| 查找元素 | $O(n)$ | $O(n)$ | $O(1)$ | +| 插入元素 | $O(1)$ | $O(1)$ | $O(1)$ | +| 删除元素 | $O(n)$ | $O(n)$ | $O(1)$ |
diff --git a/docs/chapter_searching/hashing_search.assets/hash_search_listnode.png b/docs/chapter_searching/hashing_search.assets/hash_search_listnode.png deleted file mode 100644 index 7e310072baadd8c9f8e2fe6cc56fe97197649ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70105 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 diff --git a/docs/chapter_searching/hashing_search.md b/docs/chapter_searching/hashing_search.md deleted file mode 100755 index 09e420cbe..000000000 --- a/docs/chapter_searching/hashing_search.md +++ /dev/null @@ -1,152 +0,0 @@ -# 哈希查找 - -「哈希查找 Hash Searching」通过使用哈希表来存储所需的键值对,从而可在 $O(1)$ 时间内完成“键 $\rightarrow$ 值”的查找操作。 - -与线性查找相比,哈希查找通过利用额外空间来提高效率,体现了“以空间换时间”的算法思想。 - -## 算法实现 - -例如,若我们想要在给定数组中找到目标元素 `target` 的索引,则可以使用哈希查找来实现。 - -![哈希查找数组索引](hashing_search.assets/hash_search_index.png) - -=== "Java" - - ```java title="hashing_search.java" - [class]{hashing_search}-[func]{hashingSearchArray} - ``` - -=== "C++" - - ```cpp title="hashing_search.cpp" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "Python" - - ```python title="hashing_search.py" - [class]{}-[func]{hashing_search_array} - ``` - -=== "Go" - - ```go title="hashing_search.go" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "JavaScript" - - ```javascript title="hashing_search.js" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "TypeScript" - - ```typescript title="hashing_search.ts" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "C" - - ```c title="hashing_search.c" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "C#" - - ```csharp title="hashing_search.cs" - [class]{hashing_search}-[func]{hashingSearchArray} - ``` - -=== "Swift" - - ```swift title="hashing_search.swift" - [class]{}-[func]{hashingSearchArray} - ``` - -=== "Zig" - - ```zig title="hashing_search.zig" - [class]{}-[func]{hashingSearchArray} - ``` - -同样,若要根据目标节点值 target 查找对应的链表节点对象,也可以采用哈希查找方法。 - -![哈希查找链表节点](hashing_search.assets/hash_search_listnode.png) - -=== "Java" - - ```java title="hashing_search.java" - [class]{hashing_search}-[func]{hashingSearchLinkedList} - ``` - -=== "C++" - - ```cpp title="hashing_search.cpp" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "Python" - - ```python title="hashing_search.py" - [class]{}-[func]{hashing_search_linkedlist} - ``` - -=== "Go" - - ```go title="hashing_search.go" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "JavaScript" - - ```javascript title="hashing_search.js" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "TypeScript" - - ```typescript title="hashing_search.ts" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "C" - - ```c title="hashing_search.c" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "C#" - - ```csharp title="hashing_search.cs" - [class]{hashing_search}-[func]{hashingSearchLinkedList} - ``` - -=== "Swift" - - ```swift title="hashing_search.swift" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -=== "Zig" - - ```zig title="hashing_search.zig" - [class]{}-[func]{hashingSearchLinkedList} - ``` - -## 复杂度分析 - -**时间复杂度 $O(1)$** :哈希表的查找操作使用 $O(1)$ 时间。 - -**空间复杂度 $O(n)$** :其中 $n$ 是数组或链表的长度。 - -## 优点与局限性 - -哈希查找的性能表现相当优秀,查找、插入、删除操作的平均时间复杂度均为 $O(1)$ 。尽管如此,哈希查找仍然存在一些问题: - -- 辅助哈希表需要占用 $O(n)$ 的额外空间,意味着需要预留更多的计算机内存; -- 构建和维护哈希表需要时间,因此哈希查找不适用于高频增删、低频查找的场景; -- 当哈希冲突严重时,哈希表可能退化为链表,导致时间复杂度劣化至 $O(n)$ ; -- 当数据量较小时,线性查找可能比哈希查找更快。这是因为计算哈希函数可能比遍历一个小型数组更慢; - -因此,在实际应用中,我们需要根据具体情况灵活选择解决方案。 diff --git a/docs/chapter_searching/linear_search.md b/docs/chapter_searching/linear_search.md deleted file mode 100755 index 4e4011df5..000000000 --- a/docs/chapter_searching/linear_search.md +++ /dev/null @@ -1,143 +0,0 @@ -# 线性查找 - -「线性查找 Linear Search」是一种简单的查找方法,其从数据结构的一端开始,逐个访问每个元素,直至另一端为止。 - -## 算法实现 - -例如,若我们想要在数组 `nums` 中查找目标元素 `target` 的对应索引,可以采用线性查找方法。 - -![在数组中线性查找元素](linear_search.assets/linear_search.png) - -=== "Java" - - ```java title="linear_search.java" - [class]{linear_search}-[func]{linearSearchArray} - ``` - -=== "C++" - - ```cpp title="linear_search.cpp" - [class]{}-[func]{linearSearchArray} - ``` - -=== "Python" - - ```python title="linear_search.py" - [class]{}-[func]{linear_search_array} - ``` - -=== "Go" - - ```go title="linear_search.go" - [class]{}-[func]{linearSearchArray} - ``` - -=== "JavaScript" - - ```javascript title="linear_search.js" - [class]{}-[func]{linearSearchArray} - ``` - -=== "TypeScript" - - ```typescript title="linear_search.ts" - [class]{}-[func]{linearSearchArray} - ``` - -=== "C" - - ```c title="linear_search.c" - [class]{}-[func]{linearSearchArray} - ``` - -=== "C#" - - ```csharp title="linear_search.cs" - [class]{linear_search}-[func]{linearSearchArray} - ``` - -=== "Swift" - - ```swift title="linear_search.swift" - [class]{}-[func]{linearSearchArray} - ``` - -=== "Zig" - - ```zig title="linear_search.zig" - [class]{}-[func]{linearSearchArray} - ``` - -另一个例子,若需要在链表中查找给定目标节点值 `target` 并返回该节点对象,同样可以使用线性查找。 - -=== "Java" - - ```java title="linear_search.java" - [class]{linear_search}-[func]{linearSearchLinkedList} - ``` - -=== "C++" - - ```cpp title="linear_search.cpp" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "Python" - - ```python title="linear_search.py" - [class]{}-[func]{linear_search_linkedlist} - ``` - -=== "Go" - - ```go title="linear_search.go" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "JavaScript" - - ```javascript title="linear_search.js" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "TypeScript" - - ```typescript title="linear_search.ts" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "C" - - ```c title="linear_search.c" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "C#" - - ```csharp title="linear_search.cs" - [class]{linear_search}-[func]{linearSearchLinkedList} - ``` - -=== "Swift" - - ```swift title="linear_search.swift" - [class]{}-[func]{linearSearchLinkedList} - ``` - -=== "Zig" - - ```zig title="linear_search.zig" - [class]{}-[func]{linearSearchLinkedList} - ``` - -## 复杂度分析 - -**时间复杂度 $O(n)$** :其中 $n$ 代表数组或链表的长度。 - -**空间复杂度 $O(1)$** :无需借助额外的存储空间。 - -## 优点与局限性 - -**线性查找具有极佳的通用性**。由于线性查找是逐个访问元素的,没有跳跃式访问,因此适用于数组和链表的查找。 - -**线性查找的时间复杂度较高**。当数据量 $n$ 较大时,线性查找的效率较低。 diff --git a/docs/chapter_searching/hashing_search.assets/hash_search_index.png b/docs/chapter_searching/replace_linear_by_hashing.assets/hashing_search.png similarity index 100% rename from docs/chapter_searching/hashing_search.assets/hash_search_index.png rename to docs/chapter_searching/replace_linear_by_hashing.assets/hashing_search.png diff --git a/docs/chapter_searching/linear_search.assets/linear_search.png b/docs/chapter_searching/replace_linear_by_hashing.assets/linear_search.png similarity index 100% rename from docs/chapter_searching/linear_search.assets/linear_search.png rename to docs/chapter_searching/replace_linear_by_hashing.assets/linear_search.png diff --git a/docs/chapter_computational_complexity/space_time_tradeoff.md b/docs/chapter_searching/replace_linear_by_hashing.md similarity index 59% rename from docs/chapter_computational_complexity/space_time_tradeoff.md rename to docs/chapter_searching/replace_linear_by_hashing.md index 409f6b59e..fcd87f311 100755 --- a/docs/chapter_computational_complexity/space_time_tradeoff.md +++ b/docs/chapter_searching/replace_linear_by_hashing.md @@ -1,14 +1,6 @@ -# 权衡时间与空间 +# 哈希优化策略 -理想情况下,我们希望算法的时间复杂度和空间复杂度都能达到最优。然而在实际情况中,同时优化时间复杂度和空间复杂度通常是非常困难的。 - -**降低时间复杂度通常需要以提升空间复杂度为代价,反之亦然**。我们将牺牲内存空间来提升算法运行速度的思路称为「以空间换时间」;反之,则称之为「以时间换空间」。 - -选择哪种思路取决于我们更看重哪个方面。在大多数情况下,时间比空间更宝贵,因此以空间换时间通常是更常用的策略。当然,在数据量很大的情况下,控制空间复杂度也是非常重要的。 - -## 示例题目 * - -以 LeetCode 全站第一题 [两数之和](https://leetcode.cn/problems/two-sum/) 为例。 +在算法题中,**我们时常通过将线性查找替换为哈希查找来降低算法的时间复杂度**。以 LeetCode 全站第一题 [两数之和](https://leetcode.cn/problems/two-sum/) 为例。 !!! question "两数之和" @@ -18,11 +10,11 @@ 你可以按任意顺序返回答案。 -「暴力枚举」和「辅助哈希表」分别对应“空间最优”和“时间最优”的两种解法。遵循时间比空间更宝贵的原则,后者是本题的最佳解法。 +## 线性查找:以时间换空间 -### 方法一:暴力枚举 +考虑直接遍历所有可能的组合。开启一个两层循环,在每轮中判断两个整数的和是否为 `target` ,若是,则返回它们的索引。 -考虑直接遍历所有可能的组合。通过开启一个两层循环,判断两个整数的和是否为 `target` ,若是,则返回它们的索引(即下标)。 +(图) === "Java" @@ -84,15 +76,17 @@ [class]{}-[func]{twoSumBruteForce} ``` -该方法的时间复杂度为 $O(n^2)$ ,空间复杂度为 $O(1)$ ,**属于以时间换空间**。此方法时间复杂度太高,在大数据量下非常耗时。 +此方法的时间复杂度为 $O(n^2)$ ,空间复杂度为 $O(1)$ ,在大数据量下非常耗时。 -### 方法二:辅助哈希表 +## 哈希查找:以空间换时间 -考虑借助一个哈希表,key-value 分别为数组元素和元素索引。循环遍历数组中的每个元素 num,并执行: +考虑借助一个哈希表,将数组元素和元素索引构建为键值对。循环遍历数组中的每个元素 `num` 并执行: 1. 判断数字 `target - num` 是否在哈希表中,若是则直接返回该两个元素的索引; 2. 将元素 `num` 和其索引添加进哈希表; +(图) + === "Java" ```java title="leetcode_two_sum.java" @@ -153,4 +147,6 @@ [class]{}-[func]{twoSumHashTable} ``` -该方法的时间复杂度为 $O(N)$ ,空间复杂度为 $O(N)$ ,**体现了以空间换时间**。尽管此方法引入了额外的空间使用,但在时间和空间的整体效率更为均衡,因此它是本题的最优解法。 +此方法通过哈希查找将时间复杂度从 $O(n^2)$ 降低至 $O(n)$ ,大幅提升运行效率。 + +由于需要维护一个额外的哈希表,因此空间复杂度为 $O(n)$ 。**尽管如此,该方法的整体时空效率更为均衡,因此它是本题的最优解法**。 diff --git a/docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png b/docs/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc6d762723b72177a25f339800c948db399475b GIT binary patch literal 104675 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 + +| | 线性搜索 | 二分查找 | 树查找 | 哈希查找 | +| ------------ | -------- | ------------------ | ------------------ | --------------- | +| 查找元素 | $O(n)$ | $O(\log n)$ | $O(\log n)$ | $O(1)$ | +| 插入元素 | $O(1)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | +| 删除元素 | $O(n)$ | $O(n)$ | $O(\log n)$ | $O(1)$ | +| 额外空间 | $O(1)$ | $O(1)$ | $O(n)$ | $O(n)$ | +| 数据预处理 | / | 排序 $O(n \log n)$ | 建树 $O(n \log n)$ | 建哈希表 $O(n)$ | +| 数据是否有序 | 无序 | 有序 | 有序 | 无序 | + + + +除了以上表格内容,搜索算法的选择还取决于数据体量、搜索性能要求、数据查询与更新频率等。 + +**线性搜索** + +- 通用性较好,无需任何数据预处理操作。加入我们仅需查询一次数据,那么其他三种方法的数据预处理的时间比线性搜索的时间还要更长。 +- 适用于体量较小的数据,此情况下时间复杂度对效率影响较小。 +- 适用于数据更新频率较高的场景,因为该方法不需要对数据进行任何额外维护。 + +**二分查找** + +- 适用于大数据量的情况,效率表现稳定,最差时间复杂度为 $O(\log n)$ 。 +- 数据量不能过大,因为存储数组需要连续的内存空间。 +- 不适用于高频增删数据的场景,因为维护有序数组的开销较大。 + +**哈希查找** + +- 适合对查询性能要求很高的场景,平均时间复杂度为 $O(1)$ 。 +- 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 +- 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 +- 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性能。 + +**树查找** + +- 适用于海量数据,因为树节点在内存中是离散存储的。 +- 适合需要维护有序数据或范围查找的场景。 +- 在持续增删节点的过程中,二叉搜索树可能产生倾斜,时间复杂度劣化至 $O(n)$ 。 +- 若使用 AVL 树或红黑树,则各项操作可在 $O(\log n)$ 效率下稳定运行,但维护树平衡的操作会增加额外开销。 diff --git a/docs/chapter_searching/summary.md b/docs/chapter_searching/summary.md index dbee447c5..31798c02c 100644 --- a/docs/chapter_searching/summary.md +++ b/docs/chapter_searching/summary.md @@ -1,16 +1,8 @@ # 小结 -- 线性查找通过遍历数据结构并进行条件判断来完成查找任务。 - 二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且仅适用于数组或基于数组实现的数据结构。 -- 哈希查找利用哈希表实现常数阶时间复杂度的查找操作,体现了空间换时间的算法思维。 -- 下表概括并对比了三种查找算法的特性和时间复杂度。 - -
- -| | 线性查找 | 二分查找 | 哈希查找 | -| ------------------------------------- | ------------------------ | ----------------------------- | ------------------------ | -| 适用数据结构 | 数组、链表 | 有序数组 | 数组、链表 | -| 时间复杂度
(查找,插入,删除) | $O(n)$ , $O(1)$ , $O(n)$ | $O(\log n)$ , $O(n)$ , $O(n)$ | $O(1)$ , $O(1)$ , $O(1)$ | -| 空间复杂度 | $O(1)$ | $O(1)$ | $O(n)$ | - -
+- 暴力搜索通过遍历数据结构来定位数据。线性搜索适用于数组和链表,广度优先搜索和深度优先搜索适用于图和树。此类算法通用性好,无需对数据预处理,但时间复杂度 $O(n)$ 较高。 +- 哈希查找、树查找和二分查找属于高效搜索方法,可在特定数据结构中快速定位目标元素。此类算法效率高,时间复杂度可达 $O(\log n)$ 甚至 $O(1)$ ,但通常需要借助额外数据结构。 +- 实际中,我们需要对数据体量、搜索性能要求、数据查询和更新频率等因素进行具体分析,从而选择合适的搜索方法。 +- 线性搜索适用于小型或频繁更新的数据;二分查找适用于大型、排序的数据;哈希查找适合对查询效率要求较高且无需范围查询的数据;树查找适用于需要维护顺序和支持范围查询的大型动态数据。 +- 用哈希查找替换线性查找是一种常用的优化运行时间的策略,可将时间复杂度从 $O(n)$ 降低至 $O(1)$ 。 diff --git a/docs/chapter_tree/binary_search_tree.md b/docs/chapter_tree/binary_search_tree.md index dd38bdf6c..731883abe 100755 --- a/docs/chapter_tree/binary_search_tree.md +++ b/docs/chapter_tree/binary_search_tree.md @@ -268,36 +268,21 @@ ## 二叉搜索树的效率 -假设给定 $n$ 个数字,最常见的存储方式是「数组」。对于这串乱序的数字,常见操作的效率如下: +给定一组数据,我们考虑使用数组或二叉搜索树存储。 -- **查找元素**:由于数组是无序的,因此需要遍历数组来确定,使用 $O(n)$ 时间; -- **插入元素**:只需将元素添加至数组尾部即可,使用 $O(1)$ 时间; -- **删除元素**:先查找元素,使用 $O(n)$ 时间,再在数组中删除该元素,使用 $O(n)$ 时间; -- **获取最小 / 最大元素**:需要遍历数组来确定,使用 $O(n)$ 时间; - -为了获得先验信息,我们可以预先将数组元素进行排序,得到一个「排序数组」。此时操作效率如下: - -- **查找元素**:由于数组已排序,可以使用二分查找,平均使用 $O(\log n)$ 时间; -- **插入元素**:先查找插入位置,使用 $O(\log n)$ 时间,再插入到指定位置,使用 $O(n)$ 时间; -- **删除元素**:先查找元素,使用 $O(\log n)$ 时间,再在数组中删除该元素,使用 $O(n)$ 时间; -- **获取最小 / 最大元素**:数组头部和尾部元素即是最小和最大元素,使用 $O(1)$ 时间; - -观察可知,无序数组和有序数组中的各项操作的时间复杂度呈现“偏科”的特点,即有的快有的慢。**然而,二叉搜索树的各项操作的时间复杂度都是对数阶,在数据量 $n$ 较大时具有显著优势**。 +观察可知,二叉搜索树的各项操作的时间复杂度都是对数阶,具有稳定且高效的性能表现。只有在高频添加、低频查找删除的数据适用场景下,数组比二叉搜索树的效率更高。
-| | 无序数组 | 有序数组 | 二叉搜索树 | -| ------------------- | -------- | ----------- | ----------- | -| 查找指定元素 | $O(n)$ | $O(\log n)$ | $O(\log n)$ | -| 插入元素 | $O(1)$ | $O(n)$ | $O(\log n)$ | -| 删除元素 | $O(n)$ | $O(n)$ | $O(\log n)$ | -| 获取最小 / 最大元素 | $O(n)$ | $O(1)$ | $O(\log n)$ | +| | 无序数组 | 二叉搜索树 | +| -------- | -------- | ----------- | +| 查找元素 | $O(n)$ | $O(\log n)$ | +| 插入元素 | $O(1)$ | $O(\log n)$ | +| 删除元素 | $O(n)$ | $O(\log n)$ |
-## 二叉搜索树的退化 - -在理想情况下,我们希望二叉搜索树是“平衡”的,这样就可以在 $\log n$ 轮循环内查找任意节点。 +在理想情况下,二叉搜索树是“平衡”的,这样就可以在 $\log n$ 轮循环内查找任意节点。 然而,如果我们在二叉搜索树中不断地插入和删除节点,可能导致二叉树退化为链表,这时各种操作的时间复杂度也会退化为 $O(n)$ 。 diff --git a/mkdocs.yml b/mkdocs.yml index 805ff23ce..ec619f982 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -136,8 +136,7 @@ nav: - 2.1.   算法效率评估: chapter_computational_complexity/performance_evaluation.md - 2.2.   时间复杂度: chapter_computational_complexity/time_complexity.md - 2.3.   空间复杂度: chapter_computational_complexity/space_complexity.md - - 2.4.   权衡时间与空间: chapter_computational_complexity/space_time_tradeoff.md - - 2.5.   小结: chapter_computational_complexity/summary.md + - 2.4.   小结: chapter_computational_complexity/summary.md - 3.     数据结构简介: - 3.1.   数据与内存: chapter_data_structure/data_and_memory.md - 3.2.   数据结构分类: chapter_data_structure/classification_of_data_structure.md @@ -152,44 +151,45 @@ nav: - 5.2.   队列: chapter_stack_and_queue/queue.md - 5.3.   双向队列: chapter_stack_and_queue/deque.md - 5.4.   小结: chapter_stack_and_queue/summary.md - - 6.     散列表: - - 6.1.   哈希表: chapter_hashing/hash_map.md - - 6.2.   哈希冲突处理: chapter_hashing/hash_collision.md - - 6.3.   小结: chapter_hashing/summary.md - - 7.     树: - - 7.1.   二叉树: chapter_tree/binary_tree.md - - 7.2.   二叉树遍历: chapter_tree/binary_tree_traversal.md - - 7.3.   二叉搜索树: chapter_tree/binary_search_tree.md - - 7.4.   AVL 树 *: chapter_tree/avl_tree.md - - 7.5.   小结: chapter_tree/summary.md - - 8.     堆: - - 8.1.   堆: chapter_heap/heap.md - - 8.2.   建堆操作 *: chapter_heap/build_heap.md - - 8.3.   小结: chapter_heap/summary.md - - 9.     图: - - 9.1.   图: chapter_graph/graph.md - - 9.2.   图基础操作: chapter_graph/graph_operations.md - - 9.3.   图的遍历: chapter_graph/graph_traversal.md - - 9.4.   小结: chapter_graph/summary.md - - 10.     查找算法: - - 10.1.   线性查找: chapter_searching/linear_search.md - - 10.2.   二分查找: chapter_searching/binary_search.md - - 10.3.   哈希查找: chapter_searching/hashing_search.md - - 10.4.   小结: chapter_searching/summary.md + - 6.     二分查找: + - 6.1.   二分查找: chapter_binary_search/binary_search.md + - 7.     散列表: + - 7.1.   哈希表: chapter_hashing/hash_map.md + - 7.2.   哈希冲突处理: chapter_hashing/hash_collision.md + - 7.3.   小结: chapter_hashing/summary.md + - 8.     树: + - 8.1.   二叉树: chapter_tree/binary_tree.md + - 8.2.   二叉树遍历: chapter_tree/binary_tree_traversal.md + - 8.3.   二叉搜索树: chapter_tree/binary_search_tree.md + - 8.4.   AVL 树 *: chapter_tree/avl_tree.md + - 8.5.   小结: chapter_tree/summary.md + - 9.     堆: + - 9.1.   堆: chapter_heap/heap.md + - 9.2.   建堆操作 *: chapter_heap/build_heap.md + - 9.3.   小结: chapter_heap/summary.md + - 10.     图: + - 10.1.   图: chapter_graph/graph.md + - 10.2.   图基础操作: chapter_graph/graph_operations.md + - 10.3.   图的遍历: chapter_graph/graph_traversal.md + - 10.4.   小结: chapter_graph/summary.md - 11.     排序算法: - 11.1.   排序算法: chapter_sorting/sorting_algorithm.md - 11.2.   冒泡排序: chapter_sorting/bubble_sort.md - 11.3.   插入排序: chapter_sorting/insertion_sort.md - 11.4.   快速排序: chapter_sorting/quick_sort.md - 11.5.   归并排序: chapter_sorting/merge_sort.md - - 11.6.   桶排序(New): chapter_sorting/bucket_sort.md - - 11.7.   计数排序(New): chapter_sorting/counting_sort.md - - 11.8.   基数排序(New): chapter_sorting/radix_sort.md + - 11.6.   桶排序: chapter_sorting/bucket_sort.md + - 11.7.   计数排序: chapter_sorting/counting_sort.md + - 11.8.   基数排序: chapter_sorting/radix_sort.md - 11.9.   小结: chapter_sorting/summary.md - - 12.     回溯算法: - - 12.1.   回溯算法(New): chapter_backtracking/backtracking_algorithm.md - - 13.     附录: - - 13.1.   编程环境安装: chapter_appendix/installation.md - - 13.2.   一起参与创作: chapter_appendix/contribution.md + - 12.     搜索算法: + - 12.1.   搜索算法(New): chapter_searching/searching_algorithm_revisited.md + - 12.2.   哈希优化策略: chapter_searching/replace_linear_by_hashing.md + - 12.3.   小结: chapter_searching/summary.md + - 13.     回溯算法: + - 13.1.   回溯算法(New): chapter_backtracking/backtracking_algorithm.md + - 14.     附录: + - 14.1.   编程环境安装: chapter_appendix/installation.md + - 14.2.   一起参与创作: chapter_appendix/contribution.md - 参考文献: - chapter_reference/index.md