1+ class HashItem :
2+ def __init__ (self , key , value ):
3+ self .key = key
4+ self .value = value
5+
6+ class DoubleHashTable :
7+
8+ def __init__ (self ):
9+ self .size = 256
10+ self .slots = [None for i in range (self .size )]
11+ self .count = 0
12+ self .MAXLOADFACTOR = 0.65
13+ self .prime_num = 5
14+
15+ #just for internal use (main hash function)
16+ def _hash (self , key ):
17+ hv = 0
18+ mult = 1
19+ for ch in key :
20+ hv += mult * ord (ch )
21+ mult += 1
22+ return hv % self .size
23+
24+ #secondary hash function
25+ def h2 (self , key ):
26+ mult = 1
27+ hv = 0
28+ for ch in key :
29+ hv += mult * ord (ch )
30+ mult += 1
31+ return hv
32+
33+ def put (self , key , value ):
34+ item = HashItem (key , value )
35+ h = self ._hash (key )
36+ j = 1
37+
38+ while self .slots [h ]!= None :
39+ if self .slots [h ].key == key :
40+ break
41+ h = (h + j * (self .prime_num - (self .h2 (key ) % self .prime_num ))) % self .size
42+ j = j + 1
43+
44+ if self .slots [h ] == None :
45+ self .count += 1
46+ self .slots [h ] = item
47+ self .check_growth ()
48+
49+ def get (self , key ):
50+ h = self ._hash (key )
51+ j = 1
52+ while self .slots [h ] != None :
53+ if self .slots [h ].key == key :
54+ return self .slots [h ].value
55+ h = (h + j * (self .prime_num - (self .h2 (key ) % self .prime_num ))) % self .size
56+ j = j + 1
57+ return None
58+
59+ def check_growth (self ):
60+ loadfactor = self .count / self .size
61+ if loadfactor > self .MAXLOADFACTOR :
62+ print ("Load factor before growing the hash table" , self .count / self .size )
63+ self .growth ()
64+ print ("Load factor after growing the hash table" , self .count / self .size )
65+
66+ def growth (self ):
67+ new_hash_table = HashTable ()
68+ new_hash_table .size = 2 * self .size
69+ new_hash_table .slots = [None for i in range (new_hash_table .size )]
70+
71+ for i in range (self .size ):
72+ if self .slots [i ] != None :
73+ new_hash_table .put (self .slots [i ].key , self .slots [i ].value )
74+
75+ self .size = new_hash_table .size
76+ self .slots = new_hash_table .slots
77+
78+
79+
80+ ht = DoubleHashTable ()
81+ ht .put ("good" , "eggs" )
82+ ht .put ("better" , "spam" )
83+ ht .put ("best" , "cool" )
84+ ht .put ("ad" , "donot" )
85+ ht .put ("ga" , "collide" )
86+ ht .put ("awd" , "hello" )
87+ ht .put ("addition" , "ok" )
88+
89+ for key in ("good" , "better" , "best" , "worst" , "ad" , "ga" ):
90+ v = ht .get (key )
91+ print (v )
92+ print ("The number of elements is: {}" .format (ht .count ))
0 commit comments