From 8135db87a93deb0f258b0d469d7693107fb0aad6 Mon Sep 17 00:00:00 2001 From: Cheung4843 <46809977+cheung4843@users.noreply.github.com> Date: Mon, 26 Feb 2024 16:32:23 +0800 Subject: [PATCH] Deployed 7bd2dae with MkDocs version: 1.5.3 --- algorithm/basic_algo/binary_search/index.html | 184 ++++++++++++++++++ algorithm/basic_algo/linear_search/index.html | 2 +- .../basic_algo/media/binary_search_1.png | Bin 0 -> 179910 bytes .../basic_algo/media/binary_search_2.mp4 | Bin 0 -> 563006 bytes .../basic_algo/media/binary_search_3.mp4 | Bin 0 -> 889037 bytes algorithm/what_is_algo/index.html | 45 ++++- search/search_index.json | 2 +- sitemap.xml | 76 ++++---- sitemap.xml.gz | Bin 556 -> 556 bytes 9 files changed, 260 insertions(+), 49 deletions(-) create mode 100755 algorithm/basic_algo/media/binary_search_1.png create mode 100755 algorithm/basic_algo/media/binary_search_2.mp4 create mode 100755 algorithm/basic_algo/media/binary_search_3.mp4 diff --git a/algorithm/basic_algo/binary_search/index.html b/algorithm/basic_algo/binary_search/index.html index a499d64..275531d 100755 --- a/algorithm/basic_algo/binary_search/index.html +++ b/algorithm/basic_algo/binary_search/index.html @@ -1305,6 +1305,17 @@ + + @@ -1315,6 +1326,52 @@ + + + + @@ -1754,6 +1811,41 @@ + +
Binary Search(二元搜尋法) 是分治法(Divide and Conquer)的一種應用,非常有效率,但只適用在單調(Monotonic)的序列或函數上,也就是說,必須是遞增或遞減的,或是你簡單理解成排序過(sorted)的,舉幾個例子:
+[1, 2, 3, 4, 5]
['a', 'b', 'c', 'd', 'e']
[32, 16, 8, 4, 2, 1]
函數 \(f(x)=x^2\) 在 \(x \ge 0\) 時是遞增的:
+ +最後一個例子是想跟你強調,函數也可以用二元搜尋法,例如想要找第一個 \(f(x) \ge 10\) 的整數 \(x\),我們可以用二元搜尋法找到 \(x=4\)。
+玩過猜數字嗎?你每猜一次,我會告訴你猜的數字是太大還是太小,讓你從 \([1, 100]\) 間猜一個數字,怎麼猜會最有效率?如果你第一次就猜 \(50\),我告訴你猜的數字太大,你就可以知道答案一定在 \([1, 49]\) 之間,這樣你就可以省下一半的時間,你可以再猜 \(25\),而我告訴你猜的數字太小,那麼答案一定在 \([26, 49]\) 之間,你又省下一半的時間,這就是二元搜尋法的精神。
+ + +那最多要猜幾次呢?假設你真的很衰,猜到剩下 \([47, 48]\) 這兩個數字在選的時候又猜錯,你猜了 \(47\) 而我告訴你猜太小,那就只剩下 \(48\) 了,也就是區間 \([48, 48]\) 剩下一個元素,這是我們的終止條件。
+考慮一般的情況,有 \(n\) 個數字,每次猜都可以把區間縮小一半,設我們要猜 \(k\) 次才能把區間縮小到剩下一個元素:
+那麼時間複雜度就是 \(\mathcal{O}(k) = \mathcal{O}(\log n)\)。
+在寫程式之前,先來看動畫,有一個已排序過的串列 [1, 1, 4, 5, 7, 8, 9, 10, 11, 12]
,我們要找 4
:
再來看程式碼:
+Output | |
---|---|
直接來看程式碼,定義 linear_search(lst, target)
函式,這個函式接受一個串列 lst
和一個目標值 target
,回傳目標值在串列中的索引,如果目標值不存在就回傳 -1
。