File tree Expand file tree Collapse file tree 4 files changed +9
-6
lines changed
Expand file tree Collapse file tree 4 files changed +9
-6
lines changed 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