散列表可用作仿真关系、可防止重复、也可大幅提高增删查改的效率。
在python中可用字典实现散列表。
自定义散列表时应注意避免冲突且控制填充因子
声明:
0.本代码为本人自行完成,稳定性未得到验证
1.避免冲突的有效方法为增加槽数或者成
2.本代码未实现避免冲突,槽满弹出
3.本代码采用hash()函数生成密匙
4.转载附作者Id及原作品链接
原代码如下:
class Hashtable():
def __init__(self):
self.size=10
#槽数
self.key_list=[None for _ in range(self.size)]
#初始化键列表
self.value_list=[None for _ in range(self.size)]
#初始化值列表
def hash_function(self,raw,size):
#生成哈希值
return hash(raw)%size
#hash()生成密匙
#取模
def rehash(self,raw_hash,size):
#更新哈希值
return (raw_hash+1)%size
def set(self,key,value):
#存值
hash_value=self.hash_function(key,self.size)
if self.key_list[hash_value]:
if self.key_list[hash_value] == key:
self.value_list[hash_value]=value
#键名同值更新
else:
#避免冲突
hash_value=self.rehash(hash_value,self.size)
while True:
if self.key_list[hash_value]:
if self.key_list[hash_value] == key:
self.value_list[hash_value]=value
else:
hash_value=self.rehash(hash_value,self.size)
if hash_value == self.hash_function(key,self.size):
print("HASH TABLE is Full")
break
#增加槽数减小填充因子
#可成链避免冲突
else:
self.key_list[hash_value]=key
self.value_list[hash_value]=value
break
#跳出
else:
self.key_list[hash_value]=key
self.value_list[hash_value]=value
def get(self,key):
#取值
hash_value=self.hash_function(key,self.size)
result=None
if self.key_list[hash_value] == key:
result=self.value_list[hash_value]
else:
hash_value=self.rehash(hash_value,self.size)
while True:
if self.key_list[hash_value] == key:
result=self.value_list[hash_value]
break
else:
hash_value=self.rehash(hash_value,self.size)
if hash_value == self.hash_function(key,self.size):
print("NOT FOUND")
break
return result
if __name__ == "__main__":
hs_table=Hashtable()
#实例化
for i in range(hs_table.size):
hs_table.set(i,i*i)
for i in range(hs_table.size):
print(hs_table.get(i))
print(hs_table.key_list)
print(hs_table.value_list)
代码至此结束
此栏目预测共享自学之乐,共勉求知之友,共塑网站和谐好学的形象。
欢迎大家在评论区发表合理的意见和指正。
如果觉得该栏目对您有帮助,望不吝点赞收藏。