mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-25 02:27:10 +08:00
Merge pull request #2066 from paigeman/paigeman-patch-1
chore: fix some error and make some improvement
This commit is contained in:
commit
ff42962019
@ -22,7 +22,7 @@ tag:
|
||||
|
||||
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
|
||||
|
||||
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 kb ≈ 122kb 的空间。
|
||||
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
|
||||
|
||||

|
||||
|
||||
@ -265,6 +265,8 @@ root@21396d02c252:/data# redis-cli
|
||||
127.0.0.1:6379>
|
||||
```
|
||||
|
||||
**注意:当前rebloom镜像已经被废弃,官方推荐使用[redis-stack](https://hub.docker.com/r/redis/redis-stack)**
|
||||
|
||||
### 常用命令一览
|
||||
|
||||
> 注意:key : 布隆过滤器的名称,item : 添加的元素。
|
||||
@ -274,11 +276,11 @@ root@21396d02c252:/data# redis-cli
|
||||
3. **`BF.EXISTS`** : 确定元素是否在布隆过滤器中存在。格式:`BF.EXISTS {key} {item}`。
|
||||
4. **`BF.MEXISTS`**:确定一个或者多个元素是否在布隆过滤器中存在格式:`BF.MEXISTS {key} {item} [item ...]`。
|
||||
|
||||
另外, `BF. RESERVE` 命令需要单独介绍一下:
|
||||
另外, `BF.RESERVE` 命令需要单独介绍一下:
|
||||
|
||||
这个命令的格式如下:
|
||||
|
||||
`BF. RESERVE {key} {error_rate} {capacity} [EXPANSION expansion]` 。
|
||||
`BF.RESERVE {key} {error_rate} {capacity} [EXPANSION expansion]` 。
|
||||
|
||||
下面简单介绍一下每个参数的具体含义:
|
||||
|
||||
|
@ -33,7 +33,7 @@ tag:
|
||||
|
||||
有小伙伴可能会想到用有序数组,初始化一个有序数组时间复杂度是 `O(nlog(n))`,查找最大值或者最小值时间复杂度都是 `O(1)`,但是,涉及到更新(插入或删除)数据时,时间复杂度为 `O(n)`,即使是使用复杂度为 `O(log(n))` 的二分法找到要插入或者删除的数据,在移动数据时也需要 `O(n)` 的时间复杂度。
|
||||
|
||||
**相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。** 因为堆是基于完全二叉树实现的,所以在插入和删除数据时,只需要在二叉树中上下移动节点,时间复杂度为 `O(log(n))`,相比有序数组的 `O(n)`,效率更高。而最大值或最小值的获取,则是堆的另一个优势,时间复杂度为 `O(1)`,相比有序数组的 `O(log(n))`,更快速。
|
||||
**相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。** 因为堆是基于完全二叉树实现的,所以在插入和删除数据时,只需要在二叉树中上下移动节点,时间复杂度为 `O(log(n))`,相比有序数组的 `O(n)`,效率更高。
|
||||
|
||||
不过,需要注意的是:Heap 初始化的时间复杂度为 `O(n)`,而非`O(nlogn)`。
|
||||
|
||||
|
@ -295,7 +295,7 @@ myStack.pop();//报错:java.lang.IllegalArgumentException: Stack is empty.
|
||||
顺序队列中,我们说 `front==rear` 的时候队列为空,循环队列中则不一样,也可能为满,如上图所示。解决办法有两种:
|
||||
|
||||
1. 可以设置一个标志变量 `flag`,当 `front==rear` 并且 `flag=0` 的时候队列为空,当`front==rear` 并且 `flag=1` 的时候队列为满。
|
||||
2. 队列为空的时候就是 `front==rear` ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:`(rear+1) % QueueSize= front` 。
|
||||
2. 队列为空的时候就是 `front==rear` ,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,如下图所示,那么现在判断队列是否为满的条件就是:`(rear+1) % QueueSize==front` 。
|
||||
|
||||
### 4.3. 常见应用场景
|
||||
|
||||
|
@ -406,7 +406,8 @@ done
|
||||
|
||||
```shell
|
||||
#!/bin/bash
|
||||
for((i=1;i<=5;i++));do
|
||||
length=5
|
||||
for((i=1;i<=length;i++));do
|
||||
echo $i;
|
||||
done;
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user