Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions docs/cs-basics/data-structure/bloom-filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 kb122kb 的空间。
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB122KB 的空间。

![位数组](https://oss.javaguide.cn/github/javaguide/cs-basics/algorithms/bloom-filter-bit-table.png)

Expand Down Expand Up @@ -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 : 添加的元素。
Expand All @@ -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]` 。

下面简单介绍一下每个参数的具体含义:

Expand Down
2 changes: 1 addition & 1 deletion docs/cs-basics/data-structure/heap.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)`。

Expand Down
2 changes: 1 addition & 1 deletion docs/cs-basics/data-structure/linear-data-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. 常见应用场景

Expand Down
3 changes: 2 additions & 1 deletion docs/cs-basics/operating-system/shell-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
```
Expand Down