哈希表
哈希表(hash table),又称散列表,它通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键 key ,则可以在
时间内获取对应的值 value 。
1.基础结构
# 基础组成:键值对
class pair:
def __init__(self,key:int,value:str):
self._key: int=key
self._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.capacity
return index
#查询
def get(self,key):
print("执行查询元素操作")
index = self.hash_fun(key)
pair = self.bucket[index]
if pair == None:
return None
return 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] = None
self._size -= 1
# 哈希扩容
def extend_capacity(self):
print("执行哈希扩容")
self.capacity *=2
new_bucket = [0]*self.capacity
for pair in self._bucket:
if pair:
index = index._key
new_bucket[index] = pair
self._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 res
def 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()