新闻中心

C++怎么实现一个布隆过滤器_C++中用位数组实现的高效概率性数据结构

2025-11-22
浏览次数:
返回列表
布隆过滤器通过位数组和多哈希函数判断元素是否存在,允许误判但不漏判。使用std::vector实现位存储,插入时将哈希位置设为1,查询时全1则可能存在,否则一定不存在。参数由预期元素数和误判率计算得出,适用于去重、缓存防护等场景。

c++怎么实现一个布隆过滤器_c++中用位数组实现的高效概率性数据结构

布隆过滤器是一种高效的空间节省型概率数据结构,用于判断一个元素是否存在于集合中。它允许一定的误判率(即可能把不存在的元素误判为存在),但不会将存在的元素漏判。C++ 中可以通过位数组和多个哈希函数来实现。

基本原理与设计思路

布隆过滤器的核心是一个长度为 m 的位数组,初始时所有位都为 0。同时定义 k 个独立的哈希函数,每个函数可以将输入元素映射到位数组的一个位置。

当插入一个元素时,用 k 个哈希函数计算出 k 个位置,并将位数组中这些位置设为 1。查询时同样计算 k 个位置,如果所有位置都为 1,则认为元素“可能存在”;只要有一个位置为 0,则元素“一定不存在”。

关键点:

  • 位数组节省内存
  • k 个哈希函数尽量独立均匀分布
  • 不支持删除操作(标准版本)
  • 存在误判率,但可通过参数调节

使用 std::vector 实现位数组

C++ 中 std::vector 是特化模板,底层以位为单位存储,非常适合实现布隆过滤器。

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic
#include <vector>
#include <string>
#include <functional>
#include <cmath>

class BloomFilter {
private:
    std::vector<bool> bits;
    size_t size;
    size_t hashCount;

    // 简单哈希函数:使用 STL 的 hash 并结合乘法扰动
    size_t hash(const std::string& data, size_t seed) const {
        std::hash<std::string> hasher;
        return (hasher(data) ^ seed) % size;
    }

public:
    BloomFilter(size_t expectedElements, double falsePositiveRate) {
        // 根据期望元素数和误判率计算最优参数
        size = static_cast<size_t>(-expectedElements * log(falsePositiveRate) / (log(2) * log(2)));
        hashCount = static_cast<size_t>(size * log(2) / expectedElements);
        size = std::max(size, static_cast<size_t>(1));
        hashCount = std::max(hashCount, static_cast<size_t>(1));

        bits.resize(size, false);
    }

    void insert(const std::string& data) {
        for (size_t i = 0; i < hashCount; ++i) {
            size_t pos = hash(data, i);
            bits[pos] = true;
        }
    }

    bool contains(const std::string& data) const {
        for (size_t i = 0; i < hashCount; ++i) {
            size_t pos = hash(data, i);
            if (!bits[pos]) {
                return false;  // 一定不存在
            }
        }
        return true;  // 可能存在
    }
};

使用示例与注意事项

下面是一个简单的使用例子:

#include <iostream>

int main() {
    BloomFilter bf(1000, 0.01);  // 支持约1000个元素,误判率1%

    bf.insert("apple");
    bf.insert("banana");

    std::cout << bf.contains("apple") << std::endl;     // 输出 1(可能存在)
    std::cout << bf.contains("grape") << std::endl;     // 很可能输出 0
    std::cout << bf.contains("orange") << std::endl;    // 可能误判为1

    return 0;
}

优化建议:

  • 可替换更高质量的哈希函数,如 MurmurHash、FNV 等提升分布均匀性
  • 对于固定字符串,可预计算部分哈希值
  • 生产环境可用 std::bitset(编译期确定大小)或自定义位数组提升性能
  • 注意 vector 的代理引用特性,避免意外行为

基本上就这些。布隆过滤器在去重、缓存穿透防护、爬虫URL记录等场景非常实用,C++ 实现简洁高效。

以上就是C++怎么实现一个布隆过滤器_C++中用位数组实现的高效概率性数据结构的详细内容,更多请关注其它相关文章!


# 怎么做  # 湛江网站推广公司在哪里  # 长沙页面图片seo  # 高端网站建设银行面试  # 吉林抖音seo选哪家  # 株洲简单的网站建设方案  # 互联网seo知识  # 嘉兴seo快排  # 汽车技术服务与营销推广  # 聊城网站建设收费明细  # 丰台网站推广优化  # 配置文件  # 解决方法  # 都为  # c++  # 重写  # 设为  # 有什么  # 是一个  # 不存在  # 数据结构  # stream  # 爬虫  # apple  # ios  # ai  # app  # 布隆过滤器 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  J*aScript:在map操作中高效处理空数组  word中如何让数字纵向排列_Word数字纵向排列方法  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  快手极速版在线观看 官方网页版登录地址  c++如何实现单例设计模式_c++线程安全的单例模式写法  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  Excel Power Pivot如何处理XML数据源 构建高级数据模型  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  如何在CSS中使用浮动制作导航栏_float实现水平菜单  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  从OpenAI API响应中高效提取生成文本  必由学官网入口 必由学教师登录入口  BetterDiscord插件中安全更新用户简介的实践指南  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  python3时间如何用calendar输出?  淘宝支付提示失败如何解决 淘宝支付流程优化方法  Go语言中JSON数据解码与字段访问指南  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  excel如何生成目录 excel一键生成工作表目录超链接  Go语言HTML解析:利用Goquery精准获取指定元素内容  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  J*aScript打印功能_j*ascript输出控制  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  德邦快递查询平台 德邦快递物流信息查询入口  Spyder启动失败:字体文件权限拒绝错误解决方案  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  Go语言中的*string:深入理解字符串指针  vivo云服务网页版登录 怎么登录vivo云服务网页版  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  J*a递归快速排序中静态变量导致数据累积问题的解决方案  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  新三国志曹操传110级星符试炼夏侯渊极难攻略  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技 

搜索