布隆过滤器

简介: 布隆过滤器

布隆过滤器

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

  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;
}

布隆过滤器的删除

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

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

目录
相关文章
|
4月前
|
存储 缓存 NoSQL
详解布隆过滤器原理与实现
详解布隆过滤器原理与实现
|
6月前
|
存储 算法 Java
哈希算法篇 - 布隆过滤器
哈希算法篇 - 布隆过滤器
57 1
|
6月前
|
算法 容器
布隆过滤器
布隆过滤器
|
7月前
|
存储 数据采集 缓存
解密布隆过滤器:数据领域的魔法阵
解密布隆过滤器:数据领域的魔法阵
118 0
|
7月前
|
存储 NoSQL Java
什么是布隆过滤器?如何实现布隆过滤器?
什么是布隆过滤器?如何实现布隆过滤器?
137 0
|
存储 数据采集 缓存
布隆过滤器:原理与应用
在日常生活和工作中,我们经常需要处理海量的数据,筛选出有用的信息。这个时候,布隆过滤器(Bloom Filter)就派上了用场。
193 1
布隆过滤器:原理与应用
|
7月前
|
存储 算法 Linux
C++ 哈希的应用【布隆过滤器】
C++ 哈希的应用【布隆过滤器】
77 0
|
存储 算法 数据库
哈希的应用:布隆过滤器(C++实现)
哈希的应用:布隆过滤器(C++实现)
93 0
|
存储 数据采集 自然语言处理
浅析布隆过滤器
布隆过滤器 (Bloom Filter) 是 1970 年由布隆提出的。它可以检索一个元素是否存在于集合中。它的优点是空间效率高,查询时间极快,缺点是有一定的误判率,而且删除困难。
176 0
|
存储 人工智能 算法
哈希的应用——布隆过滤器
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。