下載/瀏覽

Download Report

Transcript 下載/瀏覽

二分搜尋
南台科大 電子系
黎 靖
二分搜尋(Binary Search)

資料必須事先排序。

取中間值做比較。

較中間值小,捨棄較大的部份。

較中間值大,捨棄較小的部份。

反覆找出所要的資料位置。
EX:
[0] [1]
6
33
[2]
[3] [4]
[5] [6]
39
41
55
52
69
[7]
[8]
[9]
77
78
81
Key=78
第i次比較
1
2
3
l
0
5
8
r
9
9
9
m
4
7
8
Key與a[m]
78>52
78>77
78=78
新範圍
右半部
右半部
成功
例1:
例1:
例1:
例1:
例1:
例2:
例2:
例2:
例2:
例2:
例2:
例3:
例3:
例3:
例3:
例3:
例3:
例3:
例3:
例3:
搜尋失敗
Binary search (二元搜尋)
void binsearch1 (unsigned n, const Keytype S[ ], Keytype x,
Index& location)
{
Index low = 1, high = n, mid; location = 0;
while (low <= high && 0 == location)
{
mid = (unsigned)(low + high)/2;
if (x < S[mid]) high = mid-1;
else if (x > S[mid]) low = mid + 1;
else location = mid;
}
}
Binary search (二元搜尋)
Index binsearch2 (const unsigned n, const Keytype S[ ],
Keytype x)
{
Index low = 0, high = n+1, mid; // Add sentinels
while (low+1 != high)
{
mid = (unsigned)(low + high)/2;
if (x <= S[mid]) high = mid;
else low = mid;
}
Index location = high;
return (location >= n+1 || S[location] != x)? 0 : high;
}
二元搜尋法的特性

檔案中的記錄必須排序。

檔案可以直接讀取。

時間複雜度為O(log2n)。

檔案越大越適合。

較適合不會再進行插入與刪除動作的靜態資料。
循序搜尋與二分搜尋比較
循序搜尋
優點
缺點
二分搜尋
方法簡單,不須事先
速度較快
排序
速度較慢且沒有效率 須事先排序
二元與循序搜尋的比較
陣列大小
循序搜尋
( 平均情況 )
二元搜尋
循序搜尋
( 最差情況 )
16
4
8
16
50
6
25
50
256
8
128
256
1,000
10
500
1,000
10,000
14
5000
10,000
100,000
17
50,000
100,000
1,000,000
20
500,000
1,000,000
結束
謝謝大家