import pprint class HashTable: '''拉链法解决哈希冲突''' def __init__(self, elements): self.bucket_size = len(elements) self.buckets = [[] for _ in range(self.bucket_size)] self._assign_buckets(elements) def _assign_buckets(self, elements): for key, value in elements: hashed_key = hash(key) index = hashed_key % self.bucket_size self.buckets[index].append((key, value)) def get_value(self, input_key): hashed_key = hash(input_key) index = hashed_key % self.bucket_size for key, vlaue in self.buckets[index]: if key == input_key: return vlaue return None def __str__(self): return pprint.pformat(self.buckets) if __name__ == '__main__': capitals = [ ('France', 'Paris'), ('United States', 'Washington D.C.'), ('Italy', 'Rome'), ('Canada', 'Ottawa') ] hashtable = HashTable(capitals) print(hashtable) print(f"The capital of Italy is {hashtable.get_value('Italy')}") ''' pprint result [[('Canada', 'Ottawa')], [('France', 'Paris')], [('United States', 'Washington D.C.'), ('Italy', 'Rome')], []] The capital of Italy is Rome '''
import pprint class HashTable: ''' 开放寻址法:线性探测 缺点:开放式寻址策略的主要问题是,如果您还必须处理表中元素的删除,则需要执行逻辑删除而不是物理删除,因为如果您删除在冲突期间占用存储桶的值,则另一个碰撞的元素将永远不会被发现。 在我们之前的示例中,它Italy与先前插入的元素(France)相撞,因此已被重新定位到下一个存储桶,因此删除该France元素将使其Italy无法访问,因为它不占用其自然的目标存储桶,对于解释器而言这是空的。 因此,在使用开放式寻址策略时,要删除一个元素,您必须用一个哑数值替换其存储桶,这向解释器表明,必须考虑删除该元素以进行新的插入,但必须将其占用以进行检索。 ''' def __init__(self, elements): self.bucket_size = len(elements) self.buckets = [None] * self.bucket_size self._assign_buckets(elements) def _assign_buckets(self, elements): for key, value in elements: hashed_key = hash(key) index = hashed_key % self.bucket_size while self.buckets[index] is not None: print(f"The key {key} collided with {self.buckets[index]}") ###线性探测### index = (index + 1) % self.bucket_size self.buckets[index] = (key, value) def get_value(self, input_key): hashed_key = hash(input_key) index = hashed_key % self.bucket_size while self.buckets[index] is not None: key, value = self.buckets[index] if key == input_key: return value index = (index + 1) % self.bucket_size def __str__(self): return pprint.pformat(self.buckets) if __name__ == '__main__': capitals = [ ('France', 'Paris'), ('United States', 'Washington D.C.'), ('Italy', 'Rome'), ('Canada', 'Ottawa') ] hashtable = HashTable(capitals) print(hashtable) print(f"The capital of Italy is {hashtable.get_value('Italy')}") ''' The key United States collided with ('France', 'Paris') [('Italy', 'Rome'), ('France', 'Paris'), ('United States', 'Washington D.C.'), ('Canada', 'Ottawa')] The capital of Italy is Rome '''