t[0…m-1]的槽h(k)內,h(k)為雜湊值,但是存在乙個問題,不同的關鍵字可能有相同的雜湊值,存放在雜湊表內會發生衝突,因此,可以通過鏈結法,通過在每個槽內存放乙個指向雙向鍊錶或單向鍊錶的指標,把具有相同雜湊值的節點存放在一條鍊錶內從而解決衝突。
class
node
(object):
def__init__
(self, key)
: self.key = key
self.
next
=none
self.pre =
none
def__repr__
(self)
: value =''%
(self.key)
return value
class
hashtable
(object):
''' 雜湊表的實現(鏈結法)
'''def__init__
(self, t =
):self.t = t #雜湊表
self.m =
len(self.t)
#雜湊表的容量(槽的數目)
self.size =
0#雜湊表中所有元素的數量
def_hash
(self, key)
:#定義雜湊函式
return
abs(key)
% self.m
definsert
(self, node)
:#插入乙個節點
k = self._hash(node.key)
#雜湊值
if self.t[k]
==none
:#此煉表內沒有值的情況
self.t[k]
= node
node.
next
=none
node.pre =
none
else
: node.
next
= self.t[k]
#此煉表內有值的情況
self.t[k]
.pre = node
self.t[k]
= node
self.t[k]
.pre =
none
self.size +=
1def
search
(self, key)
:#按關鍵字搜尋
k = self._hash(key)
current = self.t[k]
while current !=
none
and current.key != key:
current = current.
next
if current ==
none
:#沒有找到時
return
"keyerror"
return
true
defdelete
(self, node)
:#刪除雜湊表的指定節點
k = self._hash(node.key)
if node == self.t[k]
: self.t[k]
==none
elif node.
next
==none
: node.pre.
next
=none
else
: node.
next
.pre = node.pre
node.pre.
next
= node.
next
self.size -=
1return node
defprint
(self)
:#視覺化雜湊表
res =
[none
for _ in
range
(self.m)
]for i in
range
(self.m)
: k = self.t[i]
line =
''while k:
line +=
'%s'
%k k = k.
next
if k:
line +=
'<=>'
res[i]
= line
print
(res)
if __name__==
'__main__'
: t = hashtable(
[none
for _ in
range(10
)]) nodes =
for i in
range(31
):node = node(i)
t.print()
t.insert(nodes[0]
) t.
print()
t.insert(nodes[5]
) t.
print()
t.insert(nodes[9]
) t.
print()
t.insert(nodes[10]
) t.
print()
t.insert(nodes[20]
) t.
print()
t.insert(nodes[30]
) t.
print()
t.delete(nodes[20]
) t.
print()
輸出結果:[''
,'',''
,'',''
,'',''
,'',''
,''][
'','',
'','',
'','',
'','',
'','']
['',''
,'',''
,'',''
,'',''
,'',''
]['',
'','',
'','',
'','',
'','',
'']['<=>',''
,'',''
,'',''
,'',''
,'',''
]['<=><=>',''
,'',''
,'',''
,'',''
,'',''
]['<=><=><=>',''
,'',''
,'',''
,'',''
,'',''
]['<=><=>',''
,'',''
,'',''
,'',''
,'',''
]
複雜度分析插入時間複雜度:o(1)
查詢時間複雜度:o(1)
刪除時間複雜度:o(1)
(給定節點刪除時間複雜度為o(1), 如給出節點關鍵字k刪除則需要o(n))
雜湊表實現 分離鏈結法
雜湊是一種用於以常數平均時間執行插入 刪除和查詢的技術。對於分離鏈結法,裝填因子應接近於1。main函式還不知道怎麼列印。快期中考試了 hashtable.cpp 定義控制台應用程式的入口點。解決衝突的第一種方法叫做分離鏈結法,其做法是將雜湊到 同一值得所有元素保留到乙個表中。include std...
雜湊 分離鏈結法
通過某種特定的函式 演算法 稱為雜湊函式 演算法 將要檢索的項與用來檢索的索引 稱為雜湊,或者雜湊值 關聯起來,生成一種便於搜尋的資料結構 稱為雜湊表 也譯為雜湊。我們需要將輸入的字串進行轉換,將其轉換成數字,在插入儲存的數,當然,也可能會存在不同字串對應相同的數字,這時,為了保證不衝突,我們將字串...
雜湊之分離鏈結法
1 include 2 include 3 include 4 include 5 using std vector 6using std list 7using std string 8 using std find 910 int hash const string key 1119 int h...