本系列文章同步分享於個人Blog → InformisTry-HankLee
一連講了好幾個Sorting的演算法,我們今天來換換口味,今天要講的演算法是用來針對已經排序之後的陣列進行搜尋,一個也很容易理解的演算 - Binary Search。
Binary Search的基本概念是將已經排序的陣列
用二分法拆成左右兩半進行比較,因為是已經排序的陣列,所以知道拆分過後的兩半,左邊比較小,右邊比較大,進而快速篩選出目標可能在哪一個部分,因此流程如下:
中間位置
的值與目標(K)進行比較。等於
K,則找到
目標。小於
K,則表示K位於右邊
區段。大於
K,則表示K位於左邊
區段。看看GIF吧:
有一個點特別提出來說明,所謂的『中間位置』,其實算法是將頭尾兩個位置所屬的index值相加後除以2,在無條件捨去而決定的,因此在上方GIF中,當只剩下四個位置的值要比較時,就是透過這個方式選擇20
來進行比較,而非24
。
那Binary Search的Pseudo-code大概會是怎樣呢?
// Input: An array Array[l,...,r] of ordered elements, and a search target k
// Output: an index to the position of k in Array if k is found or -1 otherwise.
function BinarySearchRecursive(Array[l,...,r], k){
if l > r {
return -1;
}
m = round((l+r)/2);
if k = Array[m] {
return m;
}else if k < Array[m]{
return BinarySearchRecursive(Array[l,...,m-1], k);
}else{
return BinarySearchRecursive(Array[m+1,...,l], k);
}
}
這種在一個方法中再次呼叫自身方法的寫法稱為遞迴(Recursive)
Binary Search在進行的過程中,每一次的迴圈都會將要搜尋的範圍減半
,這個方式可以大幅降低執行時間,因此對於這種會將範圍砍半的演算法,基本上其時間複雜度皆為O(㏒2 n)
。
既然這個問題出現在這篇文章,就表示這個解決辦法與Binary Search是一樣的:
這種解決辦法就是Binary Search的一個應用。
已經排序的陣列上
。O(㏒2 n)
。明天我們將會介紹一種資料結構 - Binary Search Tree。