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 值, 直到得出满意的误判率

  • 相关阅读:
    Ui——创建视图的方法及过程
    iOS设计模式----原型模式
    浅谈OC中排序的方法
    Solid Dominoes Tilings (轮廓线dp打表 + 容器)
    Shell Necklace (dp递推改cdq分治 + fft)
    Rigid Frameworks (画图二分图规律 + DP + 数学组合容斥)
    PowMod (欧拉推式子 + 指数循环节)
    Necklace (全排列 + 匈牙利)
    GCD (RMQ + 二分)
    Game (思维)
  • 原文地址:https://www.cnblogs.com/zemliu/p/4337660.html
Copyright © 2011-2022 走看看