本帖最后由 Bodhidharma 于 2013-10-11 07:27 编辑
tshaer 发表于 2013-10-10 22:55
依據流程圖,lookup(3,{1,1,7},{"a","b","c"})會這樣跑:
left=1,right=3
posi=int((1+3)/2)=2
唔…理解不太對
的確,要理解lookup二分法的流程圖
很重要的概念就是要知道lookup預設數據是升序的
第二參數的量太少的話不好說明,以下舉個例子:
lookup(7,{2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38})
首先left=1,right=19,要將left和right理解為「待查找的數據範圍」
left是最小,right是最大
然後lookup從中間(int(left+right)/2))開始找,posi=10
A(10)=20,比7還大,因此lookup就知道,大於等於10的posi都是比7還大,因此就不用再找了
因此right變成9,也就是只從{2,4,6,8,10,12,14,16,18}這組數據中找
再從中間找,posi=int((1+9)/2)=5,A(posi)=10
還是大於7,因此right就變成4,也就是只從{2,4,6,8}這組數是中找
可以看出來,lookup都是從中間找,一次就可以砍掉一半不需要再找的數據
因此叫做「二分搜尋法」,是一種相當有效率的查找方法
接下來posi=int((1+4)/2)=2,A(posi)=4,比7小
此時left變成3,也就是說比posi(3)小的數據都不需要找了(因為都比7小)
因此就只從{6,8}這組數據中找
再來posi=int((3+4)/2)=3,A(posi)=6,比7小
因此left變成4,再來posi=int((4+4)/2)=4,A(posi)=8,比7大
此時posi=left,也就是說,7已經比查找數據的最小值還要小了
因此若posi=1,就返回#N/A(因為第一參數比所有數據小)
不然的話posi=posi-1,變成3,也就是說返回比最小的數據「再小一點的數」
因此最後就返回A(3)=6
|