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

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

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

什么是布隆过滤器?

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

相关文章
|
7月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
160 5
|
7月前
|
Java 开发者
课时98:泛型接口
本文聚焦Java泛型接口,阐述泛型不仅能在位(类)上定义,还可在接口中使用。通过实际代码示例,详细介绍泛型接口的定义以及子类实现泛型接口的两种方式,帮助读者理解其概念和应用,强调在实际编程中理解和掌握这些知识的重要性。 1.泛型接口的定义 2.泛型接口的子类实现方式
153 2
|
7月前
|
SQL 容灾 关系型数据库
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
SQL Server 以其卓越的易用性和丰富的软件生态系统,在数据库行业中占据了显著的市场份额。作为一款商业数据库,外部厂商在通过解析原生日志实现增量数据捕获上面临很大的挑战,DTS 在 SQL Sever 数据通道上深研多年,提供了多种模式以实现 SQL Server 增量数据捕获。用户可以通过 DTS 数据传输服务,一键打破自建 SQL Server、RDS SQL Server、Azure、AWS等他云 SQL Server 数据孤岛,实现 SQL Server 数据源的流动。
385 0
阿里云DTS踩坑经验分享系列|DTS打通SQL Server数据通道能力介绍
|
8月前
|
机器学习/深度学习
RT-DETR改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计
RT-DETR改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计
319 11
|
7月前
|
人工智能 数据可视化 TensorFlow
《解锁DevEco Studio:开启鸿蒙AI模型可视化开发新征程》
在人工智能与鸿蒙系统深度融合的趋势下,DevEco Studio作为华为打造的一站式开发平台,为人工智能模型的可视化开发提供了强大支持。通过搭建基础环境、引入AI框架(如HiAI或TensorFlow Lite)、运用智能代码编辑和低代码开发工具,以及借助DeepSeek等AI辅助编程功能,开发者可高效构建多端一致的AI应用。从环境配置到模型训练与界面优化,DevEco Studio助力探索创新应用场景,推动鸿蒙生态蓬勃发展,为用户带来智能化新体验。
210 0
|
9月前
|
存储 架构师 容灾
阿里云基础设施高可用最佳实践沙龙上海站圆满举办!
2025年1月9日,阿里云在上海虹桥绿地铂瑞酒店成功举办基础设施高可用最佳实践沙龙NO.2。活动吸引了华东地区多家企业的CTO、架构师和技术从业者参与。专家们分享了高可用的基础知识、分级标准及云端架构实战经验,涵盖计算、存储、网络和云原生等领域,重点讨论了企业如何在阿里云上构建高可用数据中心。现场互动热烈,参会者与专家深入交流,探讨技术应用与合作机会。
|
人工智能 自然语言处理 搜索推荐
评测:AI客服接入钉钉与微信的对比分析
【8月更文第22天】随着人工智能技术的发展,越来越多的企业开始尝试将AI客服集成到自己的业务流程中。本文将基于《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案,详细评测AI客服在钉钉和微信中的接入流程及实际应用效果,并结合个人体验分享一些心得。
10326 10
|
机器学习/深度学习 人工智能 数据挖掘
AI技术对开发者职业天花板的双重影响
随着AI技术的不断创新和飞速发展,人工智能技术在软件开发、数据分析、自动化等领域的应用愈发广泛,并产生了深远的影响。尤其是在程序圈中,对于开发者这一职业群体而言,AI技术的融入不仅改变了传统的开发流程,还对开发者的职业前景带来了全新的挑战和机遇。那么本文就来简单聊聊AI技术究竟对开发者的职业天花板是提升还是降低呢?讨论一下AI技术如何影响开发者的职业天花板。
499 3
AI技术对开发者职业天花板的双重影响
将文字或txt转换成GBK或者UTF8编码
将文字或txt转换成GBK或者UTF8编码
892 1
|
小程序 JavaScript 前端开发
4大主流小程序平台介绍及其优缺点对比
小程序是一种轻量级应用程序,能够在手机上直接运行,无需下载安装,适用于一些简单的功能场景,如点餐、预约、查看天气等。以下是目前主流的小程序平台及其优缺点对比
3393 0