首页 欧冠最新报道正文

朗行,怎么判别一个元素在千万级数据中是否存在?-雷火电竞csgo

admin 欧冠最新报道 2019-11-20 154 0

常规实现

我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较高。

写入和判断元素是否存在都有对应的 API,所以实现起来也比较简单。

为此我写了一个测试类,利用 HashSet 来存数据(底层也是 HashMap );为了方便调试加入了 GC 日志的打印,以及内存溢出后 Dump 内存。设置如下:

-Xms64m -Xmx64m -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError

测试类:

当我只写入 100 条数据时自然是没有问题的。还是在这个基础上,写入 1000W 数据试试:

当我写入1000万数据的时候 很明显 已经报内存溢出了

Bloom Filter

基于上面分析的条件,要实现这个需求最需要解决的是如何将庞大的数据 load 到内存中。

而我们是否可以换种思路,因为只是需要判断数据是否存在,也不是需要把数据查询出来,所以完全没有必要将真正的数据存放进去。

伟大的科学家们已经帮我们想到了这样的需求。

Burton Howard Bloom 在 1970 年提出了一个叫做 Bloom Filter(中文翻译:布隆过滤)的算法。

它主要就是用于解决判断一个元素是否在一个集合中,但它的优势是只需要占用很小的内存空间以及有着高效的查询效率。

所以在这个场景下在合适不过了。

Bloom Filter 原理

下面来分析下它的实现原理:

官方的说法是:它是一个保存了很长的二级制向量,同时结合 Hash 函数实现的。

听起来比较绕,但是通过一个图就比较容易理解了。

如图所示:

  • 首先需要初始化一个二进制的数组,长度设为 L(图中为 8),同时初始值全为 0 。
  • 当写入一个 A1=1000 的数据时,需要进行 H 次 hash 函数的运算(这里为 2 次);与 HashMap 有点类似,通过算出的 HashCode 与 L 取模后定位到 0、2 处,将该处的值设为 1。
  • A2=2000 也是同理计算后将 4、7 位置设为 1。
  • 当有一个 B1=1000 需要判断是否存在时,也是做两次 Hash 运算,定位到 0、2 处,此时他们的值都为 1 ,所以认为 B1=1000 存在于集合中。
  • 当有一个 B2=3000 时,也是同理。第一次 Hash 定位到 index=4 时,数组中的值为 1,所以再进行第二次 Hash 运算,结果定位到 index=5 的值为 0,所以认为 B2=3000 不存在于集合中。

整个的写入、查询的流程就是这样,汇总起来就是:

对写入的数据做 H 次 hash 运算定位到数组中的位置,同时将数据改为 1 。当有数据查询时也是同样的方式定位到数组中。一旦其中的有一位为 0 则认为数据肯定不存在于集合,否则数据可能存在于集合中。

所以布隆过滤有以下几个特点:

  1. 只要返回数据不存在,则肯定不存在。
  2. 返回数据存在,但只能是大概率存在。
  3. 同时不能清除其中的数据。

第一点应该都能理解,重点解释下 2、3 点。

为什么返回存在的数据却是可能存在呢,这其实也和 HashMap 类似。

在有限的数组长度中存放大量的数据,即便是再完美的 Hash 算法也会有冲突,所以有可能两个完全不同的 A、B 两个数据最后定位到的位置是一模一样的。

这时拿 B 进行查询时那自然就是误报了。

删除数据也是同理,当我把 B 的数据删除时,其实也相当于是把 A 的数据删掉了,这样也会造成后续的误报。

基于以上的 Hash 冲突的前提,所以 Bloom Filter 有一定的误报率,这个误报率和 Hash 算法的次数 H,以及数组长度 L 都是有关的。

自己实现一个布隆过滤

算法其实很简单不难理解,于是利用 Java 实现了一个简单的雏形

  1. 首先初始化了一个 int 数组。
  2. 写入数据的时候进行三次 hash 运算,同时把对应的位置置为 1。
  3. 查询时同样的三次 hash 运算,取到对应的值,一旦值为 0 ,则认为数据不存在。

实现逻辑其实就和上文描述的一样。

下面来测试一下,同样的参数:

从运行结果中可以看出已经实现了从一千万数据中判断出了查找的数据是否存在。以上就是布隆过滤器的核心思想。

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

手机游戏排行榜,特斯拉新泽西州一超级充电站起火 起火原因尚不清楚-雷火电竞csgo

  • 免费小说,【最美奋斗者】 跑出大飞机工作的第一棒-雷火电竞csgo

    免费小说,【最美奋斗者】 跑出大飞机工作的第一棒-雷火电竞csgo

  • 传统文化,“郭嘉不死,卧龙不出”,郭嘉是“天亡”,仍是“人亡”-雷火电竞csgo

    传统文化,“郭嘉不死,卧龙不出”,郭嘉是“天亡”,仍是“人亡”-雷火电竞csgo

  • 天赢居新浪博客,不由得玩手机怎么办,创业公司把手机锁起来,手机上瘾的创业商机-雷火电竞csgo

    天赢居新浪博客,不由得玩手机怎么办,创业公司把手机锁起来,手机上瘾的创业商机-雷火电竞csgo

  • 一花一世界一叶一菩提是什么意思,今晚发?苹果16英寸Macbook Pro偷跑:痛点全部晋级-雷火电竞csgo

    一花一世界一叶一菩提是什么意思,今晚发?苹果16英寸Macbook Pro偷跑:痛点全部晋级-雷火电竞csgo

  •   据发表,

  • 喜羊羊与灰太狼,阿里巴巴向香港交易所提交上市请求 出售新发行5亿股普通股新股-雷火电竞csgo

  • 女人的胸,落枕了怎么办-雷火电竞csgo

    女人的胸,落枕了怎么办-雷火电竞csgo

  • 最近发表

    雷火电竞csgo_雷火电竞2_雷火竞猜

    http://www.myriaresearch.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品