some modifications.

This commit is contained in:
Shine wOng
2019-12-14 13:41:13 +08:00
parent 5a73c717d0
commit 607e9a9872
3 changed files with 4 additions and 4 deletions

View File

@@ -210,7 +210,7 @@ void preOrder_It2(BinNodePosi(T) x, VST &visit){
所以中序遍历迭代版的算法如下:
```
```cpp
template <typename T>
void goAlongLeftBranch(BinNodePosi(T) x, Stack<BinNodePosi(T) &S){
while(x){

View File

@@ -3,7 +3,7 @@ Conclusion on Chapter Six: Graph
## 知识脉络
本章讨论图结构以及与之相关的算法。相对于前面的序列以及树图是一种更加一般的数据结构借助图理论上可以表示世界上所有事物以及它们之间的联系。一般地单向链表是入度和出度均为1的图二叉树是入度为1而出度不超过2的图。仿照前面对树的研究思路对图的研究主要是将图转化为一棵与之对应的树从而利用对的分析技巧来解决问题。
本章讨论图结构以及与之相关的算法。相对于前面的序列以及树图是一种更加一般的数据结构借助图理论上可以表示世界上所有事物以及它们之间的联系。一般地单向链表是入度和出度均为1的图二叉树是入度为1而出度不超过2的图。仿照前面对树的研究思路对图的研究主要是将图转化为一棵与之对应的树从而利用对的分析技巧来解决问题。
可以从遍历的角度将图转化为树,这里对应了两种遍历策略,即广度优先搜索和深度优先搜索。广度优先搜索总是优先访问更早访问的节点的邻居,而深度优先搜索却是优先访问最后访问节点的邻居。为了尽可能保存图结构中蕴含的信息,在遍历过程中要进行大量的标注工作,包括各个节点的发现时间`dtime`与访问时间`ftime`,各条边的类型(树边,跨边,前向边,后向边)以及父亲节点等。对于两种遍历何时应该标注何种情况,需要有清晰的理解才行,例如对于深度优先搜索,关键在于对`括号引理`的理解。
@@ -17,7 +17,7 @@ Conclusion on Chapter Six: Graph
+ 每一割的极短跨越边,都会被某一棵极小支撑树采用。
+ 对于某棵支撑树,如果它的每一边都是某割的极短跨越边,该树也未必就是一棵极小支撑树。
此时,`Prim`算法的正确性就显得有点似是而非。好在可以证明,`Prim`算法每一步生成的树`T_k`,都是某一棵极小支撑树的子树,从而证明得到`Prim`算法在允许多等权时仍然是正确的。
此时,`Prim`算法的正确性就显得有点似是而非。好在可以证明,`Prim`算法每一步生成的树`T_k`,都是某一棵极小支撑树的子树,从而证明得到`Prim`算法在允许多等权时仍然是正确的。
`Kruscal`算法也是基于贪心迭代策略的`最小生成树`的生成算法,在它的执行过程中主要涉及两个基本操作,即判断一条边连接的两个节点是否属于同一棵树,以及若不属于,则将这两棵树合并,因此利用一个并查集(`Union and Find Set`)可以方便地实现这些基本操作。`Kruscal`算法正确的证明也是类似于`Prim`正确性的证明。

View File

@@ -13,7 +13,7 @@ Conclusion on BST
`B树`是为了解决多级存储介质速度不匹配的问题而产生的一种数据结构。它的本质是`多路平衡搜索树`,实际上,将二叉树的多层次节点合并,即可构成一个`B树``超级节点`。对于`m``B树`,它的定义是除了根节点外,所有节点的分支数都介于$\left \lceil m/2 \right \rceil \sim m$的多路平衡搜索树,对于根节点,其分支数则介于$2 \sim m$之间。`B`树的搜索仍然是仿照`BST`的策略进行,为了维护`B树`的结构,需要对它的插入和删除算法进行一些分析。对于插入,有可能会导致内部节点的`上溢`,解决`上溢`的方法是对超级节点进行分裂(split),将`上溢`的超级节点一分为二,同时将它的中间值添加到父节点中,容易看出,这可能会将`上溢`传递给父节点,一旦`上溢`传递到根节点,`B树`的高度就会增加一个单位;对于删除操作,则可能导致`下溢`,解决`下溢`有两种方法,即`左顾右盼``合并`,其中`合并`操作有可能将`下溢`向父节点传递,一旦传递至根节点,会导致`B`树高度减小一个单位。
`红黑树`则具有更加奇怪的平衡条件(四条),实际上`红黑树``B树`具有非常紧密的联系——将红黑树的红色节点向上依附于黑色节点,就构成了一棵`2-4B树`,因此`红黑树`的黑色高度(black height, bh)即等于与之对应的`B树`的高度,这样`红黑树`的平衡性就不证自明了。对于`红黑树`的失衡调整算法的理解,关键也在于将它转化为等效的`B树`,通过`B树`的上溢和下溢调整算法来理解。
`红黑树`则具有更加奇怪的平衡条件(四条),实际上`红黑树``B树`具有非常紧密的联系——将红黑树的红色节点向上依附于黑色节点,就构成了一棵`2-4B树`,因此`红黑树`的黑色高度(black height, bh)即等于与之对应的`B树`的高度,这样`红黑树`的平衡性就不证自明了。对于`红黑树`的失衡调整算法的理解,关键也在于将它转化为等效的`B树`,通过`B树`的上溢和下溢调整算法来理解。
对于插入操作,可能会出现`双红缺陷`(double red),此时需要对被插入节点的叔父节点进行讨论,如果叔父为黑色节点,则做一次`3+4重构`即可,等效于`B树`中交换相邻的红黑节点的颜色;如果叔父的红色节点,则对应于`B树`中的`上溢`,此时只需要将祖父染成黑色,而将父节点和叔父节点都染成红色,即可在这一局部解决`双红缺陷`,但需要注意的是,`双红缺陷`可能在祖父节点再次出现。这对应了`B树`中解决`上溢``split`操作,分裂节点后可能导致上一层节点继续`上溢`