# 数据结构:哈希表,使用二次探查方法解决哈希冲突的问题
# 先创建数组
class Array(object):
def __init__(self,size=5):
self._size = size # 存储数量
self._item = [None]*size # 数组空间大小
self._length = 0
# 设置值
def __setitem__(self, key, value):
self._item[key]=value
self._length += 1
# 获取值
def __getitem__(self, key):
return self._item[key]
# 定义长度单位
def __len__(self):
return self._length
# 定义迭代特性
def __iter__(self):
for v in self._item:
yield v
def delitem(self,key):
if self._item[key]:
self._item[key]=None
else:
print('本身无数据')
# 创建存储到哈希表的对象类型
class Solt():
# 初始化方法
def __init__(self,key=None,value=None):
self.key = key
self.value = value
# 打印对象
def __str__(self):
return f'key : {self.key},value : {self.value}'
# 创建哈希表数据结构,此方法存在哈希冲突
class HashTable():
# 初始化方法 生成固定长度的哈希表
def __init__(self):
self.size = 4
self.item = Array(self.size)
# 获取哈希索引的方法
def get_index(self,key):
return hash(key) % self.size
# 插入数据时查找哈希地址是否被占用,返回为空的地址索引
def find_indexToPut(self,key):
# 获取输入的key对应的索引值
index = self.get_index(key)
if self.item[index] == None:
return index
else:
# 循环判断索引对应的对象的分支
while self.item[index] is not None:
if self.item[index].key == key:
return index
else:
index = (5 * index + 1) % self.size
return index
# 放入哈希表数据
def put(self,key,value):
s = Solt(key,value)
index = self.find_indexToPut(key)
self.item[index] = s
# 获取哈希表数据时,先判断索引对应位置存储的对象
def find_index(self,key):
index = self.get_index(key)
# 循环判断索引对应的对象的分支
if self.item[index] == None:
return None
else:
# 循环判断索引对应的对象的分支
while self.item[index] is not None:
if self.item[index].key == key:
return index
else:
index = (5 * index + 1) % self.size
return None
# 获取哈希表数据
def get(self,key):
# 判断获取的index
index = self.find_index(key)
return self.item[index]
if __name__ == '__main__':
ht = HashTable()
ht.put('name','我的老伙计')
ht.put('sex', '男')
ht.put('age', 18)
ht.put('work', '程序员')
ht.put('name', '北京') # 超出哈希表的容量,陷入死循环了
# ht.put('money', 1000)
print(ht.get('name'))
print(ht.get('sex'))
print(ht.get('age'))
print(ht.get('work'))
# print(ht.get('home'))