IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法【哈希】 | 哈希【布隆过滤器】 -> 正文阅读

[数据结构与算法]算法【哈希】 | 哈希【布隆过滤器】

一、概念

1.1 简介

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数

  • 可用于检索一个元素是否在一个集合中;
  • 优点:空间效率查询时间都远远超过一般的算法;
  • 缺点:有一定的误识别率删除困难

1.2 原理

当元素被加入到集合内部,通过K个散列函数将改元素映射成一个位数组中的K个点,且将其置为1;当我们检索元素时,只需通过散列函数查看这些点是否为1即可,若其中任意一点为0,则即可判断一定不在集合里面

  • 【注意】:若检索都为1,只能说很可能在集合内部。因为集合具有一定的误识别率,需要通过结合集合的大小以及散列函数的个数来降低错误率;

在这里插入图片描述

1.3 复杂度

时间复杂度:

插入以及查询 ==》常数O(k)

1.4 使用步骤

  • 需要先确定布隆过滤器的元素需要多少位;
  • 确定集合需要多少空间【m】,根据提供的失误率【p】和样本数量【n】得出;

在这里插入图片描述

  • 通过样本数量即空间大小【m】确定出使用散列函数个数【k】;

在这里插入图片描述

  • 计算真实失误率【p】;

在这里插入图片描述

ln2 近似为0.7

p、m、k之间的关系

  • 当样本量n不变时,此时集合空间m越大,则失误率越低;
  • 当样本量、空间不变时,当k较小时,会导致散列的点分布较少,即可能出现局部密集的点,导致失误率降低,若k较大时,会出现在在整个空间内密集,从而降低失误率,故k需要选择一个较为合适的大小

1.5 扩展和应用

黑名单系统

缓存过滤

网络部署Web缓存以更高的性能和可靠性缓存并为用户提供 Web 内容;

  • 用于有效地确定将哪些Web 对象存储在这些 Web 缓存中。访问一次,后续不在访问的用户缓存显然是浪费磁盘资源,因为它将不会被再次访问。即用于跟踪用户访问的所有 URL。Web 对象仅在之前至少被访问过一次时才被缓存,即对象在其第二次请求时被缓存。减少了磁盘写入工作量。此外,节省磁盘上的缓存空间,从而提高缓存命中率;

分布式过滤器

可以实现并行布隆过滤器以利用并行无共享机器中存在的多个处理元素(PE) ;

  • 并行布隆过滤器的主要障碍之一是无序数据的组织和通信,通常在启动或批量插入时均匀分布在所有 PE 上。要对数据进行排序,可以使用两种方法,一种是对存储在每个 PE 上的所有数据进行布隆过滤器,称为复制布隆过滤器,或者对所有数据进行布隆过滤器分成相等的部分,每个 PE 存储它的一部分对于这两种方法,都使用“Single Shot”布隆过滤器,它只计算一个哈希,导致每个元素一个翻转位,以减少通信量;

二、简单模拟构建bit数组

/*----------------------------------------------------------------------
	> File Name: bitMap.cpp
	> Author: Jxiepc
	> Mail: Jxiepc
	> Created Time: Thu 03 Mar 2022 11:14:50 AM CST
----------------------------------------------------------------------*/

#include <iostream>

template<class T>
class bitMap {
public:
    bitMap() {
        T a;
        bitNum(a);
    }
    /** 数据类型的bit */
    int bitNum(T a) {
        std::cout << sizeof(a) * 8  << std::endl;  
        return sizeof(a) * 8;
    }
    
    /** 要取出的bit数,对应列表中的哪个数值 */
    void setNumIdx(T bit) const {
        numIdx = bit/m_bit;
    }

    int getNumIdx(T bit) {
        return numIdx;
    }

    /** 取出的bit数种,对应列表中数值的哪一位上 */
    void setbitIdx(T bit) const {
        bitIdx = bit % m_bit;
    }

    int getbitIdx() {
       return bitIdx; 
    }

    /** 取出该位的状态 */
    int getStatus() {
        return ((arr[numIdx] >> (bitIdx)) &1);
    }

    /** 设置状态为0 */
   void setFalse() {
        arr[numIdx] = arr[numIdx] & (~ (1 << bitIdx));
   } 

   /** 设置状态为1 */
   void setTrue() {
       arr[numIdx] = arr[numIdx] | (1<<bitIdx);
   }
private:
    int m_bit = 0;
    int numIdx = -1;
    int bitIdx = -1;
    T arr[];
};



int main(int argc, char* argv[])
{
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:50:05  更:2022-03-04 15:51:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:50:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码