鏈結法雜湊表python實現

2021-10-08 03:29:40 字數 3803 閱讀 2739

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