算法与数据结构 (Algorithms and Data Structures)

哈希表(6)

Posted by 月月鸟 on September 19, 2021

哈希表(Hash Table)是一种用于快速数据查找的数据结构。它通过哈希函数将键映射到数组中的索引,以实现常数时间复杂度的查找、插入和删除操作。下面详细介绍哈希表的基本概念、操作、实现和应用。

1. 哈希表基本概念

哈希表由一个数组和一个哈希函数组成。哈希函数将键映射到数组的索引,从而决定了键值对存储在数组中的位置。常用的操作包括插入、删除和查找。

哈希函数

哈希函数的主要作用是将键(通常是字符串或数字)转换为一个数组索引。一个好的哈希函数能够均匀地分布数据,减少冲突(即不同的键映射到相同的索引)。

处理冲突

哈希表中的冲突是指不同的键通过哈希函数映射到相同的索引。常见的处理冲突方法包括:

  1. 链式地址法(Chaining)
    • 使用链表存储所有映射到同一索引的键值对。每个数组位置对应一个链表,链表中存储所有哈希冲突的键值对。
  2. 开放地址法(Open Addressing)
    • 当发生冲突时,寻找数组中下一个可用位置存储键值对。常见的探测方法包括线性探测、二次探测和双重哈希。

2. 哈希表的操作

插入

将键值对存储到哈希表中,首先使用哈希函数计算索引,然后将键值对存储在该索引位置。如果发生冲突,则根据冲突处理方法进行处理。

def put(self, key: int, value: int) -> None:
    index = self.hash(key)
    if self.buckets[index] is None:
        self.buckets[index] = []
    for i, (k, v) in enumerate(self.buckets[index]):
        if k == key:
            self.buckets[index][i] = (key, value)
            return
    self.buckets[index].append((key, value))

查找

通过哈希函数计算键的索引,然后检查数组中的该位置是否有对应的键值对。如果有,则返回相应的值;否则返回未找到的结果。

def get(self, key: int) -> int:
    index = self.hash(key)
    if self.buckets[index] is None:
        return -1
    for k, v in self.buckets[index]:
        if k == key:
            return v
    return -1

删除

通过哈希函数计算键的索引,找到对应的键值对,然后删除。如果使用链式地址法,则需要从链表中删除相应的节点;如果使用开放地址法,则需要标记位置为已删除。

def remove(self, key: int) -> None:
    index = self.hash(key)
    if self.buckets[index] is None:
        return
    for i, (k, v) in enumerate(self.buckets[index]):
        if k == key:
            del self.buckets[index][i]
            return

3. 哈希表的实现示例

以下是使用链式地址法实现的哈希表示例:

class MyHashMap:

    def __init__(self):
        self.size = 1000
        self.buckets = [[] for _ in range(self.size)]

    def hash(self, key: int) -> int:
        return key % self.size

    def put(self, key: int, value: int) -> None:
        index = self.hash(key)
        bucket = self.buckets[index]
        for i, (k, v) in enumerate(bucket):
            if k == key:
                bucket[i] = (key, value)
                return
        bucket.append((key, value))

    def get(self, key: int) -> int:
        index = self.hash(key)
        bucket = self.buckets[index]
        for k, v in bucket:
            if k == key:
                return v
        return -1

    def remove(self, key: int) -> None:
        index = self.hash(key)
        bucket = self.buckets[index]
        for i, (k, v) in enumerate(bucket):
            if k == key:
                del bucket[i]
                return

4. 哈希表的应用

  • 数据检索:哈希表提供了快速的键值对查找,广泛用于实现字典和集合。
  • 缓存:用于实现缓存机制,如LRU缓存。
  • 哈希集合:实现无重复元素的集合,支持快速查找、插入和删除。

哈希表是一种高效的数据结构,适用于需要快速查找和修改数据的场景。如果有更多具体问题或需要详细解释某些部分,请告诉我!