数据结构笔记:B-树,Splay树,Trie树

[size=large]B-树:[/size]

1. 所有叶子节点在同一层

2. 对于m阶的B-树,除了根节点有2到m个孩子外,每个内节点有ceil(m/2)到m个孩子,或者说有ceil(m/2)-1到m-1个pairs。

3. level≤log ceil(m/2) (N+1)/2, ceil(m/2)是下标

4.

[table]

||Insert|Delete

|Average Disk Accesses|h+1|h+4

|Worst-case Disk Accesses|3h+1|3h

[/table]

Worst-case Disk Accesses-Insert:假设有足够的内存存放h个节点。自上往下寻找插入点需要读取h次,自下往上剪枝拆分节点需要存取2s+1次(s是被拆分的节点数),因此存取磁盘h+2s+1次,最大值为3h+1.

Worst-case Disk Accesses-Delete: 假设有足够的内存存放h个节点。自上往下寻找删除节点需要读取h次,自下往上访问兄弟节点来寻找可借用节点需要读取h-1次,同时合并节点需要写入h-2次,而在根节点时需要三次存取(两次访问兄弟节点是否可被借用,一次写入根)。

[size=large]R-树:[/size]

1.从B+树变化而来,用来组织管理磁盘中被使用的数据块。

2.非长方形的数据块,使用最小可能的长方形(minimum bounding rectangles, MBRs)表示。

3.M阶的R-树的每个内结点(除根外)有m到M个子结点,其中m≤ceil(M/2);根节点有1到M个子结点。每个索引结点与其孩子具有相同的子结点数目。

4.所有叶子结点在同一层中。

5.R+树在进行插入删除等操作时,需要考虑所有可能情况,从而得到相对较优的解。

6.R+树从R-树变化而来,不同之处在于,内结点不相互覆盖,没有子结点数目的限制,数据结点大小没有限制。由于内结点不相互覆盖,可能发生同一个数据对象被切割分别存储在不同的数据结点中,这也是为什么内结点没有限制子结点数目。

7.Cell Tree是将[url=http://wfxbeijing-163-com.iteye.com/blog/841558]BSP树[/url]和R+树组合到一起。内结点没有相互覆盖的凸多面体,数据结点大小没有上下界,内结点的孩子数目有下界没有上界。

[size=large]Splay树(伸展树):[/size]

1. Splay节点是每种操作停止的节点。如,插入时发现已存在该节点,已存在的节点就是Splay节点;删除时把删除内节点转换成了删除叶子节点,物理意义上被删除的叶子节点的父节点才是Splay节点(因为子节点被删除了所以不是子节点,或者说最后操作的是父节点)。

2. 所有操作的实际复杂度为O(n),平摊复杂度为O(log n)。

3. Splay树所做的假设是,刚被存取过的节点近期再次存取的概率很高。对于无规律存取的应用,效率不高。

4. 由于Splay操作的目的是将Splay节点移到根节点,有些rotation是无谓的操作,且会变换节点顺序,而递归在某些特殊设计中可能不安全,会遇到递归桟溢出等现象。因此Top-down(自顶向下)Splay树可以解决这个问题,思想是将Splay节点的所有祖先节点按大小分成两棵树,然后在与Splay节点合并,令Splay节点成为根。

[size=large]Trie树[/size]:

1.Trie树用自根节点向下的整个通路(path)来表示数据,而不是某个特定节点包含了全部信息。对于数据相似度高的数据集,可以节省很多空间;一般应用于字符串集。

2.Compressed Binary Tries: 在Binary Tries(阶为2)的基础上增加一个域bit#,用于存储其左右子树分叉的位置是从关键字(key)的第几个bit。Compressed Binary Trie的孩子数是0或2,因为单个的子节点可以跟父节点合并,并让bit#增加1.

3.高阶Trie(High Order Tries)是阶大于2的Trie. 压缩高阶Trie就是将Compressed Binary Tries中的bit#域改为char#(其实是一个东西),并将孩子数从2扩展为m。下图中的#ptr用于存储节点中空指针的数目,个人觉得这个域并不会对提高效率产生明显影响。

4.Multibit Tries: 用于表示不同长度的字符串集,即用大于1 bit的比较来决定一个节点之后的分叉。最常用于路由器中路由表的实现,如:IP地址为11*作为父节点,1101*,1110*和1111*的不同分叉用2bits决定不同路由策略。该数据结构分两种,固定步长(fixed-Stride)和可变步长(variable-stride),步长就是用于决定分叉的bit长度,需要用动态规划算法来决定最优的步长。

Binary Tries:

[img]http://dl.iteye.com/upload/picture/pic/78042/17839d01-a0da-31eb-b6a7-9f9347c047ea.png[/img]

Compressed Binary Tries:

[img]http://dl.iteye.com/upload/picture/pic/78044/4926a608-0e91-36a6-9a32-a42f3c62e5f7.png[/img]

Compressed High Order Tries:

[img]http://dl.iteye.com/upload/picture/pic/78046/e1793613-62b1-3cf6-a85f-79ad98dbaaf5.png[/img]

Multibit Tries:

[img]http://dl.iteye.com/upload/picture/pic/78048/bcb540db-2249-3cee-95e6-4b85dafc83a1.png[/img]

    原文作者:Trie树
    原文地址: https://blog.csdn.net/iteye_19130/article/details/81972160
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