哈希表
哈希表(hash table),又称散列表,它通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键 key ,则可以在
时间内获取对应的值 value 。
1.基础结构
# 基础组成:键值对
class pair:def __init__(self,key:int,value:str):self._key: int=keyself._value: str=value
2.哈希表键值对存储与索引结构:桶
class has_cls:def __init__(self):# 扩容因子self.extend: int = 0.75# 桶的容量self.capacity:int = 100# 桶:用于存储键值对self._bucket: list[pair]=[None]*self.capacity# 数据大小self._size:int=0# 数据大小def size(self):return self._size# 索引与键的联系:哈希函数def hash_fun(self,key:int):index = key%self.capacityreturn index#查询def get(self,key):print("执行查询元素操作")index = self.hash_fun(key)pair = self.bucket[index]if pair == None:return Nonereturn pair._value# 添加元素def put(self,key:int,value:str):print("执行添加元素操作")# 判断容量是否已经满了if self._size/self.capacity >self.extend:self.extend_capacity# 根据key计算hash值index = self.hash_fun(key)self._bucket[index] = pair(key,value)self._size +=1 # 删除元素def remove(self,key:int):print("执行删除元素操作")index = self.hash_fun(key)if self._size == 0 or self.capacity<index:raise IndexError("索引错误")self._bucket[index] = Noneself._size -= 1# 哈希扩容def extend_capacity(self):print("执行哈希扩容")self.capacity *=2new_bucket = [0]*self.capacityfor pair in self._bucket:if pair:index = index._keynew_bucket[index] = pairself._bucket = new_bucket# 提取所有键值对def get_all_pair(self):print("提取所有键值对")res = []if not self._size:raise ValueError("桶为空")else:for index in range(self._size):res.append(self._bucket[index])return res# 提取所有键def get_all_key(self):print('提取所有键')res = []if not self._size:raise ValueError("桶为空")else:for index in range(self._size):pair = self._bucket[index]res.append(pair._key)return res# 提取所有值def get_all_val(self):print("提取所有键")res = []if not self._size:raise ValueError("桶为空")else:for index in range(self._size):pair = self.bucket[index]res.append(pair._value)return resdef print(self):"""打印哈希表"""for pair in self._bucket:if pair is not None:print(pair._key, "->", pair._value)
测试
# p1 = pair(1,"小明")
# p2 = pair(2,"小刚")
# p3 = pair(6,"小菜")
p3 = has_cls()
p3.put(6,"小菜")
p3.put(3,"小明")
p3.print()
p3.remove(6)
p3.print()