📜  数据结构 |哈希|问题 1(1)

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

数据结构 |哈希|问题 1

哈希表(Hash Table)是一种基于键(key)直接访问内存存储位置的数据结构,通常用于快速查找(搜索)和插入(关联数组、字典、符号表等)。当给定一个关键字时,哈希表通过哈希函数(Hash Function)将关键字映射为一个索引值,通过该索引值来查找关键字所对应的值。这个映射关系被称为哈希映射(Hash Mapping)。

哈希表的实现有两种形式:开链法和线性探测法。

开链法

开链法(Chaining)也称拉链法,是将哈希表中每个桶(Bucket)设置为一个链表(Linked List),每个节点保存一个键和值。当发生哈希冲突时,新的键值对将被插入到桶所对应的链表中。

时间复杂度

在理想情况下(即哈希函数对于不同的关键字有很好的散列性),哈希表的查找、插入、删除操作的平均时间复杂度是 O(1),即常数级别。但是在最坏情况下,哈希函数可能将所有元素都映射到同一个桶中,此时哈希表的时间复杂度会退化为 O(n),其中 n 是元素个数。因此,为了保证哈希表的性能,在设计哈希函数时需要注意以下几点:

  1. 哈希函数的计算复杂度应该尽可能小,以减少哈希表操作的时间;
  2. 哈希函数应该对于不同的关键字有很好的散列性,尽量避免发生哈希冲突;
  3. 哈希表的桶的数量应该足够大,以避免大量的关键字被散列到同一个桶中,导致哈希表的时间复杂度退化。
代码片段
class HashTable:
    def __init__(self):
        self.size = 10
        self.table = [[] for _ in range(self.size)]

    def hash_function(self, key):
        return hash(key) % self.size

    def insert(self, key, value):
        hash_value = self.hash_function(key)
        for i, item in enumerate(self.table[hash_value]):
            if item[0] == key:
                self.table[hash_value][i] = (key, value)
                return
        self.table[hash_value].append((key, value))

    def search(self, key):
        hash_value = self.hash_function(key)
        for item in self.table[hash_value]:
            if item[0] == key:
                return item[1]
        return None

    def delete(self, key):
        hash_value = self.hash_function(key)
        for i, item in enumerate(self.table[hash_value]):
            if item[0] == key:
                del self.table[hash_value][i]
                return