python 实现散列表

python 实现散列表

使用“链表法”实现散列表

class ListNode(object):
    def __init__(self, key):
        self.key = key
        self.next = None


class HashMap(object):
    def __init__(self, table_size):
        self.items = [None] * table_size
        self.count = 0  # number of nodes in the map

    def __len__(self):
        return self.count

    def __str__(self):
        vals = []
        for item in self.items:
            temp_list = []
            while item is not None:
                temp_list.append(str(item.key))
                item = item.next
            vals.append("->".join(temp_list))
        return str(vals)

    def _hash(self, key) -> int:
        return abs(hash(key)) % len(self.items)

    def __getitem__(self, key):
        """
        查询数据
        """
        j = self._hash(key)
        node = self.items[j]
        while node is not None and node.key != key:
            node = node.next
        if node is None:
            raise KeyError('KeyError' + repr(key))
        return node

    def insert(self, key):
        """
        插入数据
        """
        try:
            self[key]
        except KeyError:
            j = self._hash(key)
            node = self.items[j]
            self.items[j] = ListNode(key)
            self.items[j].next = node
            self.count += 1

    def __delitem__(self, key):
        """
        删除数据
        """
        j = self._hash(key)
        node = self.items[j]
        if node is not None:
            if node.key == key:
                self.items[j] = node.next
                self.count -= 1
            else:
                while node.next != None:
                    pre = node
                    node = node.next
                    if node.key == key:
                        pre.next = node.next
                        self.count -= 1
                        break


if __name__ == "__main__":
    # 创建一个散列表
    hash_map = HashMap(3)
    # 插入数据
    hash_map.insert(100)
    hash_map.insert(200)
    hash_map.insert(300)
    hash_map.insert(400)
    hash_map.insert(500)
    hash_map.insert(600)
    hash_map.insert(700)
    hash_map.insert(800)
    print("内容为:", hash_map)
    print("当前数据量:", len(hash_map))
    # 查询数据
    print("搜索100是否存在:", hash_map[100].key)
    # 删除
    del hash_map[100]
    print("内容为:", hash_map)
    print("当前数据量:", len(hash_map))

运行效果如下:

内容为: ['600->300', '700->400->100', '800->500->200']
当前数据量: 8
搜索100是否存在: 100
内容为: ['600->300', '700->400', '800->500->200']
当前数据量: 7
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值