Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 81b2f3f

Browse files
Update linear-probing.py
1 parent a802406 commit 81b2f3f

File tree

1 file changed

+42
-74
lines changed

1 file changed

+42
-74
lines changed

‎hash-table/linear-probing.py‎

Lines changed: 42 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,85 @@
11

2-
from typing import Any, List
2+
3+
from typing import Any, List, Tuple
34

45

56
class HashTable:
67

78
def __init__(self, capacity:int = 11) -> None:
8-
self.capacity:int = capacity
9-
self.length: int = 0
9+
self.capacity:int = capacity
1010
self.keys: List[int] = [None] * self.capacity
11-
self.values: List[Any] = [None] * self.capacity
11+
self.values: List[int] = [None] * self.capacity
12+
self.length: int = 0
13+
1214

1315
def put(self, key:int, value:Any):
14-
index:int= self.put_helper(key)
15-
if index!=-1:
16+
index, contains= self.find(key)
17+
if contains:
1618
self.values[index] = value
1719
return
1820
hash:int = self.hash(key)
19-
if self.keys[hash] isNone or self.keys[hash] ==-1:
20-
self.keys[hash] = key
21+
if self.keys[hash] ==float('inf') or self.keys[hash] isNone:
22+
self.keys[hash] = key
2123
self.values[hash] = value
2224
self.length += 1
23-
elif self.keys[hash] == key:
24-
self.values[hash] = value
2525
else:
26-
new_hash:int = self.rehash(hash)
27-
while new_hash!=hashandself.keys[new_hash] is not None and self.keys[new_hash] != -1 and self.keys[new_hash] != key:
26+
new_hash:int = self.rehash(hash)%self.capacity
27+
while self.keys[new_hash] is not None and self.keys[new_hash] != float('inf') and new_hash != hash:
2828
new_hash = self.rehash(new_hash)
29-
30-
if self.keys[new_hash] is None or self.keys[new_hash] == -1:
31-
self.keys[new_hash] = key
29+
if self.keys[new_hash] == float('inf') or self.keys[new_hash] is None:
30+
self.keys[new_hash] = key
3231
self.values[new_hash] = value
3332
self.length += 1
34-
elif self.keys[new_hash] == key:
35-
self.values[new_hash] = value
3633

37-
def put_helper(self, key) -> int:
38-
hash:int = self.hash(key)
39-
if self.keys[hash] is None:
40-
return -1
41-
elif self.keys[hash] == key:
42-
return hash
43-
else:
44-
new_hash:int = self.rehash(hash)
45-
while new_hash != hash and self.keys[new_hash] is not None and self.keys[new_hash] != key:
46-
new_hash = self.rehash(new_hash)
34+
35+
def contains(self, key:int) -> bool:
36+
_, contains = self.find(key)
37+
return contains
4738

48-
if self.keys[new_hash] == key:
49-
return new_hash
50-
else:
51-
return -1
5239

5340
def get(self, key:int) -> Any:
54-
hash:int = self.hash(key)
55-
if self.keys[hash] is None:
56-
return None
57-
elif self.keys[hash] == key:
58-
return self.values[hash]
59-
else:
60-
new_hash:int = self.rehash(hash)
61-
while new_hash != hash and self.keys[new_hash] is not None and self.keys[new_hash] != key:
62-
new_hash = self.rehash(new_hash)
41+
index, contains = self.find(key)
42+
if contains:
43+
return self.values[index]
44+
return None
6345

64-
if self.keys[new_hash] == key:
65-
return self.values[new_hash]
66-
else:
67-
return None
6846

69-
def contains(self, key:int) -> bool:
70-
hash:int = self.hash(key)
71-
if self.keys[hash] is None:
72-
return False
73-
elif self.keys[hash] == key:
74-
return True
75-
else:
76-
new_hash:int = self.rehash(hash)
77-
while new_hash != hash and self.keys[new_hash] is not None and self.keys[new_hash] != key:
78-
new_hash = self.rehash(new_hash)
47+
def delete(self, key:int):
48+
index, contains = self.find(key)
49+
if not contains:
50+
return
51+
self.keys[index] = float('inf')
52+
self.values[index] = None
53+
self.length -= 1
7954

80-
if self.keys[new_hash] == key:
81-
return True
82-
else:
83-
return False
8455

85-
def delete(self, key:int):
56+
def find(self, key:int)->Tuple[int, bool]:
8657
hash:int = self.hash(key)
87-
if self.keys[hash] is None:
88-
return
89-
elif self.keys[hash] == key:
90-
self.keys[hash] = -1
91-
self.values[hash] = None
92-
self.length -= 1
58+
if self.keys[hash] == key:
59+
return (hash, True)
60+
elif self.keys[hash] is None:
61+
return (None, False)
9362
else:
94-
new_hash:int = self.rehash(hash)
95-
while new_hash != hash and self.keys[new_hash] is not None and self.keys[new_hash] != key:
63+
new_hash:int = self.rehash(hash)%self.capacity
64+
while self.keys[new_hash] != key and self.keys[new_hash] is not None and new_hash != hash:
9665
new_hash = self.rehash(new_hash)
9766

9867
if self.keys[new_hash] == key:
99-
self.keys[new_hash] = -1
100-
self.values[new_hash] = None
101-
self.length -= 1
102-
else:
103-
return None
68+
return (new_hash, True)
69+
return (None, False)
70+
10471

10572
def size(self) -> int:
10673
return self.length
10774

10875
def hash(self, key:int) -> int:
10976
return key % self.capacity
11077

78+
11179
def rehash(self, old_hash:int) -> int:
11280
return (old_hash + 1) % self.capacity
11381

11482

115-
11683
ht: HashTable = HashTable()
11784
ht.put(11, 'string 11')
11885
ht.put(22, 'string 22')
@@ -126,7 +93,7 @@ def rehash(self, old_hash:int) -> int:
12693
print(ht.values)
12794
print(ht.size())
12895
print('Get 11', ht.get(11))
129-
print('Get 33', ht.get(33))
96+
print('Get 22', ht.get(22))
13097
print('Get 147', ht.get(147))
13198
print('----------------------------------------')
13299

@@ -150,3 +117,4 @@ def rehash(self, old_hash:int) -> int:
150117
print(ht.values)
151118
print('Contains 77', ht.contains(77))
152119
print('Contains 44', ht.contains(44))
120+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /