Presentation is loading. Please wait.

Presentation is loading. Please wait.

JAVA 程式設計與資料結構 第十六章 Hash Tables. Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其.

Similar presentations


Presentation on theme: "JAVA 程式設計與資料結構 第十六章 Hash Tables. Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其."— Presentation transcript:

1 JAVA 程式設計與資料結構 第十六章 Hash Tables

2 Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其 size 為 N ,也就是 A 的 Capacity 。每個物件需要有一個 Key ,用來判 斷物件需要放入哪一個籃子裡。 如果 key 是唯一的,而且忽略 collision ,那麼 searches , insertion 和 removals 的 worst-cast 執 行時間為 O(1)

3 Hash Functions and Hash Code Hash Function 的用處就是將 key 轉換成 hash code (稱 之為 k 的 hash code )。 根據 hash code 來決定物件需放 在 Bucket Array 的某位置。 h(k) 代表 hash function ,其中 k 就是 key 。如果 h(k) 的範圍 剛好介於 [0 , N-1] 之間,那便可以直接將 (k,e) 存入籃子 A[h(k)] 內,其中 e 為欲存入之物件。 必須特別注意的是我們必須要慎選 hash function 跟 key 。 因為我們希望的是每個籃子內裝的物件沒有 collision , 如果 hash function 跟 key 沒有設計好的話,很容易產生物 件集中在少數幾個籃子內的情形。

4 Compression Maps 當 Hash Code 的值並不是座落在 Bucket Array 的 Index 範 圍內時(也就是 [0, N-1] ),只要將 Hash Code 除以 N-1 , 然後求其餘數即可。 在這樣的情形下,我們還得注意慎選 N 的值,如果 N 為質 數的話,對於平均分佈物件會有較好的效果。例如如果 我們有 keys{200,205,210,215,220, …..,600} ,如果 N 的 值等於 100 ,那麼所有的 hash code 都會是 5 的倍數,也 就是說所有的物件都會擠在 5 的倍數的籃子裡,這樣會 造成許多的 collision 。可是如果我們將 N 的值改成 101 的 話,那麼這樣的情形便會改善許多。

5 Compression Maps 對於一些容易有重複型態的 key ,例如都是某個 數的倍數,我們可以用比較複雜的 hash function 來求得分佈較好的 hash code 。 例如:

6 Collision-Handling Schemes 雖然我們有上述許多設計較好 hash function 的方 法,還是難以避免會出現兩個物件有相同 hash code 的情況 (collision) ,亦即,這樣我們便無法 直接將新物件 insert 進 hash table 。也會影響尋 找的功能。此時我們必須有一些機制來反應這個 情況。 以下介紹 Separate Chaining & Open Addressing 兩種機制。

7 Separate Chaining 在每一個籃子裡,我們放入一個 Vector 或是 Linked List 來儲存相同 key 的物品,也就是在 A[i] 內,放入一個 Vector 或 Linked List , B 。這樣我 們便可以將 collision 的情況解決。 需要注意 B 這個 Vector(or Linked List) 的物件個 數需要時時的監控,不可使之過長,否則便會增 長操作的時間,而也就失去了 Hash Table 的用 意。

8 Open Addressing open addressing 的方法就是只使用一個 hash table 的結構,不過這樣需要使用較為複雜的方 式來處理 collision ,而且在 open addressing 的方 式中, load factor 必須要小於 1 ,也就是,而且 物件便直接儲存在 Bucket Array 之內。一般有以 下幾種方式: – Linear Probing – Quadratic Probing – Double Hashing

9 Load Factors and Rehashing Load Factor 的定義為,而且我們希望的值小於 1 。根據經 驗及一般的案例分析,如果使用 open addressing 的話,的 值最好小於 0.5 。如果是使用 separate chaining 的話,的值 最好小於 0.9 。 保持的值在一個相當的低點變成維護 hash table 所必須的一 件事。當的值變大到超過一個固定的值,通常我們需要重 新調整 hash table 的大小,並且將所有的物件重新加入到新 的 hash table 內。一般來說,如果要重新調整 hash table 的 大小,通常會將讓新的 hash table 的大小為原來的兩倍。此 外,我們可能還需要重新定義 hash function 以符合新的 hash table 的大小。這樣的程序我們稱之為 rehashing 。


Download ppt "JAVA 程式設計與資料結構 第十六章 Hash Tables. Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其."

Similar presentations


Ads by Google