📜  数据结构|杂凑问题4(1)

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

数据结构|杂凑问题4

在计算机编程中,杂凑(哈希)是一种用于将信息(如大型文件)压缩成固定长度散列(哈希值)的技术。哈希值通常用于校验文件的完整性或比较文件,但它们也广泛用于数据结构中,如哈希表和布隆过滤器。

哈希表

哈希表是一种常用的数据结构,它通过键值对的方式存储数据。哈希表中的键通过哈希函数转换成对应的哈希值,而哈希值则对应着值所在的位置。由于哈希函数是在键的基础上计算的,因此相同的键一定会被映射到相同的哈希值上,从而实现快速查找和插入操作。

哈希表的主要优点是快速查找和插入,但它也有一些限制,如:

  • 哈希表中的键必须是可哈希的,即能够通过哈希函数计算出对应的哈希值。
  • 哈希表中的键不能重复,因为相同的键将映射到相同的哈希值上,从而无法保存多个对应的值。

以下是使用Python语言实现哈希表的一个示例:

class HashTable:
    def __init__(self):
        self.size = 10
        self.table = [[] for _ in range(self.size)]

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

    def set(self, key, value):
        hash_value = self._hash(key)
        for i, (k, v) in enumerate(self.table[hash_value]):
            if k == key:
                self.table[hash_value][i] = (key, value)
                return
        self.table[hash_value].append((key, value))

    def get(self, key):
        hash_value = self._hash(key)
        for k, v in self.table[hash_value]:
            if k == key:
                return v
        return None

在上述代码中,哈希表中存储的是一个列表,列表的每个元素又是由键值对组成的元组。哈希表的查询操作需要使用哈希函数计算出键对应的哈希值,从而快速定位到对应的位置。

布隆过滤器

布隆过滤器是一种基于哈希的数据结构,它可以对大规模数据进行快速的查找和插入操作。布隆过滤器通过多个哈希函数对输入进行计算,从而将其映射到多个位置上。当需要查询某个值是否存在时,只需要检查其对应的位置上是否都为1即可,如果存在一个位置为0,则说明该值一定不存在。

布隆过滤器的主要优点是快速查找和插入,但它有一定的误判率,即可能将不存在的值误认为存在。因此,布隆过滤器一般用于快速判断某个值是否存在,而不用于精确判断。

以下是使用Python语言实现布隆过滤器的一个示例:

import hashlib

class BloomFilter:
    def __init__(self, size, functions):
        self.size = size
        self.functions = functions
        self.bits = [0] * size

    def _hash(self, value):
        value = str(value).encode('utf-8')
        for func in self.functions:
            hash_value = int(hashlib.sha256(value + func).hexdigest(), 16)
            yield hash_value % self.size

    def add(self, value):
        for i in self._hash(value):
            self.bits[i] = 1

    def __contains__(self, value):
        return all(self.bits[i] for i in self._hash(value))

在上述代码中,布隆过滤器使用了多个哈希函数,每个哈希函数都会将输入计算成一个哈希值。布隆过滤器中的每个元素则对应着多个位置上的比特位,当需要查询某个元素是否存在时,布隆过滤器会检查其对应的多个位置上是否都为1,如果是则说明该元素可能存在,如果不是则说明该元素一定不存在。