Basic impl of hash_table in python. Supports set, get, and delete. Uses open addressing with linear probing function. Any ideas would be greatly appreciated! Thanks!
class Entry: """ holds key, value pairs """ def __init__(self, key, value): self.key = key self.value = value self.is_deleted = False class Map(object): """ a basic, minimal implementation of a hash map """ def __init__(self): """ constructs a new Map """ self.table = [None] * 10 self.load_factor = .75 self.current_size = 0 def __setitem__(self, key, item): """ stores the key value combo in the table implements open addressing collision resolution """ entry = Entry(key, item) for i in range(len(self.table)): index = self.__get_hash_code(key, i) if self.table[index] is None or self.table[index].is_deleted: self.table[index] = entry self.current_size += 1 if float(self.current_size) / len(self.table) >= self.load_factor: self.__resize_table() break def __getitem__(self, key): """ gets the value associated with the key """ for i in range(len(self.table)): index = self.__get_hash_code(key, i) if self.table[index] is not None: if self.table[index].key == key: if self.table[index].is_deleted: raise KeyError('Key is not in the map') else: return self.table[index].value elif self.table[index] is None: raise KeyError('Key is not in the map') raise KeyError('Hmm something has gone wrong here') def __get_hash_code(self, key, value): return (hash(key) + value) % len(self.table) def __resize_table(self): new_table = [None] * (len(self.table) * 2) for i in range(len(self.table)): new_table[i] = self.table[i] self.table = new_table def delete(self, key): """ deletes a value from the hash table """ for i in range(len(self.table)): index = self.__get_hash_code(key, i) if self.table[index] is not None: if self.table[index].key == key: if self.table[index].is_deleted: raise KeyError('Key is not in the map') else: self.table[index].is_deleted = True self.current_size -= 1 break
dict
s are implemented as hash tables, right (stackoverflow.com/questions/114830/…)? If that is the case and this is just for fun (or educational value), we have a tag for that: reinventing-the-wheel.\$\endgroup\$