Python 哈希表实现原理解析

2023-04-11 00:00:00 python 原理 解析

哈希表(Hash Table)又称散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表存储的是键值对,可以用于快速的查找、插入、删除等操作。

哈希表的实现原理比较简单,主要有以下几个步骤:

  1. 定义哈希函数

哈希函数的作用是将键值映射到哈希表的槽位中,通常使用取余法来实现。例如,我们要将字符串“pidancode.com”映射到哈希表中,可以将其转换为ASCII码,并对哈希表的槽数取余,得到该字符串所对应的槽位。

  1. 定义哈希表

哈希表可以使用数组来实现,数组的大小即为哈希表的槽数。每个槽位存储一个链表,用于解决哈希冲突。

  1. 插入操作

插入操作分为两个步骤:首先使用哈希函数将键值映射到槽位中,然后将键值插入到链表中。如果发生哈希冲突,即多个键值映射到同一个槽位中,可以采用链表的方式将其解决。

  1. 查找操作

查找操作也分为两个步骤:首先使用哈希函数将键值映射到槽位中,然后在该槽位的链表中查找键值。如果找到了,则返回对应的值,否则返回空值。

  1. 删除操作

删除操作也分为两个步骤:首先使用哈希函数将键值映射到槽位中,然后在该槽位的链表中查找键值。如果找到了,可以直接删除该键值,并将链表中的指针指向下一个节点。

下面是Python实现哈希表的代码示例:

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

class MyHashMap:
    def __init__(self):
        self.size = 1000
        self.table = [None] * self.size

    def put(self, key, value):
        index = key % self.size
        if self.table[index] == None:
            self.table[index] = ListNode(key, value)
        else:
            node = self.table[index]
            while node:
                if node.key == key:
                    node.value = value
                    return
                if node.next == None:
                    break
                node = node.next
            node.next = ListNode(key, value)

    def get(self, key):
        index = key % self.size
        node = self.table[index]
        while node:
            if node.key == key:
                return node.value
            node = node.next
        return -1

    def remove(self, key):
        index = key % self.size
        node = prev = self.table[index]
        if not node:
            return
        if node.key == key:
            self.table[index] = node.next
        else:
            node = node.next
            while node:
                if node.key == key:
                    prev.next = node.next
                    break
                else:
                    node, prev = node.next, prev.next

在上面的代码中,我们定义了一个链表节点ListNode,每个节点存储一个键值对。哈希表使用数组来实现,数组的大小为1000,即为哈希表的槽数。put()、get()和remove()分别对应插入、查找和删除操作。其中,put()操作使用链表来解决哈希冲突,get()操作和remove()操作也需要遍历链表来查找节点。

使用哈希表可以快速实现对键值对的查找、插入和删除操作,具有较好的性能。但是,在实际应用中,哈希表的性能也受到哈希函数的影响,需要选择合适的哈希函数使得哈希表的槽位分布均匀,从而避免冲突。

相关文章