Skip to content

Commit 64ae1dc

Browse files
committed
complete hashTable & add hashTable with Chaining
1 parent 7f089b2 commit 64ae1dc

File tree

2 files changed

+135
-6
lines changed

2 files changed

+135
-6
lines changed

data_structures/4_HashTable/hashtable.py

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,82 @@ def __init__(self):
55
self.buckets = [[] for _ in range(self.capacity)]
66

77
def hashing(self, key):
8-
"Basic "
9-
return
8+
"""Basic hashing function"""
9+
unicode_points = 0
10+
for char in key:
11+
unicode_points += ord(char)
12+
return unicode_points % self.capacity
1013

1114
def resize(self):
12-
return
15+
old_buckets = self.buckets
16+
self.capacity *= 2
17+
self.buckets = [[] for _ in range(self.capacity)]
18+
self.size = 0 # reset size, will be updated in insert
19+
# rehashing & copy the old array into new array
20+
for bucket in old_buckets:
21+
for k, _ in bucket:
22+
self.insert(k, _)
1323

1424
def insert(self, key, value):
15-
return
25+
"""Insert a key-value pair into hash table"""
26+
if self.size / self.capacity >= 0.8: # resize when 80% full
27+
self.resize()
28+
29+
hash_code = self.hashing(key)
30+
retrieved_bucket = self.buckets[hash_code] # might be a linked list
31+
for i, (k, _) in enumerate(retrieved_bucket):
32+
# enumerate is to look thru each key_value pair with its corr. index
33+
if k == key:
34+
retrieved_bucket[i] = (key, value)
35+
break
36+
else:
37+
retrieved_bucket.append((key, value))
38+
self.size += 1 # bucket array size += 1 as a new hashCode is inserted into the bucket
1639

1740
def get(self, key):
18-
return
41+
hash_code = self.hashing(key)
42+
retrieved_bucket = self.buckets[hash_code]
43+
for k, v in retrieved_bucket:
44+
if k == key:
45+
return v
46+
return None
1947

2048
def delete(self, key):
21-
return
49+
hash_code = self.hashing(key)
50+
retrieved_bucket = self.buckets[hash_code]
51+
for i, (k, _) in enumerate(retrieved_bucket):
52+
if k == key:
53+
del retrieved_bucket[i]
54+
self.size -= 1
55+
return
56+
57+
def print_hash(self):
58+
hashTable = "{"
59+
for i, bucket in enumerate(self.buckets):
60+
# if bucket: # only add non-empty buckets
61+
hashTable += f" {i}: {bucket}, "
62+
hashTable = hashTable.rstrip(", ") + " }" # remove last comma
63+
return hashTable
64+
65+
66+
if __name__ == '__main__':
67+
h = HashTable()
68+
with open("stock_prices.csv", "r") as f:
69+
for line in f:
70+
tokens = line.split(',')
71+
key = tokens[0]
72+
value = float(tokens[1])
73+
h.insert(key, value)
2274

75+
print(h.capacity)
76+
print(h.size)
77+
h.insert('march 9', float(999))
78+
h.delete('march 9')
79+
print(h.capacity)
80+
print(h.size)
81+
h.insert('march 1', float(111))
82+
h.insert('march 2', float(222))
83+
h.insert('march 3', float(333))
84+
print(h.capacity)
85+
print(h.size)
86+
print(h.print_hash())
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
class Node:
2+
def __init__(self, prev=None, data=None, next=None):
3+
self.prev = prev
4+
self.data = data
5+
self.next = next
6+
7+
8+
class HashTable:
9+
def __init__(self):
10+
self.capacity = 10
11+
self.size = 0
12+
self.buckets = [[] for _ in range(self.capacity)]
13+
14+
def hashing(self, key):
15+
char_count = 0
16+
for char in key:
17+
char_count += ord(char)
18+
return char_count & self.capacity
19+
20+
def resizing(self):
21+
old_bucket = self.buckets
22+
self.capacity *= 2
23+
self.buckets = [[] for _ in range(self.capacity)]
24+
self.size = 0
25+
for bucket in old_bucket:
26+
for k, _ in bucket:
27+
self.insert(k, _)
28+
29+
def insert(self, key, value):
30+
if self.size / self.capacity >= 0.7:
31+
self.resizing()
32+
33+
hash_code = self.hashing(key)
34+
retrieved_bucket = self.buckets[hash_code]
35+
for i, (k, _) in enumerate(retrieved_bucket):
36+
if k == key:
37+
retrieved_bucket[i] = (key, value)
38+
break
39+
else:
40+
retrieved_bucket.append((key, value))
41+
self.size += 1
42+
return
43+
44+
def delete(self, key):
45+
if self.size == 0:
46+
raise Exception("The hash table is empty!")
47+
48+
hash_code = self.hashing(key)
49+
retrieved_bucket = self.buckets[hash_code]
50+
for i, (k, _) in retrieved_bucket:
51+
if k == key:
52+
del retrieved_bucket[i]
53+
self.size -= 1
54+
return
55+
56+
def get(self, key):
57+
hash_code = self.hashing(key)
58+
retrieved_bucket = self.buckets[hash_code]
59+
for k, _ in retrieved_bucket:
60+
if k == key:
61+
return _
62+
return None
63+
64+
def print_hash(self):
65+
return

0 commit comments

Comments
 (0)