考研的时候一直没明白都知道index了还查什么,混淆了key和哈希table index这两个东西。
例子:key在0~10000范围内的10个键值对,存到table大小为13的哈希表中,用取余数当作哈希函数,用链地址法冲突处理。
那么键值对(14,adf)和(27,oadnf)都会在哈希table index为1的位置。查询的时候用的是key,不是index。比如查询key为14的值能查到adf,查询key为40的值就查不到。
python实现一个hashmap:hash函数为取余,冲突解决为链地址法。
class MyHash(object):
def __init__(self, length=10):
self.length = length
self.items = [[] for _ in range(self.length)]
def hash(self, key):
"""计算该key在items哪个list中,针对不同类型的key需重新实现"""
return key % self.length
def equals(self, key1, key2):
"""比较两个key是否相等,针对不同类型的key需重新实现"""
return key1 == key2
def add(self, key, value):
index = self.hash(key)
if self.items[index]:
for item in self.items[index]:
if self.equals(key, item[0]):
# 添加时若有已存在的key,则先删除再添加(更新value)
self.items[index].remove(item)
break
self.items[index].append((key, value))
return True
def get(self, key):
index = self.hash(key)
if self.items[index]:
for item in self.items[index]:
if self.equals(key, item[0]):
return item[1]
# 找不到key,则抛出KeyError异常
raise KeyError
myhash = MyHash()
myhash.add(2, 2100)
try:
print(myhash.get(1))
except KeyError:
print("not in")
myhash.add(1, 3)
try:
print(myhash.get(2))
print(myhash.get(1))
except:
print("not in")