國立聯合大學 資訊管理學系 陳士杰老師
Course 4
搜尋
Search
▓
Outlines
本章重點 Search
{ 分類觀點
{ Linear Search
{ Binary Search
{ Interpolation Search
{ Hashing
Internal Search v.s. External Search.
Static Search v.s. Dynamic Search.
Partial Key Partial Key v.s. Whole Key v.s . Whole Key
Actual Key Actual Key v.s v.s . Transformation Key . Transformation Key
▓
Search 分類觀點
Internal Search v.s. External Search
觀點: 資料量的多寡資料量的多寡
Internal Search: Def: 資料量少,可以一次全部置於 Memory Memory 中進行 search之工作
External Search: Def: 資料量大,無法一次全置於Memory中,須藉助 輔助儲存體 (E.g. Disk),進行分段search之工作
{ B-tree
{ M-way Search tree
被搜尋的資料集合、資料的搜尋範圍、或資料所存在的表 格,其內容是否經常異動
經常異動 (如: 是否常做資料的插入、刪除或更新) ? 否: Static
{ 紙本的字典、電話簿
是: Dynamic
{ 日常交易資料、電腦字典
Static Search v.s. Dynamic Search
Def:
又稱
Sequential Search Sequential Search
。 自左到右 (或右到左),逐一比較各個記錄的鍵值與搜尋鍵值是
否相同。
若有找到,則Found (成功搜尋); 若Search完整個資料範圍仍未 找到,謂之失敗 (Not found)。
特質:
檔案記錄不須事先排序不須事先排序
可由
Random Access Random Access
(e.g., Array) 或Sequential Access Sequential Access
(e.g., Link List) 機制支援 Time Complexity:
O(n) O(n )
,n為資料個數 (∵線性)▓
Linear Search (線性搜尋)
Linear Search的演算法可分成兩種: Non-Sential (無崗哨) Linear Search
Sential Linear Search
Non-Sential Linear Search
//記錄個數
//Array of records (file of records) //欲搜尋的鍵值
//輸出的結果
├ FoundFound: location指出記錄的所在位置
└ Not FoundNot Found: location重設為0
4
2 3 5 … n 1
S
location
1 2
分析
平均比較次數
(針對 “成功” 的搜尋): (1+2+3+…+n)/n
= n(n+1)/2×1/n = (n+1)/2
>Time: O(n O(n ) )
Sential Linear Search
//記錄個數
//Array of records (file of records) //欲搜尋的鍵值
//輸出的結果
├ FoundFound: location表示出記錄的所在位置
└ Not FoundNot Found: location為0
location
1
觀念: 多一個S[0]記錄,其鍵值設定為x
4
2 3 5 … n 1
S
0x
分析
以實際的執行時間
實際的執行時間而言: 由於少了 “測試測試
Search Search
範圍是否結束” 之比較範圍是否結束 (即: location <= nlocation <= n)
, 所以當n極大時,大約可以省下½ 的比較時間。 ½
以 Time Complexity Time Complexity
分析而言:分析 由於仍然是線性搜尋,所以時間複雜度還是
O(n) O(n )
。▓
Binary Search (二分搜尋)
實施前提:
檔案中記錄須事先由小到大由小到大排序過
須由
Random ( Random (
或或Direct) access Direct) access
之機制支援 (e.g., Array)
觀念:
每次皆與Search範圍的中間記錄中間記錄進行比較!!
while ( l ≤ u )
比較 (k, S[m])
case “=”: found, i = m, return i;
case “<”: uu= m-1;
case “>”: ll= m+1;
recurn 0;
… …
小 大
⎥⎦⎥
⎢⎣⎢ +
= 2 middle
l u
⎥⎦⎥
⎢⎣⎢ +
= 2
m l u
l m umiddle l m u
S
//找到了
//要找的資料在左半部 //要找的資料在右半部
Recursion Version:
Algorithm
Iteration Version:
分析
利用Time function T(n) = T(n/2) + O(1)
= T(n/2) + c
= (T(n/4 + c)) + c = T(n/4) + 2c
= (T(n/8) + c) + 2c = T(n/8) +3c
= …
= T(n/n) + log
2n×c
= T(1) + c log
2n
(T(1) = 1, c 為大於 0 的常數)= 1 + c log
2n
∴ T(n) = O(log
2n)
▓
Interpolation Search (插補搜尋)
比較符合人類Search之行為
實施前提:
檔案中記錄須事先由小到大由小到大排序過
須由
Random ( Random (
或或Direct) access Direct) access
之機制支援 (e.g., Array)
作法:
while ( l ≤ u && i == 0)
比較 (x, S[mid])
case 1 “=”: found, i = mid, return i;
case 2 “<”: uu= mid-1;
case 3 “>”: ll= mid+1;
recurn 0;
小 大
⎥ ⎦
⎢ ⎥
⎣
⎢ × − +
−
= − ( 1 )
] [ ] [
]
[ u l
l S u S
l S m x
⎥⎦
⎢ ⎥
⎣
⎢ × − +
− + −
= ( 1)
] [ ] [
]
[ u l
l S u S
l S l x
mid
l u
S
//找到了
//要找的資料在左半部 //要找的資料在右半部 l + mm
m
( m 是一個比較的距離)
Algorithm
//若S數列中只有一個數字時,防止分母為0
Case 1 Case 2 Case 3
分析
其時間分析的效能是與鍵值分佈有關。一般而言,
Uniform Distribution有Best effect.
Time Complexity:
O(logO(log22 n)n)~
O(nO(n)) 最佳情況: 同Binary Search– O(logO(log22 n)n)
{ 每一次都切一半
最差情況: 同線性Search– O(nO(n))
{ 第一次切割後,會剩下 (n-1); 第二次切割後,會剩下 (n-2)筆; …依 此類推。
{ 即每一次切割後,只有一筆資料被摒除於下一次的搜尋資料之
外。
▓
Hashing (雜湊)
Def: 為一種資料貯存與搜尋的技術。若要存取某筆資料x,
則先將x經過
Hashing Function計算,得出Hashing Function Hashing Address,Hashing Address再到 Hash Table對應的
Hash TableBucket中進行存取x的動作。
Bucket
Hash Table的結構
由一組Buckets所組成,每個Buckets由一組Slot所組成,每個Slot可 存一筆記錄。
圖示:
> Hash Table Size = b × s
Hash Table
Bucket (桶子)
Slot (槽)
b 個
s 個
x Hashing
Function H(x)
(Hash Address)
存 / 取
優點: 資料搜尋時,記錄不需要事先排序
在沒有collision及overflow情況下,資料搜尋的Time為 O(1)
{ 與資料量 n 無關
保密性高
{ ∵若不知Hashing function,則無法存取資料
可作資料壓縮之用
相關術語
Identifier Density 與 Loading Density Def: 令T為identifier總數,n為目前使用者的identifier個 數,b為Hash Table之Bucket數目,S為Bucket中之Slot 數目,則:
{ Identifier Density = n/T
{ Loading Density = n/(b×S) = α
α 愈大,則表示Hash Table Utilization高,但相對地Collision / Overflow機率也變高。
Collision Def: 不同的資料 (e.g., x與y) 在經由Hashing Function計
算,竟得出相同的Hashing Address (即 H(x) = H(y)) 稱
之。
Overflow Def: 當Collision產生,且Bucket中無多餘的Slot可存資料 稱之。
有Collision並不一定有Overflow,但有Overflow,則必 有Collision發生。
若Bucket只有一個Slot,則Collision = Overflow
w → H(w)
x → H(x) w x
y → H(y)
y z → H(z)
z: Overflow
Hashing Function設計
一個良好的Hashing Function須滿足下列三個準則:
計算簡單計算簡單
Collision Collision
宜盡量少宜盡量少{ Ex: x mod 2就是不好的Hashing Function!!
(∵不是0就是1,會經常發生Collision)
不要造成不要造成
Hashing Table Hashing Table
局部儲存局部儲存( (
局部偏重局部偏重) )
的情況的情況{ 會引發 “空間利用度差” 與 “Collision上升” 的缺失
上述準則導引出兩個名詞:
Perfect Hashing FunctionPerfect Hashing Function (完美的雜湊函數)
{ Def: 此Hashing Function 絕對不會有Collision發生
{ 前提: 須先知道所有資料 (for Static Search)
Uniform Hashing FunctionUniform Hashing Function (均勻的雜湊函數)
{ Def: 此種Hashing Function計算所得出的Hashing Address,對應到每 個Bucket No.的機率皆相等。(不會有局部偏重的情況)
4種常見的Hashing Function
Middle Square (平方值取中間位數)
Mod (餘數,或 Division)
Folding Addition (折疊相加)
Digits Analysis (位數值分析)
Def: 將Key值取平方,依Hashing Table Bucket數平方 目,選取適當的中間位數值作為Hash Address。適當的中間位數值 e.g., 假設有1000個Bucket,範圍編號為000~999,若有 一數值x = 8125,試利用Middle Square求其適當之Hash Address
Sol:
x = 8125 66015625
取中間三位 > 156
156= Hash Address (取015
015亦可)Middle Square (平方值取中間位數)
(取平方(取平方))
Def: H(x) = x mod m
m的選擇之注意事項: m不宜為 “2”
{ 求得的位址僅有0或1,collision的機會很大
m的選擇最好是質數 (除盡1和除盡自已)
Mod (餘數,或 Division)
Def: 將資料鍵值切成幾個相同大小的片段,然後將 這些片段相加,其總和即為Hashing Address
相加方式有兩種: Shift (移位)
Boundary (邊界)
若有一資料x = 12320324111220,請利用兩種不同的 Folding Addition方法求Hashing Address (假設片段 長度為3)。Folding Addition (折疊相加)
Sol:
x=12320324111220 are partitioned into three decimal digits long.
P1 = 123, P2 = 203, P3 = 241, P4 = 112, P5 = 20.
Shift folding:
Folding at the boundaries:
∑
== +
+ +
+
=
=
51
699 20
112 241
203 123
) (
i
P
ix h
123 203 241 112 20 123
302
211 241 h(x) = 123 + 302 + 241 + 211 + 20 = 897
020
Digits Analysis (位數值分析)
Def: 當資料事先已知,則可以選定基底r,然後分資料事先已知 析每個資料之同一位數值同一位數值。 若很
集中,則集中 捨棄該位; 捨棄 若很
分散,則分散 挑選該位,而挑選的位數值集合成挑選Hashing Address。
Ex:4種常見的Overflow處理方式
Linear Probing (線性探測)
Quadratic Probing (二次方探測)
Rehashing (再雜湊)
Link List (鏈結串列,或稱Chain)Linear Probing (線性探測)
Def: 又稱Linear Open Addressing。當H(x)發生overflow,則 循著H(x)+1, H(x)+2, …, H(x)-1順序,逐步搜尋,直到:
遇見有空的Bucket
已搜尋完一圈為止 (表示Hash Table Full,無法store)
圖示:
x
Hash Table有11個buckets (編號: 0~10),每個bucket只有一個slot,假設 Hashing Function =
x mod 11 x mod 11
,並採取 “Linear Probing”處理overflow。試 依照下列資料次序存入Hash Table,會得到什麼結果?5, 16, 33, 21, 22, 27, 38, 17
Sol:
缺點: 易形成資料群聚資料群聚
(Clustering) (Clustering)
現象,增加Searching Time0 33
1 22
2 3 4
5 5
6 16
7 27
8 38
9 17
10 21
C H(33)C H(22)
C H(5) C H(16) C H(27) C H(38) C H(17)
C H(21)
•
• 屬於“屬於“55”的部落”的部落。原
本應該屬於位置 “6”
的資料17,被擠到很 遠的地方,要翻山 越嶺才能找到它!!
• Search Time增加!!
Quadratic Probing (二次方探測)
Def: 為改善Clustering現象而提出。當H(x)發生overflow
時,則探測
(H(x) ± i2) mod b,b為bucket數,1 ≤ i ≤ (b- 1)/2
圖示:
C H(x) 空位的探測次序:
1 2 3
4
承接上題,並改採 “Quadratic Probing”處理overflow。則Hash Table內 容為何?
5, 16, 33, 21, 22, 27, 38, 17
Sol:
0 33
1 22
2 3
4 27
5 5
6 16
7 17
8
9 38
10 21
C H(33)C H(22)
C H(5) C H(16) C H(27) C H(38) C H(17)
C H(21)
0 33
1 22
2 44
3
4 27
5 5
6 16
7 17
8
9 38
10 21
承接上題,44 ⇒ ?
Sol:
H(44) = 0 > (0+12) mod 11 = 1
>(0-12) mod 11 = 10
> (0+22) mod 11 = 4
> (0-22) mod 11 = 7
> (0+32) mod 11 = 9
> (0-32) mod 11 =
2 2
負值需先加上1111的的 適當倍數,再取適當倍數 mod!!
Rehashing (再雜湊)
Def: 提供一系列的Hashing Functions: f1
, f2
, f3
, … fn
。 若使用 f1
發生overflow,則改用 f2
; 以此類推,直 到: 沒有overflow發生
全部function用完
將具有相同Hashing Address的資料,以
Link list Link list
方式串連在同一Bucket 中。 承接上題,並改採 “Quadratic Probing”處理overflow。則Hash Table內 容為何?
5, 16, 33, 21, 22, 27, 38, 17
Sol:
0 33
1 2 3 4
5 5
6 17
7 8 9
10 21
H(33)>
H(22)>
H(5)>
H(16)>
H(27)>
H(38)>
H(17)>
H(21)>
Link List (鏈結串列,或稱Chain)
16 22
27 38
補 補 充 充
補 1: Decision Tree for Binary Search
目的:
用以描述與了解用以描述與了解
Binary Search Binary Search
的比較行為的比較行為 一定是二元樹二元樹
給出n = 31筆記錄之Binary Search的決策樹
Sol:
欲搜尋記錄在第18筆,則比較 4 次才能找到
最多之比較次數為何 (比較幾次後,即知失敗)? 5 次
n筆記錄,最多的比較次數 = ⎡log
2(n+1)⎤ = 高度
1 31
l m u
16
[16]
u’
8
[8]
l’
24
[24]
[4] [12] [20] [28]
[2] [6] [10] [14] [18] [22] [26] [30]
[1] [3] [5] [7] [9] [11] [13] [15] [17] [19] [21] [23] [25] [27] [29] [31]
範例練習
繪出n=12筆記錄,執行Binary Search之Decision Tree
有下列資料,26, 55, 77, 19, 13, 2, 5, 49
以Binary Search找 “55” 須比較幾次?