演算法導論程式25 雜湊表(Python)

2021-08-01 16:05:42 字數 2353 閱讀 2608

在直接定址方式下,具有關鍵字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 這也是雜湊表能夠和二叉搜尋樹 紅黑樹 抗衡的乙個重要方面。一 直接定址表 當關鍵字集合...