位图与布隆过滤器深度剖析

位图与布隆过滤器深度剖析

目录

位图与布隆过滤器深度剖析

一、位图 (Bitmap)

二、布隆过滤器 (Bloom Filter)

三、 结合位图与布隆过滤器的最佳实践


在处理大数据和进行高性能查找时,传统的数据结构如数组、链表等可能无法满足效率和空间上的需求。位图和布隆过滤器是两种用于解决特定问题的数据结构,它们以空间换时间的策略在各种场景中展现出高效性。本文将详细分析这两种数据结构的原理、实现及最佳实践。

一、位图 (Bitmap)

 1. 定义与原理

位图是一种使用位数组来表示一个集合的数据结构。每个位代表集合中的一个元素,如果该位为0,则表示对应的元素不在集合中;如果为1,则表示元素在集合中。位图通常用于处理大量整数的集合,尤其是当这些整数在一个较小的范围内时,它可以节省大量的存储空间。

2. 应用场景

- 大数据集的去重操作
- 磁盘空间的分配
- 网络地址管理

3. 代码示例


#include <stdint.h>
#include <stdlib.h>

// 初始化位图
void bitmap_init(struct bitmap *bmp, int size) {
    bmp->size = size;
    bmp->bits = calloc(sizeof(uint8_t), (size + 7) / 8);
}

// 设置位图中的某个位
void bitmap_set(struct bitmap *bmp, int index) {
    int byte_index = index / 8;
    int bit_index = index % 8;
    bmp->bits[byte_index] |= 1 << bit_index;
}

// 清除位图中的某个位
void bitmap_clear(struct bitmap *bmp, int index) {
    int byte_index = index / 8;
    int bit_index = index % 8;
    bmp->bits[byte_index] &= ~(1 << bit_index);
}

// 检查位图中的某个位是否被设置
int bitmap_test(struct bitmap *bmp, int index) {
    return bmp->bits[index / 8] & (1 << (index % 8));
}

// 位图数据结构
struct bitmap {
    size_t size;
    uint8_t *bits;
};
```

 4. 性能与优化

位图的操作通常非常快,因为它们只涉及简单的位操作。但是,位图不支持随机访问,只能按位顺序访问。此外,位图的空间效率取决于集合的大小和整数的范围。

二、布隆过滤器 (Bloom Filter)

 1. 定义与原理

布隆过滤器是一种概率型数据结构,用于测试一个元素是否是集合的成员。它可能会产生假阳性(即错误地认为一个不存在的元素存在于集合中),但不会产生假阴性(即正确地识别不存在的元素)。布隆过滤器通过使用多个哈希函数对元素进行哈希并存储结果来实现这一点。

 2. 应用场景

- 大规模数据集的快速成员检测
- 垃圾邮件过滤
- 缓存穿透预防

3. 代码示例


import mmh3
from bitarray import bitarray

class BloomFilter:
    def __init__(self, size, hash_num):
        self.size = size
        self.hash_num = hash_num
        self.bit_array = bitarray(size)
        self.bit_array.setall(0)

    def add(self, string):
        for seed in range(self.hash_num):
            result = mmh3.hash(string, seed) % self.size
            self.bit_array[result] = 1

    def lookup(self, string):
        for seed in range(self.hash_num):
            result = mmh3.hash(string, seed) % self.size
            if self.bit_array[result] == 0:
                return "Nope"
        return "Probably"

# 初始化布隆过滤器
bf = BloomFilter(500000, 7)
# 添加元素
bf.add("test")
# 查询元素
print(bf.lookup("test"))  # 输出:Probably
print(bf.lookup("test2"))  # 输出:Nope
```

4. 性能与优化

布隆过滤器的性能取决于其大小、哈希函数的数量和质量。增加过滤器的大小可以减少假阳性的概率,但会增加内存消耗。增加哈希函数的数量也可以降低假阳性率,但会增加计算成本。选择合适的哈希函数对于减少冲突至关重要。

三、 结合位图与布隆过滤器的最佳实践

在实际应用中,位图和布隆过滤器可以结合使用以达到最佳的空间和时间效率。例如,在处理大量数据的去重问题时,可以先使用布隆过滤器快速判断元素是否可能存在于集合中,然后再使用位图进行精确的存储和查询。这种组合可以在保持低误报率的同时,有效地减少内存使用和提高查询速度。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识图谱与大语言模型的协同(RAG)——MindMap

MindMap : Knowledge Graph Prompting Sparks Graph of Thoughts in Large Language Models 论文地址: https://arxiv.org/abs/2308.09729 代码:https://github.com/wylwilling/MindMap 1.概述 大型语言模型(LLMs)在处理新信息、防止生成幻觉内容、以及增强决策过程透明度…

mysql: docker 异常 - mbind: Operation not permitted

mbind: Operation not permitted 前言&#xff1a;正文:结论 &#xff1a; 前言&#xff1a; 用数据库处理平台问题今天报错&#xff0c;mbind: Operation not permitted。 mbind 不允许操作&#xff0c;一头雾水这是什么意思。 网上找了很多资料大概意思是&#xff1a; 这个错…

《21天学通C++》(第二十章)STL映射类(map和multimap)

为什么需要map和multimap&#xff1a; 1.查找高效&#xff1a; 映射类允许通过键快速查找对应的值&#xff0c;这对于需要频繁查找特定元素的场景非常适合。 2.自动排序&#xff1a; 会自动根据键的顺序对元素进行排序 3.多级映射&#xff1a; 映射类可以嵌套使用&#xff0c;创…

第22天 数据库

