1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-10 00:41:37 +08:00

Compare commits

...

9 Commits

Author SHA1 Message Date
Guide
1a7541ae35
Merge pull request #2064 from kingstar718/patch-1
Update io-design-patterns.md
2023-07-01 16:49:06 +08:00
Guide
ff42962019
Merge pull request #2066 from paigeman/paigeman-patch-1
chore: fix some error and make some improvement
2023-07-01 16:46:55 +08:00
paigeman
7e5906ee40
Update bloom-filter.md 2023-07-01 12:41:16 +08:00
Richard Wu
051f0085be
Update io-design-patterns.md 2023-06-30 16:04:22 +08:00
Richard Wu
b971a23559
Update io-design-patterns.md
修正适配器英文
2023-06-30 15:56:23 +08:00
paigeman
df6911624e
Update bloom-filter.md 2023-06-30 10:29:52 +08:00
paigeman
b0d9eeb801
Update heap.md 2023-06-29 12:13:56 +08:00
paigeman
84c2fff6fd
Update linear-data-structure.md 2023-06-29 11:40:49 +08:00
paigeman
a843706890
Update shell-intro.md 2023-06-28 15:36:54 +08:00
5 changed files with 10 additions and 7 deletions

View File

@ -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 的空间。
![位数组](https://oss.javaguide.cn/github/javaguide/cs-basics/algorithms/bloom-filter-bit-table.png)
@ -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]` 。
下面简单介绍一下每个参数的具体含义:

View File

@ -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)`

View File

@ -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. 常见应用场景

View File

@ -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;
```

View File

@ -99,7 +99,7 @@ IO 流中的装饰器模式应用的例子实在是太多了,不需要特意
**适配器Adapter Pattern模式** 主要用于接口互不兼容的类的协调工作,你可以将其联想到我们日常经常使用的电源适配器。
适配器模式中存在被适配的对象或者类称为 **适配者(Adapter)** ,作用于适配者的对象或者类称为**适配器(Adapter)** 。适配器分为对象适配器和类适配器。类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
适配器模式中存在被适配的对象或者类称为 **适配者(Adaptee)** ,作用于适配者的对象或者类称为**适配器(Adapter)** 。适配器分为对象适配器和类适配器。类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
IO 流中的字符流和字节流的接口不同,它们之间可以协调工作就是基于适配器模式来做的,更准确点来说是对象适配器。通过适配器,我们可以将字节流对象适配成一个字符流对象,这样我们可以直接通过字节流对象来读取或者写入字符数据。