《我的第一本算法书》哈希表的Python实现

《我的第一本算法书》哈希表的Python实现

哈希表

哈希表存储的是以 键(key)值(value) 组成的数据。

1、示例数据

现有人名(键)和性别(值:M为男性F为女性)对应的一堆数据:

KeyValue
JoeM
SueF
DanM
NellF
AllyF
BobM
(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('人员不在名单内')

查询结果:

人员不在名单内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值