在直接定址方式下,具有關鍵字k的元素被存放在槽k中。在雜湊方式下,該元素存放在槽h(k)中:即利用雜湊函式(hash function)h,由關鍵字k計算出槽的位置。
這裡,函式h將關鍵字的全域u對映到雜湊表(hash table)t[0...m-1]的槽位上:
h:u->
這裡,雜湊表的大小m一般要比|u|小得多。我們可以說乙個具有關鍵字k的元素被雜湊到槽h(k)上,也可以說h(k)是關鍵字k的雜湊值。
衝突:兩個關鍵字可能對映到同乙個槽中。解決衝突的方法:
鏈結法。開放定址法。
把雜湊在同乙個槽中的所有元素都放在乙個鍊錶中,槽j中有乙個指標,它指向儲存所有雜湊到j的元素的鍊錶的表頭;如果不存在這樣的元素,則槽j中為nil。
class chained_hash:
def __init__(self,t=,size=0):
if len(t)==0:
self.t=[none for i in range(size)]
else:
self.t=t
self.size=size
def search(self,k):
if self.t[self.hash_h(k)]!=none:
x=self.t[self.hash_h(k)].list_search(k)
return x
return none
def insert(self,x):
if self.t[self.hash_h(x.key)]==none:
self.t[self.hash_h(x.key)]=doublylinkedlist(x)
else:
self.t[self.hash_h(x.key)].list_insert(x)
def delete(self,x):
self.t[self.hash_h(x.key)].list_delete(x)
def hash_h(self,key):
return key%12
class node:
def __init__(self,key):
self.key=key
#####雙向鍊錶####
class doublynode:
def __init__(self,n_prev,n_next,key):
self.prev=n_prev
self.next=n_next
self.key=key
class doublylinkedlist:
def __init__(self,head):
self.head=head
def list_search(self,k):
x=self.head
while x !=none and x.key!=k:
x=x.next
return x
def list_insert(self,x):
x.next=self.head
if self.head != none:
self.head.prev=x
self.head=x
x.prev=none
def list_delete(self,x):
if x.prev!=none:
x.prev.next=x.next
else:
self.head=x.next
if x.next !=none:
x.next.prev=x.prev
執行結果:
>>> t=
>>> x=doublynode(none,none,13)
>>> ch=chained_hash(t,12)
>>> ch.insert(x)
>>> x=doublynode(none,none,25)
>>> ch.insert(x)
>>> y=ch.search(25)
>>> y.key
25>>> ch.delete(y)
>>> ch.t[1].head
<__main__.doublynode object at>
>>> ch.t[1].head.key
13>>> ch.t[1].head.next
>>>
hash_h是自定義的除法雜湊法。h(k)=k mod m
其中m=12。相應地,雜湊表的槽t的個數為12。t中的每個元素都是乙個雙向鍊錶。
《演算法導論》雜湊表
雜湊表 hash table 是實現字典操作 查詢 插入 刪除 的有效資料結構,具有很高的查詢效率。一定情況下查詢元素的期望時間是o 1 優於鍊錶 o n 和直接定址的陣列 查詢也是o 1 相當。但當實際儲存的關鍵字數比可能的關鍵字總數小的時候,雜湊錶比陣列有效。一些記號 直接定址,關鍵字k存放在第...
演算法導論 雜湊表
include include includeusing namespace std const int length 6 待插入的數列長度 const int tablesize 11 雜湊表的容量 應該打大於數列長度以保證每個元素都有處可放 typedef struct hash hashtab...
演算法導論 雜湊表
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 8 雜湊表 hash table 是一種支援高效插入,查詢,刪除操作的動態集合結構。並且在滿足一些合理假設下,這些操作的平均時間複雜度可以達到 1 這也是雜湊表能夠和二叉搜尋樹 紅黑樹 抗衡的乙個重要方面。一 直接定址表 當關鍵字集合...