zoukankan      html  css  js  c++  java
  • 布隆过滤器

    参照 : http://billmill.org/bloomfilter-tutorial/

    简介

    布隆过滤器是一个用来判断某元素是否在全集中的工具.

    实际上它是一个有 m 个槽的位图, 他拥有 k 个 hash 函数, 每个元素进来的时候会通过 k 个 hash 函数映射到任意 k 个槽中, 并将槽置为 1.

    当需要判断某元素是否在过滤器中, 则通过 k 个 hash 函数 hash 过后看对应的槽是否为 1, 如果是, 则可能存在 (因为这些 1 可能是别的元素填充的), 如果有任意一个槽不为 1, 则必定不在过滤器中.

    复杂度

    由于有 k 个 hash 函数, 所以布隆过滤器的插入和查询复杂度都为 O(k), 而空间复杂度则难以计算, 一个是依赖你设置的 m 的大小, 另外一个是要看输入元素在 hash 后在过滤器中的稀疏程度

    过大的 k 会导致时间复杂度上升, 而过小的 k 则会导致误判率上升, 例如 k = 1, 则退化成了只有一个 hash 函数的 hash table.

    优点

    它的优势在于不需要想 hashSet 或者 hashTable 那样存储实际的元素, 从而节省了空间, 同时又在你可以接受的误判范围内判断出元素是否在集合中. 

    计算方法

    布隆过滤器的误判率是可以计算的, 假设元素的全集个数为 n, 过滤器槽为 m, 共有 k 个函数, 那么误判率为 (1-e-kn/m)k

    而最优的 k 值也是可以计算的, 公式为 (m/n)ln(2), 所以, 我们可以根据如下步骤来判定布隆过滤器的初始化大小 m

    1. 决定你的元素输入个数 n 的大概值

    2. 为 m 选一个值

    3. 通过公式计算 k 的值

    4. 通过公式计算 误判率, 假如不满意, 则回到 2. 重新选择 m 值, 直到得出满意的误判率

  • 相关阅读:
    python的json模块介绍
    采用boosting思想开发一个解决二分类样本不平衡的多估计器模型
    kappa系数
    android服务
    Android Studio 无法预览布局问题:com/android/util/PropertiesMap
    pitch yaw roll是什么
    keil5破解
    Eclipse/jre/jdk/jvm
    传感器
    Java静态代码块
  • 原文地址:https://www.cnblogs.com/zemliu/p/4337660.html
Copyright © 2011-2022 走看看