Skip to content

Commit 3c7f5ab

Browse files
committed
Add codecog for latex
1 parent e9a10d0 commit 3c7f5ab

15 files changed

Lines changed: 283 additions & 382 deletions

docs/README.md

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
# 算法笔记
2-
>注意, 目前 github 上的文档不支持 latex 数学公式渲染
3-
所以如果想有较好的阅读体验, 可以移步到[我的博客](https://mbinary.xyz)
4-
5-
# 索引
6-
* [.](.)
7-
* [algorithm-general.md](./algorithm-general.md)
8-
* [b-tree.md](./b-tree.md)
9-
* [fib-heap.md](./fib-heap.md)
10-
* [graph.md](./graph.md)
11-
* [hashTable.md](./hashTable.md)
12-
* [red-black-tree.md](./red-black-tree.md)
13-
* [sort.md](./sort.md)
14-
* [tree.md](./tree.md)
1+
# 笔记
2+
* [algorithm-general.md](./algorithm-general.html)
3+
* [b-tree.md](./b-tree.html)
4+
* [fib-heap.md](./fib-heap.html)
5+
* [graph.md](./graph.html)
6+
* [hashTable.md](./hashTable.html)
7+
* [red-black-tree.md](./red-black-tree.html)
8+
* [sort.md](./sort.html)
9+
* [tree.md](./tree.html)

docs/algorithm-general.md

Lines changed: 55 additions & 71 deletions
Large diffs are not rendered by default.

docs/b-tree.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ description:
3232
# 1. 背景
3333
当有大量数据储存在磁盘时,如数据库的查找,插入, 删除等操作的实现, 如果要读取或者写入, 磁盘的寻道, 旋转时间很长, 远大于在 内存中的读取,写入时间.
3434

35-
平时用的二叉排序树搜索元素的时间复杂度虽然是 $O(log_2n)$的, 但是底数还是太小, 树高太高.
35+
平时用的二叉排序树搜索元素的时间复杂度虽然是 ![](https://latex.codecogs.com/gif.latex?O(log_2n))的, 但是底数还是太小, 树高太高.
3636

3737
所以就出现了 B 树(英文为B-Tree, 不是B减树), 可以理解为多叉排序树. 一个结点可以有多个孩子, 于是增大了底数, 减小了高度, 虽然比较的次数多(关键字数多), 但是由于是在内存中比较, 相较于磁盘的读取还是很快的.
3838
<a id="markdown-2-定义" name="2-定义"></a>
3939
# 2. 定义
4040
度为 **d**(degree)的 B 树(阶(order) 为 2d) 定义如下,
41-
0. 每个结点中包含有 n 个关键字信息: $(n,P_0,K_1,P_1,K_2,\ldots,K_n,P_n)$。其中:
42-
a) $K_i$为关键字,且关键字按顺序升序排序 $K_{i-1}< K_i$
43-
b) $P_i$ 为指向子树根的接点, $K_{i-1}<P(i-1) < Ki$
44-
c) 关键字的数 n 满足(由此也确定了孩子结点的个数): $d-1\leqslant n \leqslant 2d-1$ (根节点可以少于d-1)
41+
0. 每个结点中包含有 n 个关键字信息: ![](https://latex.codecogs.com/gif.latex?(n,P_0,K_1,P_1,K_2,\ldots,K_n,P_n))。其中:
42+
a) ![](https://latex.codecogs.com/gif.latex?K_i)为关键字,且关键字按顺序升序排序 ![](https://latex.codecogs.com/gif.latex?K_{i-1}<&space;K_i)
43+
b) ![](https://latex.codecogs.com/gif.latex?P_i) 为指向子树根的接点, ![](https://latex.codecogs.com/gif.latex?K_{i-1}<P(i-1)&space;<&space;Ki)
44+
c) 关键字的数 n 满足(由此也确定了孩子结点的个数): ![](https://latex.codecogs.com/gif.latex?d-1\leqslant&space;n&space;\leqslant&space;2d-1) (根节点可以少于d-1)
4545

4646
1. 树中每个结点最多含有 2d个孩子(d>=2);
4747
2. 除根结点和叶子结点外,其它每个结点至少有 d个孩子;
@@ -50,7 +50,7 @@ description:
5050

5151

5252
性质:
53-
$h\leq \left\lfloor \log _{d}\left({\frac {n+1}{2}}\right)\right\rfloor .$
53+
![](https://latex.codecogs.com/gif.latex?h\leq&space;\left\lfloor&space;\log&space;_{d}\left({\frac&space;{n+1}{2}}\right)\right\rfloor&space;.)
5454

5555
如下是 度为2的 B 树, 每个结点可能有2,3或4 个孩子, 所以也叫 2,3,4树, 等价于[红黑树](https://mbinary.xyz/red-black-tree.html#more)
5656
![](https://upload-images.jianshu.io/upload_images/7130568-30342360fb9674b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
@@ -82,9 +82,9 @@ $h\leq \left\lfloor \log _{d}\left({\frac {n+1}{2}}\right)\right\rfloor .$
8282
<a id="markdown-4-插入操作" name="4-插入操作"></a>
8383
# 4. 插入操作
8484
自顶向下地进行插入操作, 最终插入在叶子结点,
85-
考虑到叶子结点如果有 2t-1 $(k_1,k_2,\ldots,k_{2t-1})$个 关键字, 则需要进行分裂,
85+
考虑到叶子结点如果有 2t-1 ![](https://latex.codecogs.com/gif.latex?(k_1,k_2,\ldots,k_{2t-1}))个 关键字, 则需要进行分裂,
8686

87-
一个有 2t-1$(k_1,k_2,\ldots,k_{2t-1})$个关键字 结点分裂是这样进行的: 此结点分裂为 两个关键字为 t-1个的结点, 分别为 $(k_1,k_2,\ldots,k_{t-1})$, $(k_{t+1},k_{t+2},\ldots,k_{2t-1})$, 然后再插入一个关键字$k_t$到父亲结点.
87+
一个有 2t-1![](https://latex.codecogs.com/gif.latex?(k_1,k_2,\ldots,k_{2t-1}))个关键字 结点分裂是这样进行的: 此结点分裂为 两个关键字为 t-1个的结点, 分别为 ![](https://latex.codecogs.com/gif.latex?(k_1,k_2,\ldots,k_{t-1})), ![](https://latex.codecogs.com/gif.latex?(k_{t+1},k_{t+2},\ldots,k_{2t-1})), 然后再插入一个关键字![](https://latex.codecogs.com/gif.latex?k_t)到父亲结点.
8888

8989
注意同时要将孩子指针移动正确.
9090

@@ -125,7 +125,7 @@ $h\leq \left\lfloor \log _{d}\left({\frac {n+1}{2}}\right)\right\rfloor .$
125125
* 删除结点在叶子结点上
126126
1. 结点内的关键字个数大于d-1,可以直接删除(大于关键字个数下限,删除不影响 B - 树特性)
127127
2. 结点内的关键字个数等于d-1(等于关键字个数下限,删除后将破坏 特性),此时需观察该节点左右兄弟结点的关键字个数:
128-
a. **旋转**: 如果其左右兄弟结点中存在关键字个数大于d-1 的结点,则从关键字个数大于 d-1 的兄弟结点中借关键字:**(这里看了网上的很多说法, 都是在介绍关键字的操作,而没有提到孩子结点. 我实现的时候想了很久才想出来: 借关键字时, 比如从右兄弟借一个关键字(第一个$k_1$), 此时即为左旋, 将父亲结点对应关键字移到当前结点, 再将右兄弟的移动父亲结点(因为要满足排序性质, 类似二叉树的选择) 然后进行孩子操作, 将右兄弟的$p_0$ 插入到 当前结点的孩子指针末尾) 左兄弟类似, <mark>而且要注意到边界条件, 比如当前结点是第0个/最后一个孩子, 则没有 左兄弟/右兄弟</mark>**)
128+
a. **旋转**: 如果其左右兄弟结点中存在关键字个数大于d-1 的结点,则从关键字个数大于 d-1 的兄弟结点中借关键字:**(这里看了网上的很多说法, 都是在介绍关键字的操作,而没有提到孩子结点. 我实现的时候想了很久才想出来: 借关键字时, 比如从右兄弟借一个关键字(第一个![](https://latex.codecogs.com/gif.latex?k_1)), 此时即为左旋, 将父亲结点对应关键字移到当前结点, 再将右兄弟的移动父亲结点(因为要满足排序性质, 类似二叉树的选择) 然后进行孩子操作, 将右兄弟的![](https://latex.codecogs.com/gif.latex?p_0) 插入到 当前结点的孩子指针末尾) 左兄弟类似, <mark>而且要注意到边界条件, 比如当前结点是第0个/最后一个孩子, 则没有 左兄弟/右兄弟</mark>**)
129129

130130
b. **合并**: 如果其左右兄弟结点中不存在关键字个数大于 t-1 的结点,进行结点合并:将其父结点中的关键字拿到下一层,与该节点的左右兄弟结点的所有关键字合并
131131
<mark>**同样要注意到边界条件, 比如当前结点是第0个/最后一个孩子, 则没有 左兄弟/右兄弟**</mark>
@@ -335,7 +335,7 @@ B-TREE-SHIFT-TO-LEFT-CHILD(x,i,y,z)
335335
# 6. B+树
336336
B+ 树[^3]是 B- 树的变体,与B树不同的地方在于:
337337
1. 非叶子结点的子树指针与关键字个数相同;
338-
2. 非叶子结点的子树指针 $p_i$指向关键字值属于 $[k_i,k_{i+1})$ 的子树(B- 树是开区间);
338+
2. 非叶子结点的子树指针 ![](https://latex.codecogs.com/gif.latex?p_i)指向关键字值属于 ![](https://latex.codecogs.com/gif.latex?[k_i,k_{i+1})) 的子树(B- 树是开区间);
339339
3. 为所有叶子结点增加一个链指针;
340340
4. **所有关键字都在叶子结点出现**
341341

docs/fib-heap.md

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ description:
4040
# 2. 势函数
4141
下面用势函数来分析摊还代价, 如果你不明白, 可以看[摊还分析](https://www.jianshu.com/p/052fbe9d92a4)
4242

43-
$\Phi(H) = t(H) + 2m(h)$
43+
![](https://latex.codecogs.com/gif.latex?\Phi(H)&space;=&space;t(H)&space;+&space;2m(h))
4444
t 是根链表中树的数目,m(H) 表示被标记的结点数
4545

4646
最初没有结点
4747
<a id="markdown-3-最大度数" name="3-最大度数"></a>
4848
# 3. 最大度数
49-
结点的最大度数(即孩子数)$D(n)\leqslant \lfloor lgn \rfloor$, 证明放在最后
49+
结点的最大度数(即孩子数)![](https://latex.codecogs.com/gif.latex?D(n)\leqslant&space;\lfloor&space;lgn&space;\rfloor), 证明放在最后
5050
<a id="markdown-4-操作" name="4-操作"></a>
5151
# 4. 操作
5252
<a id="markdown-41-创建一个斐波那契堆" name="41-创建一个斐波那契堆"></a>
5353
## 4.1. 创建一个斐波那契堆
54-
$O(1)$
54+
![](https://latex.codecogs.com/gif.latex?O(1))
5555
<a id="markdown-42-插入一个结点" name="42-插入一个结点"></a>
5656
## 4.2. 插入一个结点
5757
```python
@@ -65,13 +65,11 @@ else:
6565
if H.min<nd: H.min = nd
6666
H.n +=1
6767
```
68-
$$
69-
\Delta \Phi = \Delta t(H) + 2\Delta m(H) = 1+0 = 1
70-
$$
71-
摊还代价为$O(1)$
68+
![](https://latex.codecogs.com/gif.latex?&space;\Delta&space;\Phi&space;=&space;\Delta&space;t(H)&space;+&space;2\Delta&space;m(H)&space;=&space;1+0&space;=&space;1&space;)
69+
摊还代价为![](https://latex.codecogs.com/gif.latex?O(1))
7270
<a id="markdown-43-寻找最小结点" name="43-寻找最小结点"></a>
7371
## 4.3. 寻找最小结点
74-
直接用 H.min, $O(1)$
72+
直接用 H.min, ![](https://latex.codecogs.com/gif.latex?O(1))
7573
<a id="markdown-44-合并两个斐波那契堆" name="44-合并两个斐波那契堆"></a>
7674
## 4.4. 合并两个斐波那契堆
7775
```python
@@ -81,7 +79,7 @@ def union(H1,H2):
8179
link H2.rootList to H1.rootList
8280
return H1
8381
```
84-
易知 $\Delta \Phi = 0$
82+
易知 ![](https://latex.codecogs.com/gif.latex?\Delta&space;\Phi&space;=&space;0)
8583
<a id="markdown-45-抽取最小值" name="45-抽取最小值"></a>
8684
## 4.5. 抽取最小值
8785
抽取最小值, 一定是在根结点, 然后将此根结点的所有子树的根放在 根结点双向循环链表中, 之后还要进行**树的合并. 以使每个根结点的度不同,**
@@ -126,7 +124,7 @@ def consolidate(H):
126124
if H.min ==None: H.min = i
127125
else if H.min>i: H.min = i
128126
```
129-
时间复杂度为$O(lgn)$ 即数组移动的长度, 而最多有 lgn个元素
127+
时间复杂度为![](https://latex.codecogs.com/gif.latex?O(lgn)) 即数组移动的长度, 而最多有 lgn个元素
130128

131129
<a id="markdown-46-关键字减值" name="46-关键字减值"></a>
132130
## 4.6. 关键字减值
@@ -166,5 +164,5 @@ extract-min(H)
166164
<a id="markdown-5-最大度数的证明" name="5-最大度数的证明"></a>
167165
# 5. 最大度数的证明
168166
这也是`斐波那契`这个名字的由来,
169-
$D(n)\leqslant \lfloor lgn \rfloor$
167+
![](https://latex.codecogs.com/gif.latex?D(n)\leqslant&space;\lfloor&space;lgn&space;\rfloor)
170168
![](https://upload-images.jianshu.io/upload_images/7130568-c9e0cd3be4e98c4b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

0 commit comments

Comments
 (0)