Skip to content

Commit e51bcaf

Browse files
committed
hash table - linear probing
1 parent f599128 commit e51bcaf

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed

hash-table/linear-probing.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
2+
class HashMap:
3+
def __init__(self, length: int = 11):
4+
self._length: int = length
5+
self._keys: list = [None] * self._length
6+
self._values: list = [None] * self._length
7+
self._elements_count: int = 0
8+
9+
def put(self, key: int, value: str):
10+
hash: int = self.hash(key)
11+
if self._keys[hash] is None or self._keys[hash] == "deleted" or self._keys[hash] == key:
12+
if self._keys[hash] is None or self._keys[hash] == "deleted":
13+
self._elements_count += 1
14+
self._keys[hash] = key
15+
self._values[hash] = value
16+
else:
17+
new_hash: int = self.rehash(hash)
18+
while new_hash != hash and self._keys[new_hash] is not None and self._keys[new_hash] != "deleted"\
19+
and self._keys[new_hash] != key:
20+
new_hash = self.rehash(new_hash)
21+
if self._keys[new_hash] is None or self._keys[new_hash] == "deleted" or self._keys[new_hash] == key:
22+
if self._keys[new_hash] is None or self._keys[new_hash] == "deleted":
23+
self._elements_count += 1
24+
self._keys[new_hash] = key
25+
self._values[new_hash] = value
26+
27+
def get(self, key: int):
28+
hash: int = self.hash(key)
29+
if self._keys[hash] is None:
30+
return None
31+
elif self._keys[hash] == key:
32+
return self._values[hash]
33+
else:
34+
new_hash: int = self.rehash(hash)
35+
while new_hash != hash and self._keys[new_hash] is not None and self._keys[new_hash] != key:
36+
new_hash = self.rehash(new_hash)
37+
if self._keys[new_hash] is None:
38+
return None
39+
elif self._keys[new_hash] == key:
40+
return self._values[new_hash]
41+
else:
42+
return None
43+
44+
def contains(self, key: int) -> bool:
45+
hash: int = self.hash(key)
46+
if self._keys[hash] is None:
47+
return False
48+
elif self._keys[hash] == key:
49+
return True
50+
else:
51+
new_hash: int = self.rehash(hash)
52+
while new_hash != hash and self._keys[new_hash] is not None and self._keys[new_hash] != key:
53+
new_hash = self.rehash(new_hash)
54+
if self._keys[new_hash] is None:
55+
return False
56+
elif self._keys[new_hash] == key:
57+
return True
58+
else:
59+
return False
60+
61+
def delete(self, key):
62+
hash: int = self.hash(key)
63+
if self._keys[hash] is None:
64+
return
65+
elif self._keys[hash] == key:
66+
self._elements_count -= 1
67+
self._keys[hash] = "deleted"
68+
self._values[hash] = None
69+
else:
70+
new_hash: int = self.rehash(hash)
71+
while new_hash != hash and self._keys[new_hash] is not None and self._keys[new_hash] != key:
72+
new_hash = self.rehash(new_hash)
73+
if self._keys[new_hash] == key:
74+
self._elements_count -= 1
75+
self._keys[new_hash] = "deleted"
76+
self._values[new_hash] = None
77+
78+
def size(self) -> int:
79+
return self._elements_count
80+
81+
def hash(self, key: int) -> int:
82+
return key % self._length
83+
84+
def rehash(self, old_hash: int):
85+
return (old_hash + 1) % self._length
86+
87+
88+
hm: HashMap = HashMap()
89+
hm.put(11, "string 11")
90+
hm.put(22, "string 22")
91+
hm.put(33, "string 33")
92+
hm.put(44, "string 44")
93+
hm.put(12, "string 12")
94+
hm.put(21, "string 21")
95+
96+
print(hm._keys)
97+
print(hm._values)
98+
99+
print("Get 11", hm.get(11))
100+
print("Get 33", hm.get(33))
101+
print("Get 21", hm.get(21))
102+
print("Get 7", hm.get(7))
103+
104+
print("Contains key 7", hm.contains(7))
105+
print("Contains key 33", hm.contains(33))
106+
107+
108+
print("Delete key 7", hm.delete(7))
109+
print("Delete key 33", hm.delete(33))
110+
111+
print("Contains key 33", hm.contains(33))
112+
113+
print(hm._keys)
114+
print(hm._values)
115+
116+
hm.put(14, "string 14")
117+
118+
print("Contains key 33", hm.contains(33))
119+
120+
print(hm._keys)
121+
print(hm._values)

0 commit comments

Comments
 (0)