龙空技术网

有一堆字符串,判断一个字符串是否在里面,用什么数据结构?

驯鹿的古牧 155

前言:

现时朋友们对“python判断字符串是包含”大约比较看重,看官们都想要学习一些“python判断字符串是包含”的相关资讯。那么小编也在网络上网罗了一些对于“python判断字符串是包含””的相关内容,希望兄弟们能喜欢,我们快快来学习一下吧!

使用哈希表实现将每个字符串存储为哈希表的键如果要判断一个字符串是否在其中,可以直接查询哈希表中是否存在该键使用布隆过滤器实现

布隆过滤器是一种空间效率高、误判率低的数据结构,它利用位数组和哈希函数实现。在判断一个字符串是否在其中时,先将该字符串经过多个哈希函数得到多个哈希值,再将这些哈希值对应的位数组位置设为1。当判断一个字符串是否在其中时,同样将该字符串经过多个哈希函数得到多个哈希值,若这些哈希值对应的位数组位置都为1,则认为该字符串可能在其中,否则认为该字符串一定不在其中。

具体步骤:

初始化一个长度为 n 的位数组,初始化所有位为 0对于每个字符串,将其通过多个哈希函数映射成位数组上的 k 个位置,将这些位置的值设置为 1如果要判断一个字符串是否在其中,将该字符串通过相同的 k 个哈希函数映射到位数组上,并检查这些位置的值是否都为 1注意:由于布隆过滤器可能存在误判,所以如果检查得到所有位置的值都为1,仍需要进一步用其他数据结构(如哈希表)进行确认

import mmh3import mathfrom bitarray import bitarrayclass BloomFilter:    def __init__(self, capacity, error_rate):        self.capacity = capacity        self.error_rate = error_rate        self.bit_array_size = self.calculate_bit_array_size(capacity, error_rate)        self.hash_count = self.calculate_hash_count(self.bit_array_size, capacity)        self.bit_array = bitarray(self.bit_array_size)        self.bit_array.setall(0)    def add(self, key):        for seed in range(self.hash_count):            index = mmh3.hash(key, seed) % self.bit_array_size            self.bit_array[index] = 1    def contains(self, key):        for seed in range(self.hash_count):            index = mmh3.hash(key, seed) % self.bit_array_size            if self.bit_array[index] == 0:                return False        return True    def calculate_bit_array_size(self, capacity, error_rate):        m = - (capacity * math.log(error_rate)) / (math.log(2) ** 2)        return int(m)    def calculate_hash_count(self, bit_array_size, capacity):        k = (bit_array_size / capacity) * math.log(2)        return int(k)# 使用示例:# 创建布隆过滤器bf = BloomFilter(1000, 0.01)# 添加字符串bf.add('hello')bf.add('world')# 判断字符串是否在其中print(bf.contains('hello'))  # Trueprint(bf.contains('world'))  # Trueprint(bf.contains('python')) # False

标签: #python判断字符串是包含