数据库存储位置 1.基于存储位置 1.1 基于磁盘存储 &#xff1a;IO保证数据的持久化。比如MySQL。性能低 1.2基于缓存存储 &#xff1a;数据存储在内存中&#xff0c;可能会丢失一些数据。性能高&#xff0c;比如Redis 2.基于关系划分 2.1 关系型数据库 &#xff1a;mysql ora…

RabbiMQ-消息可靠性

RabbiMQ消息可靠性 生产者可靠性 生产者重试机制 问题&#xff1a;生产者发送消息时&#xff0c;出现了网络故障&#xff0c;导致与MQ的连接中断 解决&#xff1a; spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时…

面试题:简述Go的垃圾回收机制

Go的GC(Garbage Collection, 垃圾回收)机制主要是用来自动释放不再被程序使用的内存&#xff0c;以防止内存泄漏。Go的垃圾回收是并发的&#xff0c;也就是说&#xff0c;它在主程序运行的同时进行垃圾回收。 1. 标记清除(Mark and Sweep) Go的垃圾回收器主要使用的是标记清除…

感谢有你 | FISCO BCOS 2024年度第一季度贡献者榜单

挥别春天&#xff0c;FISCO BCOS开源社区迎来了2024年第一季度的共建成果。FISCO BCOS秉承对区块链技术的信仰&#xff0c;汇聚超过5000家企业机构、10万余名个人成员共建共治共享&#xff0c;持续打造更加活跃更加繁荣的开源联盟链生态圈。 开启夏日&#xff0c;我们见证了社…

2024年软件测试最全jmeter做接口压力测试_jmeter接口性能测试_jmeter压测接口(3),【大牛疯狂教学

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

短信群发公司

伴随着移动互联网和智能手机的普及&#xff0c;短信群发成为了企业与个人之间高效沟通的一种重要方式。短信群发公司应运而生&#xff0c;致力于为用户提供专业、安全、高效的群发服务。 服务内容 短信群发公司提供多样化的服务内容&#xff0c;满足不同用户的需求。短信群发公…

百面算法工程师 | 支持向量机面试相关问题——SVM

本文给大家带来的百面算法工程师是深度学习支持向量机的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习算法工程师面试问题&#xff0c;并提供参考的回答…

Tensorflow2.0笔记 - 循环神经网络RNN做IMDB评价分析

本笔记记录使用SimpleRNNCell做一个IMDB评价系统情感二分类问题的例子。 import os import time import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, Inputos.envir…

2024.5.9

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(1000,600);this->setFixedSize(1000,600);//设置按钮大小位置完成btn1 new QPushButton(&…

大文件分块上传

断点续传 断点续传需要为每个分块加md5值&#xff0c;如果用户取消上传&#xff0c;可以知道那些分块已经上传了 切块上传 只要校验整个文件的完整性就好 前端代码示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

[AIGC] 《MyBatis-Plus 结合 Spring Boot 的动态数据源介绍及 Demo 演示》

在现代的 Web 应用开发中&#xff0c;Spring Boot 已经成为了一种流行的框架选择。而 MyBatis-Plus 则为 MyBatis 框架提供了更强大的功能和便利。当它们结合使用时&#xff0c;动态数据源的运用变得更加简单和高效。 动态数据源的概念允许我们在运行时根据不同的条件或需求选…

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master‘ of

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master’ of … 1、问题产生背景 直接在远程仓库新建了md文件&#xff0c;本地库修改了文件已添加到暂存区之后再提交报错 2、分析 远程新建文件产生变更&#xff0c;版本号与本地拿到的不一致&#xff0c;本地再次提…

tf2使用savemodel保存之后转化为onnx适合进行om模型部署

tf2使用savemodel保存之后转化为onnx适合进行om模型部署 tf保存为kears框架h5文件将h5转化为savemodel格式&#xff0c;方便部署查看模型架构将savemodel转化为onnx格式使用netrononnx模型细微处理代码转化为om以及推理代码&#xff0c;要么使用midstudio tf保存为kears框架h5文…

中国M2总量是两个美国,意味着什么

中国人民银行公布数据&#xff1a;2月末&#xff0c;我国广义货币(M2)余额299.56万亿元&#xff0c;同比增长8.7%。 2000年末我国M2仅13万亿元&#xff0c;2013年3月达到100万亿元&#xff1b;2020年1月突破200万亿元&#xff1b;2024年2月接近300万亿元&#xff0c; 与美欧日…

CPU的星际穿越——“三维”解析“二维”之谜

文章目录 写在前面为什么三维的CPU能执行二维的指令二维指令是三维机器的抽象而已计算机所有东西都是三维的降维抽象没有软件没有指令二维到三维的总结操作系统的重塑 写在前面 以下是自己关于CPU为何能执行指令的迷惑的抽丝破茧的解答—— 困扰我的一个的问题之CPU的星际穿越…

Linux下CPU频率和核心数的锁定设置

linux下cpu频率的锁定设置 查询cpu相关信息 使用工具为&#xff1a;cpufrequtils sudo apt-get install cpufrequtils使用 cpufreq-info 命令来查看当前的 CPU 频率以及支持的频率范围 cpufreq-info设置某个CPU核心的频率 如果你想将 CPU 频率锁定在一个特定的值&#xff0…

【VLAN聚合和MUX VLAN的配置总结】

vlan聚合&#xff1a; 在一个物理网络内用多个VLAN隔离广播域&#xff0c;并将这些Sub-VLAN聚合成一个逻辑的VLAN&#xff08;称为Super-VLAN&#xff09;&#xff0c; 这些Sub-VLAN共用同一个IP子网和缺省网关&#xff0c;进而达到节约IP地址资源的目的。 案例&#xff1a;某…