• 关于布隆过滤器实现


    布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,特点是高效地插入和查询。它是一个 bit 向量或者说 bit 数组。

    核心思想:

    1. 多个hash,增大随机性,减少hash碰撞的概率
    2. 扩大数组范围,使hash值均匀分布,进一步减少hash碰撞的概率。

    BloomFilter的准确性
    尽管BloomFilter已经尽可能的减小hash碰撞的概率了,但是,并不能彻底消除,因此正如上面提到的:
    如果对应的bit位值都为1,那么也不能肯定这个url一定存在
    也就是说,BloomFilter其实是存在一定的误判的,这个误判的概率显然和数组的大小以及hash函数的个数以及每个hash函数本身的好坏有关,具体的计算公式,可以查阅相关论文,这里只给出结果:
    Wiki的Bloom Filter词条有关于误报的概率的详细分析:Probability of false positives。从分析可以看出,误判概率还是比较小的,空间利用率也很高。

    当集合里面的元素数量足够大,如果有500万条记录甚至1亿条记录呢?这个时候常规的数据结构的问题就凸显出来了。数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈。有的同学可能会问,哈希表不是效率很高吗?查询效率可以达到O(1)。但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿 个垃圾 email 地址的消耗?哈希表的做法:首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存,普通计算机是无法提供如此大的内存。这个时候,布隆过滤器(Bloom Filter)就应运而生。

      将任意大小的数据转换成特定大小的数据的函数,转换后的数据称为哈希值或哈希编码。

    假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。

    应用场景:

    黑名单
    比如邮件黑名单过滤器,判断邮件地址是否在黑名单中
    排序(仅限于BitSet)
    仔细想想,其实BitSet在set(int value)的时候,“顺便”把value也给排序了。
    网络爬虫
    判断某个URL是否已经被爬取过
    K-V系统快速判断某个key是否存在
    典型的例子有Hbase,Hbase的每个Region中都包含一个BloomFilter,用于在查询时快速判断某个key在该region中是否存在,如果不存在,直接返回,节省掉后续的查询。

    https://blog.csdn.net/xinzhongtianxia/article/details/81294922

  • 相关阅读:
    Asp.Net页面传值的方法简单总结【原创】
    .Net架构必备工具列表
    .Net架构必备工具列表
    .Net架构必备工具列表
    C#中几种循环语法的比较
    【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)
    【UVA 437】The Tower of Babylon(记忆化搜索写法)
    【uva 1025】A Spy in the Metro
    【codeforces 538E】Demiurges Play Again
    【Codeforces Beta Round #45 D】Permutations
  • 原文地址:https://www.cnblogs.com/facker1/p/10619432.html
Copyright © 2020-2023  润新知