布隆过滤器

简介: 布隆过滤器

布隆过滤器

布隆过滤器就是为了解决位图不能解决的问题。

  1. 用哈希表存储用户记录,缺点:浪费空间
  2. 用位图存储用户记录,缺点:不能处理哈希冲突
  3. 将哈希与位图结合,即布隆过滤器

布隆过滤器的概念

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结

,特点是高效地插入和查询,可以用来告诉* “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间

为了降低冲突的概率,我们可以把一个值映射到三个位置上去。

布隆过滤器的插入

先构造出三种不同的哈希函数:

struct HashBKDR
{
  // BKDR
  size_t operator()(const string& key)
  {
    size_t val = 0;
    for (auto ch : key)
    {
      val *= 131;
      val += ch;
    }
    return val;
  }
};
struct HashAP
{
  // BKDR
  size_t operator()(const string& key)
  {
    size_t hash = 0;
    for (size_t i = 0; i < key.size(); i++)
    {
      if ((i & 1) == 0)
      {
        hash ^= ((hash << 7) ^ key[i] ^ (hash >> 3));
      }
      else
      {
        hash ^= (~((hash << 11) ^ key[i] ^ (hash >> 5)));
      }
    }
    return hash;
  }
};
struct HashDJB
{
  // BKDR
  size_t operator()(const string& key)
  {
    size_t hash = 5381;
    for (auto ch : key)
    {
      hash += (hash << 5) + ch;
    }
    return hash;
  }
};

布隆过滤器当中,如果没有找到这个值,那么就不存在,如果找到了这个值,却不一定存在,因为存在哈希冲突。

所以在判断一个值在不在的时候就得去判断这个值是不是不在这个位图当中。

void Set(const K& key)
{
  Hash1 h1;
  Hash2 h2;
  Hash3 h3;
  //size_t hash1 = Hash1()(key) % (_ratio*N);
  //这样也可以,先创建一个Hash1()匿名对象,然后调用operator()
  size_t hash1 = h1(key) % (_ratio * N);
  _bits.set(hash1);
  size_t hash2 = h2(key) % (_ratio * N);
  _bits.set(hash2);
  size_t hash3 = h3(key) % (_ratio * N);
  _bits.set(hash3);
}
bool Test(const K& key)
{
  Hash1 h1;
  Hash2 h2;
  Hash3 h3;
  size_t hash1 = h1(key) % (_ratio * N);
  if (!_bits.test(hash1))
  {
    return false;
  }
  size_t hash2 = h2(key) % (_ratio * N);
  if (!_bits.test(hash2))
  {
    return false;
  }
  size_t hash3 = h3(key) % (_ratio * N);
  if (!_bits.test(hash3))
  {
    return false;
  }
  return true;
}

布隆过滤器的删除

其实删除要实现的话意义不大,如果实现了删除,布隆过滤器原本的优势就没有了,还不如用哈希表呢

对每一个位置进行一个数量的标记即可。

目录
相关文章
|
关系型数据库 MySQL Java
跨专业大白8小时实现计算机准毕业生作品
本文是作者通过模仿前辈的项目,成功实现一个图书管理系统的心得分享,涵盖了Java和MySQL数据库的使用,以及在开发过程中遇到的问题和解决方案。
跨专业大白8小时实现计算机准毕业生作品
|
数据库 Python
Traceback(most recent call last):File "main.py", line 4l,in<module>alueError: sleep length must be n
Traceback(most recent call last):File "main.py", line 4l,in<module>alueError: sleep length must be n
|
消息中间件 存储 Java
RabbitMQ之延迟队列(手把手教你学习延迟队列)
【1月更文挑战第12天】延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列的。
5330 101
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在创意写作中的应用与挑战
【8月更文挑战第9天】随着人工智能技术的飞速发展,其在创意写作领域的应用逐渐增多。AI不仅可以协助作家生成文本、提供创作灵感,还能进行作品的风格分析和语言优化。然而,AI在创意写作中也面临着理解深度、版权归属、情感表达等多重挑战。本文将探讨AI技术在创意写作中的积极影响及其局限性,分析其对传统写作模式的冲击,并讨论未来的发展方向。
337 10
|
前端开发 JavaScript Python
PV
【6月更文挑战第24天】
1131 10
|
机器学习/深度学习 人工智能 算法
智能时代的引擎:深度学习技术在图像处理中的应用
本文深入探讨了深度学习在图像处理领域的应用,包括图像分类、目标检测、语义分割以及风格迁移等方面。文章首先介绍了深度学习技术的基本原理和发展历程,然后详细阐述了其在图像识别和处理中的具体实现方法和取得的成果。通过分析最新的研究进展和实际案例,本文展示了深度学习如何推动图像处理技术的发展,并讨论了当前面临的挑战与未来的发展趋势。
|
机器学习/深度学习 自然语言处理 PyTorch
fast.ai 机器学习笔记(四)(1)
fast.ai 机器学习笔记(四)
249 1
fast.ai 机器学习笔记(四)(1)
|
监控 NoSQL 算法
Redisson–红锁(Redlock)–使用/原理
Redisson–红锁(Redlock)–使用/原理
620 0
|
Linux BI
设置Linux服务器时间为北京时间
设置Linux服务器时间为北京时间
1115 1
|
数据库 Python
Django中的事务介绍
Django中的事务介绍
108 0

热门文章

最新文章