📜  哈希表(1)

📅  最后修改于: 2023-12-03 15:07:31.860000             🧑  作者: Mango

哈希表

哈希表(Hash Table),也称为散列表(Hash Map),是一种以键值对(Key-Value)形式存储数据的数据结构。它通过使用哈希函数将一个键值映射到一个数组索引以进行访问,可以实现快速的插入、删除和查找操作。

原理

哈希表的基本原理就是通过哈希函数将键值映射到数组索引上,从而实现快速查找。哈希函数是将任意长度的输入(例如,字符串)映射为固定长度的输出(哈希值)的函数。对于同一个输入,哈希函数总是返回相同的输出。

当我们向哈希表中插入元素时,它首先通过哈希函数计算出键值的哈希值,并将其映射到一个数组索引上。如果该位置上没有元素,则直接插入即可;否则,就需要解决哈希冲突的问题。常见的解决哈希冲突的方法有链表法和开放寻址法。

实现

下面是使用 Python 实现哈希表(链表法)的例子:

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

class MyHashMap:
    def __init__(self):
        self.size = 10000
        self.data = [None] * self.size
        
    def put(self, key: int, value: int) -> None:
        index = key % self.size
        if not self.data[index]:
            self.data[index] = ListNode(key, value)
        else:
            head = self.data[index]
            while head:
                if head.key == key:
                    head.value = value
                    return
                if not head.next:
                    head.next = ListNode(key, value)
                    return
                head = head.next
        
    def get(self, key: int) -> int:
        index = key % self.size
        head = self.data[index]
        while head:
            if head.key == key:
                return head.value
            head = head.next
        return -1
    
    def remove(self, key: int) -> None:
        index = key % self.size
        if not self.data[index]:
            return
        if self.data[index].key == key:
            self.data[index] = self.data[index].next
            return
        head = self.data[index]
        while head.next:
            if head.next.key == key:
                head.next = head.next.next
                return
            head = head.next

这个哈希表的实现使用了链表法解决哈希冲突。其中,ListNode 是链表节点的定义,MyHashMap 是哈希表的定义。putgetremove 是对哈希表进行插入、查找、删除操作的方法。它们的具体实现可以参考代码中的注释。

总结

哈希表是一种高效的数据结构,可以实现常数时间复杂度的插入、删除和查找操作。但是,在进行哈希函数的设计时,需要考虑一些问题(如哈希冲突的处理、负载因子的控制等),否则可能会导致哈希表效率的下降。