算法<初级> - 第三章 布隆过滤器、一致性哈希等相关问题

算法第三章

布隆过滤器

  • 海量数据管理,在哈希表上再压缩数据,但会存在较低的失误率

    • 失误类型:宁可错杀三千不可错放一个,非存储数据小概率判断为存储数据
  • bit位数组存储:eg. int数组每位存储0~31位bit数组
  • 思想:准备k个哈希函数,哈希值取模bit数组大小m,每个键经过记录得到k个哈希值范围[0,m-1],将bit数组k个哈希值的对应位置1。查表时,若是查询键中非全部哈希置位为1,则未被记录。
    • 若是k个值有重复,则仍然置1,多余的不变
    • 所有键共用一个bit数组
    • 在bit数组映射整型数组的值:n_bit/32(int范围)%32
  • 布隆过滤器大小与失误率(要求)、样本数有关 - 小数向上取整
    • \(m = - \frac{n * ln^{p}}{({ln^{2})}^2}\)
  • 哈希函数多少与布隆过滤器大小,样本数有关 - 小数向上取整
    • \(k={ln}^{2} * \frac{m}{n}\)
  • 真实失误率
    • \(p_{real}={(1-{e}^{-\frac{n * k}{m}})}^k\)

一致性哈希

  • 负载均衡结构:哈希key返回value,取哈希域模线性映射,均匀分布各个站点

    • 问题:范围改变时需要重新映射,迁移代价过高
  • 一致性哈希结构:哈希key返回value, 不取模哈希域为环,根据哈希值分布在环上往后最近站点(二分查找往后最近站点)
    • 添加站点时,只需要在后站点往新站点进行数据迁移(删除站点时同理)
    • 问题①:当数据少量的时候无法保证负载均衡
    • 问题②:当添加 / 删除站点的时候可能无法保证负载均衡
      • 解决:使用虚拟节点技术
      • 将虚拟节点均匀分配给实际站点,数据哈希值分布在虚拟节点上

题目一:随时找到数据流的中位数

  • 题目:有一个不断吐整数的数据流,假设有足够的空间来存储。设计一个MedianHolder结构,它可以随时取得之前吐出所有数的中位数。
  • 要求:结构加入新数的复杂度为O(logn);取中位数的时间复杂度O(1)
  • 思想:
    • 根据要求可以想到使用大小根堆来实现,中位数是在有序序列正中间,将数据流吐数分成两部分,元素个数相差不超过1,左边大根堆,右边小根堆
    • 进来的第一个数默认放在大根堆。之后进来的数先跟大根堆堆顶进行比较 - 若是比之小,则加入大根堆;若是比之大,则加入小根堆
    • 当大根堆与小根堆元素个数相差超过1时,多的堆弹出堆顶元素加入另一个堆

未完待续

原文地址:https://www.cnblogs.com/ymjun/p/12202547.html

时间: 2024-10-10 12:05:08

算法<初级> - 第三章 布隆过滤器、一致性哈希等相关问题的相关文章

算法&lt;初级&gt; - 第五章 递归与动规相关问题(完结)

算法<初级> - 第五章 递归与动规相关问题(完结) <一>递归和动态规划 暴力递归 转化为规模缩小了的同问题的子问题 - 时间复杂度O(2n-1) 有明确的边界条件(base case) - 先写base case,再写问题递归的过程 有得到子问题结果后决策过程 不记录每个子问题的解 - 每次求解子问题都交给递归去解决,不会在全局保存子问题的解(与动规形成对比) 动态规划DP 从暴力递归中延申 - 过程中还经历过<记忆化搜索>,相当于暴力递归+cache缓存(用has

算法导论 第三章 and 第四章 python

第三章 渐进的基本O().... 常用函数 % 和  // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法):猜测一个(靠经验)--数学归纳法 ·2:递归树法:画树p31[第3版中文]p51->递归式--证明 3:主方法: 快速,有些地方不能涉及,递归式不易写出 4.1最大数组问题 分治法: 1.A[low ,mid]  2.A[mid+1, high] 3.包含mid中间(想左和右分别遍历组合找出最大)

《算法》第三章部分程序 part 5

? 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 1 package package01; 2 3 import java.util.NoSuchElementException; 4 import java.util.TreeMap; 5 import edu.princeton.cs.algs4.StdIn; 6 import edu.princeton.cs.algs4.StdOut; 7 8 public class class

《算法》第三章部分程序 part 6

? 书中第三章部分程序,加上自己补充的代码,包含双向索引表.文建索引.稀疏向量类型 ● 双向索引表 1 package package01; 2 3 import edu.princeton.cs.algs4.ST; 4 import edu.princeton.cs.algs4.Queue; 5 import edu.princeton.cs.algs4.In; 6 import edu.princeton.cs.algs4.StdIn; 7 import edu.princeton.cs.a

《算法》第三章部分程序 part 4

? 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 1 package package01; 2 3 import edu.princeton.cs.algs4.Queue; 4 import edu.princeton.cs.algs4.SequentialSearchST; 5 import edu.princeton.cs.algs4.StdIn; 6 import edu.princeton.cs.algs4.StdOut; 7 8 public class

算法导论 第三章 函数的增长

//参考博文:http://blog.csdn.net/so_geili/article/details/53353593 //1.渐近效率: A:指的是当输入规模无限增加时,在极限中,算法的运行时间如何随着输入规模的变大而增加 B:通常,渐近的表示某个算法对除很小的输入外的所有情况都将是最好的选择 //2.Θ记号的数学含义: A:方式一:设f(n)和g(n)是定义域为自然数集合的函数.如果limn→∞f(n)/g(n)存在,并且等于某个常数c(c>0) 那么f(n)=Θ(g(n)).通俗理解为

Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法

本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法微信公众号:geekkr</br></br></br> 一.求和式 # 假设有一函数为f(),则在Python中经常使用的求和方法如下. sum(f(i) for i in range(m, n+1)) + sum(g(i) for i in range(m, n+1)) sum(f(i)+g(i) for i in range(m, n+1)) </br>二.递归式 # 举个栗子 def S(se

算法导论 第三章 函数的成长

渐近符号 Θ记号 Θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有n>=n0,都有0<=c1g(n)<=f(n)<=c2g(n)} 重点: 1.f(n)是Θ(g(n))的成员,至于f(n)=Θ(g(n))这种写法的原因后面会知道 2.根据P26可知,g(n) 是f(n)的一个渐进紧确界 3.当n足够大的时候,f(n)非负 O符号 O(g(n))={f(n):存在正常量c和n0,使得对所有n>=n0,有0<=f(n)<=cg(n)} 重点: 1.Θ

2018/11/29 算法时空(2) 算法导论第三章 函数的增长

渐进记号: O记号: 欧米茄记号: 注意: O记号是复杂度函数的上限, 欧米茄记号是复杂度函数的下限. 等式/不等式渐进记号: 极限的定义: 通过极限的方法, 来求复杂度函数. 当极限的值是一个大于零的函数的时候, 这说明法f(x)函数和g(x)函数的复杂度在一个数量级. 此时使用渐进符号. 此时可以使用大O记号表示渐进函数的上界, 使用欧米茄符号表示渐进函数的下界 如果极限的值等于零, 表示分母的函数增长的比分子的函数增长的更快, 此时引入小o记号, 表示g(x)的复杂度增长的非常的快, 远比