python 自定义数据结构_Python自定义散列表数据结构

散列表可用作仿真关系、可防止重复、也可大幅提高增删查改的效率。

在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)

代码至此结束

此栏目预测共享自学之乐,共勉求知之友,共塑网站和谐好学的形象。

欢迎大家在评论区发表合理的意见和指正。

如果觉得该栏目对您有帮助,望不吝点赞收藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值