-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04.5哈希表.py
106 lines (73 loc) · 2.27 KB
/
04.5哈希表.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
class LinkList:
class Node:
def __init__(self,item=None):
self.item = item
self.next = None
# 迭代器 支持next
class LinkListIterator:
def __init__(self,node):
self.node = node
def __next__(self):
if self.node:
cur_node = self.node
self.node =cur_node.next
return cur_node.item
else:
raise StopIteration
def __iter__(self):
return self
def __init__(self,iterable=None):
self .head =None
self.tail =None
if iterable:
self.extend(iterable) # 链表创建
def append(self,obj):
s = LinkList.Node(obj)
if not self.head:
self.head =s
self.tail = s
else:
self.tail.next = s
self.tail = s
def extend(self,iterable):
for obj in iterable:
self.append(obj)
def find (self,obj):
for n in self:
if n== obj:
return True
return False
def __iter__(self):
return self.LinkListIterator(self.head)
def __repr__(self):
return "<<"+",".join(map(str,self))+">>"
class Hashtable:
def __init__(self,size = 101) : # size = 101 --> T开辟了空间
self.size = size
self.T = [LinkList() for i in range(self.size)]
def hash_b(self,k):
return k % self.size
def insert(self,k):
i =self.hash_b(k)
if self.find(k):
print("Duplicated Insert",k)
else:
self.T[i].append(k)
def find(self,k):
i = self.hash_b(k)
return self.T[i].find(k)
if __name__ == "__main__":
'''
Lk = LinkList([17,20,26,31,44,54,55,77,93])
for ele in Lk:
print(ele)
'''
hash_ta = Hashtable()
hash_ta.insert(2)
hash_ta.insert(1)
hash_ta.insert(2)
hash_ta.insert(102)
hash_ta.insert(3)
hash_ta.insert(508)
print(",".join(map(str,hash_ta.T)))
print(hash_ta.find(203))