前言:
现时朋友们对“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判断字符串是包含