哈希函数堂兄弟 “布隆过滤器”

简介: 哈希函数堂兄弟 “布隆过滤器”

本篇文章来描述一下布隆过滤器数据结构

什么是布隆过滤器?

Bloom Filter是一种时空效率都很高的随机数据结构,通过一个位数组和多哈希函数来解决海量数据的判重问题,适用于不严格要求100%正确的场合,也可以用来对数据进行初步过滤。

Bloom Filter的原理与Bitmap十分类似,区别仅在于使用k个而不是单个哈希函数,以降低因哈希碰撞冲突造成的误判。

Bloom Filter一般需要提供两个接口:

  • 将元素加入集合
  • 给定元素,判断集合中是否存在

2.布隆过滤器初始化

初始集合bits[m]是个全为0的位数组。

3.添加元素

在添加元素时,分别计算出k个哈希值hi,并将bits[hi]置成1。

4.判断存在性

给定元素,分别计算出k个哈希值hi,只要有一个bits[hi]是0,则该元素一定不在集合中;反之,如果全部bits[hi]都是1,那么该元素有很大概率存在于集合中。

布隆过滤器代码实例:

#include <bitset>  
#include <vector>  
#include <functional>  
  
class BloomFilter {  
private:  
    size_t capacity_;  
    size_t hash_num_;  
    std::vector<std::function<size_t(const std::string&)>> hash_functions_;  
    std::bitset<8 * 1024 * 1024> bitset_;  // 假设位数组的大小为1MB  
  
public:  
    BloomFilter(size_t capacity, size_t hash_num)  
        : capacity_(capacity), hash_num_(hash_num), bitset_(capacity) {  
        hash_functions_.resize(hash_num);  
        hash_functions_[0] = std::hash<std::string>{};  
        if (hash_num > 1) {  
            auto seed = std::chrono::system_clock::now().time_since_epoch().count();  
            std::mt19937 gen(seed);  
            std::uniform_int_distribution<> dis(0, INT_MAX);  
            for (size_t i = 1; i < hash_num; ++i) {  
                hash_functions_[i] = [&gen, &dis](const std::string& s) {  
                    return dis(gen) ^ std::hash<std::string>{}(s);  
                };  
            }  
        }  
    }  
  
    void add(const std::string& value) {  
        for (auto& hash : hash_functions_) {  
            size_t hash_value = hash(value);  
            bitset_.set(hash_value % capacity_, true);  
        }  
    }  
  
    bool might_contain(const std::string& value) {  
        for (auto& hash : hash_functions_) {  
            size_t hash_value = hash(value);  
            if (!bitset_.test(hash_value % capacity_)) {  
                return false;  
            }  
        }  
        return true;  
    }  
};

这个布隆过滤器类有两个主要的函数:addmight_containadd 函数用于向过滤器中添加一个元素,而 might_contain 函数则用于检查一个元素是否可能在过滤器中。

布隆过滤器有一个重要的特性,那就是它可能会产生误报。也就是说,如果一个元素没有被添加到过滤器中,might_contain 函数仍然可能会返回 true。这是因为在布隆过滤器中,元素是通过多个哈希函数映射到位数组中的,而这些哈希函数可能会产生冲突,导致一些未被添加的元素被错误地标记为已存在。

好了 本篇文章就到这里结束了 内容有点难 大家要反复的理解 这篇文章的基础是哈希函数和哈希算法  在理解了哈希算法之后 再来学习布隆过滤器 有助于加深对文章的理解

在这里我给大家推荐一个课程 小编也学习过这个课程 感觉性价比挺高:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
【MATLAB第11期】#源码分享 |时间序列数据绘图,横坐标更改为时间轴 横坐标轴参数更改 日期间隔设置 日期标签或格式更改
【MATLAB第11期】#源码分享 |时间序列数据绘图,横坐标更改为时间轴 横坐标轴参数更改 日期间隔设置 日期标签或格式更改
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
1904 0
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
|
6月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
140 5
|
6月前
|
Java 开发者
课时98:泛型接口
本文聚焦Java泛型接口,阐述泛型不仅能在位(类)上定义,还可在接口中使用。通过实际代码示例,详细介绍泛型接口的定义以及子类实现泛型接口的两种方式,帮助读者理解其概念和应用,强调在实际编程中理解和掌握这些知识的重要性。 1.泛型接口的定义 2.泛型接口的子类实现方式
141 2
|
6月前
|
人工智能 数据可视化 TensorFlow
《解锁DevEco Studio:开启鸿蒙AI模型可视化开发新征程》
在人工智能与鸿蒙系统深度融合的趋势下,DevEco Studio作为华为打造的一站式开发平台,为人工智能模型的可视化开发提供了强大支持。通过搭建基础环境、引入AI框架(如HiAI或TensorFlow Lite)、运用智能代码编辑和低代码开发工具,以及借助DeepSeek等AI辅助编程功能,开发者可高效构建多端一致的AI应用。从环境配置到模型训练与界面优化,DevEco Studio助力探索创新应用场景,推动鸿蒙生态蓬勃发展,为用户带来智能化新体验。
186 0
|
JavaScript 前端开发
vue element-ui分页插件 始终保持在页面底部样式
vue element-ui分页插件 始终保持在页面底部样式
750 0
vue element-ui分页插件 始终保持在页面底部样式
|
机器学习/深度学习 人工智能 数据挖掘
AI技术对开发者职业天花板的双重影响
随着AI技术的不断创新和飞速发展,人工智能技术在软件开发、数据分析、自动化等领域的应用愈发广泛,并产生了深远的影响。尤其是在程序圈中,对于开发者这一职业群体而言,AI技术的融入不仅改变了传统的开发流程,还对开发者的职业前景带来了全新的挑战和机遇。那么本文就来简单聊聊AI技术究竟对开发者的职业天花板是提升还是降低呢?讨论一下AI技术如何影响开发者的职业天花板。
480 3
AI技术对开发者职业天花板的双重影响
|
小程序 JavaScript 前端开发
4大主流小程序平台介绍及其优缺点对比
小程序是一种轻量级应用程序,能够在手机上直接运行,无需下载安装,适用于一些简单的功能场景,如点餐、预约、查看天气等。以下是目前主流的小程序平台及其优缺点对比
3345 0
|
缓存 Dubbo 应用服务中间件
Dubbo + Nacos这么玩就失去高可用的能力了
酱香配拿铁喝了伤头,Dubbo配Nacos这么玩也会伤头。本文介绍Dubbo配合Nacos搭建的微服务系统,在Nacos-Server集群重启时出现的问题。过程中通过种种现象、猜测、翻看源码、实践,最终让Nacos-Server平滑重启。
|
JavaScript 测试技术 编译器
从0搭建Vue3组件库:引入单元测试框架Vitest
从0搭建Vue3组件库:引入单元测试框架Vitest
1227 0