• 沒有找到結果。

搜尋

N/A
N/A
Protected

Academic year: 2021

Share "搜尋"

Copied!
40
0
0

加載中.... (立即查看全文)

全文

(1)

國立聯合大學 資訊管理學系 陳士杰老師

Course 4

搜尋

Search

(2)

Outlines

‹

本章重點

„ Search

{ 分類觀點

{ Linear Search

{ Binary Search

{ Interpolation Search

{ Hashing

(3)

‹

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 分類觀點

(4)

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

(5)

‹

被搜尋的資料集合、資料的搜尋範圍、或資料所存在的表 格,其內容是否經常異動

經常異動 (如: 是否常做資料的插入、刪除或更新) ?

„ 否: Static

{ 紙本的字典、電話簿

„ 是: Dynamic

{ 日常交易資料、電腦字典

Static Search v.s. Dynamic Search

(6)

‹

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 (線性搜尋)

(7)

‹

Linear Search的演算法可分成兩種:

„ Non-Sential (無崗哨) Linear Search

„ Sential Linear Search

(8)

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

(9)

分析

‹

平均比較次數

(針對 “成功” 的搜尋)

: (1+2+3+…+n)/n

= n(n+1)/2×1/n = (n+1)/2

>Time: O(n O(n ) )

(10)

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

0

x

(11)

分析

‹

以實際的執行時間

實際的執行時間而言:

„ 由於少了 測試測試

Search Search

範圍是否結束” 之比較範圍是否結束 (即: location <= n

location <= n)

所以當n極大時,大約可以省下

½ 的比較時間。 ½

‹

Time Complexity Time Complexity

分析而言:分析

„ 由於仍然是線性搜尋,所以時間複雜度還是

O(n) O(n )

(12)

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

//找到了

//要找的資料在左半部 //要找的資料在右半部

(13)

‹

Recursion Version:

Algorithm

(14)

‹

Iteration Version:

(15)

分析

‹

利用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

2

n×c

= T(1) + c log

2

n

(T(1) = 1, c 為大於 0 的常數)

= 1 + c log

2

n

∴ T(n) = O(log

2

n)

(16)

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 是一個比較的距離)

(17)

Algorithm

//若S數列中只有一個數字時,防止分母為0

Case 1 Case 2 Case 3

(18)

分析

‹

其時間分析的效能是與鍵值分佈有關。一般而言,

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)筆; …依 此類推。

{ 即每一次切割後,只有一筆資料被摒除於下一次的搜尋資料之

外。

(19)

Hashing (雜湊)

‹

Def: 為一種資料貯存與搜尋的技術。若要存取某筆資料x,

則先將x經過

Hashing Function計算,得出Hashing Function Hashing Address,Hashing Address

再到 Hash Table對應的

Hash Table

Bucket中進行存取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)

存 / 取

(20)

‹

優點:

„ 資料搜尋時,記錄不需要事先排序

„ 在沒有collision及overflow情況下,資料搜尋的Time為 O(1)

{ 與資料量 n 無關

„ 保密性高

{ ∵若不知Hashing function,則無法存取資料

„ 可作資料壓縮之用

(21)

相關術語

‹

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)) 稱

之。

(22)

‹

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

(23)

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.的機率皆相等。(不會有局部偏重的情況)

(24)

4種常見的Hashing Function

‹

Middle Square (平方值取中間位數)

‹

Mod (餘數,或 Division)

‹

Folding Addition (折疊相加)

‹

Digits Analysis (位數值分析)

(25)

‹

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 (平方值取中間位數)

(取平方(取平方))

(26)

‹

Def: H(x) = x mod m

‹

m的選擇之注意事項:

„ m不宜為 “2”

{ 求得的位址僅有0或1,collision的機會很大

„ m的選擇最好是質數 (除盡1和除盡自已)

Mod (餘數,或 Division)

(27)

‹

Def: 將資料鍵值切成幾個相同大小的片段,然後將 這些片段相加,其總和即為Hashing Address

‹

相加方式有兩種:

„ Shift (移位)

„ Boundary (邊界)

‹

若有一資料x = 12320324111220,請利用兩種不同的 Folding Addition方法求Hashing Address (假設片段 長度為3)。

Folding Addition (折疊相加)

(28)

‹

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:

=

= +

+ +

+

=

=

5

1

699 20

112 241

203 123

) (

i

P

i

x h

123 203 241 112 20 123

302

211 241 h(x) = 123 + 302 + 241 + 211 + 20 = 897

020

(29)

Digits Analysis (位數值分析)

‹

Def: 當資料事先已知,則可以選定基底r,然後分資料事先已知 析每個資料之同一位數值同一位數值。

„ 若很

集中,則集中 捨棄該位; 捨棄

„ 若很

分散,則分散 挑選該位,而挑選的位數值集合成挑選

Hashing Address。

‹

Ex:

(30)

4種常見的Overflow處理方式

‹

Linear Probing (線性探測)

‹

Quadratic Probing (二次方探測)

‹

Rehashing (再雜湊)

‹

Link List (鏈結串列,或稱Chain)

(31)

Linear Probing (線性探測)

‹

Def: 又稱Linear Open Addressing。當H(x)發生overflow,則 循著H(x)+1, H(x)+2, …, H(x)-1順序,逐步搜尋,直到:

„ 遇見有空的Bucket

„ 已搜尋完一圈為止 (表示Hash Table Full,無法store)

‹

圖示:

x

(32)

‹ 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 Time

0 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增加!!

(33)

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

(34)

‹ 承接上題,並改採 “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)

(35)

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!!

(36)

Rehashing (再雜湊)

‹

Def: 提供一系列的Hashing Functions: f

1

, f

2

, f

3

, … f

n

若使用 f

1

發生overflow,則改用 f

2

; 以此類推,直 到:

„ 沒有overflow發生

„ 全部function用完

(37)

‹ 將具有相同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

(38)

補 補 充 充

(39)

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]

(40)

範例練習

‹

繪出n=12筆記錄,執行Binary Search之Decision Tree

‹

有下列資料,26, 55, 77, 19, 13, 2, 5, 49

„ 以Binary Search找 “55” 須比較幾次?

參考文獻

相關文件

(2)依評選項目表所列之評選項目、權重、配分標準評分。評選委員之評分以 100 分為滿分,平均 70 分(含)以上者為合格分數,惟如出席評選委員之過

,經由 50 週年校慶籌備委員會進行兩輪投票後,選出下列 5 則標語參加全校決選,請各位小朋友於下方標語中選出一 則你最喜歡的標語。

選取『篩選條件』選項,可依 [未決品項]、[未報 價品項] 等狀態顯示符合條件投標品項.

對任意連續函數,每個小區間上的取樣點 x 都選擇在函數最 大值與最小值發生的點。如下圖,淺色方塊的高度都挑選小

中學中國文學課程分為必修和選修兩部分。必修部分的學習材料

單一菜色與地區搜尋 ( 兩種二選一 ) 交叉搜尋 (4 種可同時 )/QR 碼搜尋.

因此以2020MEMOIR回憶錄為題,並且挑選了今年度發生的八件

• Utilize feedback from school administrations, teachers, and students to continuously make improvements. • Jointly interpret and make sense of data and generate ways to use