File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2222
2323布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
2424
25- Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。
25+ Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
2626
2727![ 位数组] ( https://oss.javaguide.cn/github/javaguide/cs-basics/algorithms/bloom-filter-bit-table.png )
2828
@@ -265,6 +265,8 @@ root@21396d02c252:/data# redis-cli
265265127.0.0.1:6379>
266266```
267267
268+ ** 注意:当前rebloom镜像已经被废弃,官方推荐使用[ redis-stack] ( https://hub.docker.com/r/redis/redis-stack ) **
269+
268270### 常用命令一览
269271
270272> 注意:key : 布隆过滤器的名称,item : 添加的元素。
@@ -274,11 +276,11 @@ root@21396d02c252:/data# redis-cli
2742763 . ** ` BF.EXISTS ` ** : 确定元素是否在布隆过滤器中存在。格式:` BF.EXISTS {key} {item} ` 。
2752774 . ** ` BF.MEXISTS ` ** :确定一个或者多个元素是否在布隆过滤器中存在格式:` BF.MEXISTS {key} {item} [item ...] ` 。
276278
277- 另外, ` BF. RESERVE ` 命令需要单独介绍一下:
279+ 另外, ` BF.RESERVE ` 命令需要单独介绍一下:
278280
279281这个命令的格式如下:
280282
281- ` BF. RESERVE {key} {error_rate} {capacity} [EXPANSION expansion] ` 。
283+ ` BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion] ` 。
282284
283285下面简单介绍一下每个参数的具体含义:
284286
Original file line number Diff line number Diff line change 3333
3434有小伙伴可能会想到用有序数组,初始化一个有序数组时间复杂度是 ` O(nlog(n)) ` ,查找最大值或者最小值时间复杂度都是 ` O(1) ` ,但是,涉及到更新(插入或删除)数据时,时间复杂度为 ` O(n) ` ,即使是使用复杂度为 ` O(log(n)) ` 的二分法找到要插入或者删除的数据,在移动数据时也需要 ` O(n) ` 的时间复杂度。
3535
36- ** 相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。** 因为堆是基于完全二叉树实现的,所以在插入和删除数据时,只需要在二叉树中上下移动节点,时间复杂度为 ` O(log(n)) ` ,相比有序数组的 ` O(n) ` ,效率更高。而最大值或最小值的获取,则是堆的另一个优势,时间复杂度为 ` O(1) ` ,相比有序数组的 ` O(log(n)) ` ,更快速。
36+ ** 相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。** 因为堆是基于完全二叉树实现的,所以在插入和删除数据时,只需要在二叉树中上下移动节点,时间复杂度为 ` O(log(n)) ` ,相比有序数组的 ` O(n) ` ,效率更高。
3737
3838不过,需要注意的是:Heap 初始化的时间复杂度为 ` O(n) ` ,而非` O(nlogn) ` 。
3939
Original file line number Diff line number Diff line change @@ -295,7 +295,7 @@ myStack.pop();//报错:java.lang.IllegalArgumentException: Stack is empty.
295295顺序队列中,我们说 ` front==rear ` 的时候队列为空,循环队列中则不一样,也可能为满,如上图所示。解决办法有两种:
296296
2972971 . 可以设置一个标志变量 ` flag ` ,当 ` front==rear ` 并且 ` flag=0 ` 的时候队列为空,当` front==rear ` 并且 ` flag=1 ` 的时候队列为满。
298- 2 . 队列为空的时候就是 ` front==rear ` ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:` (rear+1) % QueueSize= front ` 。
298+ 2 . 队列为空的时候就是 ` front==rear ` ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:` (rear+1) % QueueSize== front ` 。
299299
300300### 4.3. 常见应用场景
301301
Original file line number Diff line number Diff line change 406406
407407``` shell
408408#! /bin/bash
409- for(( i= 1 ;i<= 5 ;i++ )) ; do
409+ length=5
410+ for(( i= 1 ;i<= length;i++ )) ; do
410411 echo $i ;
411412done ;
412413```
You can’t perform that action at this time.
0 commit comments