《我的第一本算法书》哈希表的Python实现
哈希表
哈希表存储的是以 键(key) 和 值(value) 组成的数据。
1、示例数据
现有人名(键)和性别(值:M为男性F为女性)对应的一堆数据:
Key | Value |
---|---|
Joe | M |
Sue | F |
Dan | M |
Nell | F |
Ally | F |
Bob | M |
(1)创建数据单元的类
class person(object):
def __init__(self, key, value):
self.key = key
self.value = value
self.next = None
(2)实例化对象
Joe = person('Joe', 'M')
Sue = person('Sue', 'F')
Dan = person('Dan', 'M ')
Nell = person('Nell', 'F')
Ally = person('Ally', 'F')
Bob = person('Bob', 'M')
(3)创建哈希表类(链地址法)
class HashTable(object):
def __init__(self, length):
# length为数组长度
self.table = []
while len(self.table) != length:
self.table.append(None)
# 添加数据
def addPerson(self, person):
# 键的哈希值求表长度的余为其目标位置
position = hash(person.key) % len(self.table)
tmp = self.table[position]
# 判断目标位置是否为空
if tmp is None:
# 空则填上数据
self.table[position] = person
else:
# 非空则查该链表至末端并加上数据(哈希冲突)
while tmp.next:
tmp = tmp.next
tmp.next = person
def findPerson(self, person_name):
position = hash(person_name) % len(self.table)
tmp = self.table[position]
if tmp is None:
# 当前位置为空,则数据不在哈希表内
return None
# 按链表向后查询直到找到对应的key或查询到链表末端
while tmp.key is not person_name:
if tmp.next:
tmp = tmp.next
else:
break
if tmp.key is person_name:
return tmp
else:
return None
(4)实例化对象并加入数据
persons = HashTable(3)
persons.addPerson(Joe)
persons.addPerson(Sue)
persons.addPerson(Dan)
persons.addPerson(Nell)
persons.addPerson(Ally)
persons.addPerson(Bob)
2、查询数据
(1)查询名单内人员
tmp = persons.findPerson('Joe')
if tmp:
print('人员性别:', tmp.value)
else:
print('人员不在名单内')
查询结果:
人员性别: M
(2)查询名单外人员
tmp = persons.findPerson('Park')
if tmp:
print('人员性别:', tmp.value)
else:
print('人员不在名单内')
查询结果:
人员不在名单内