索引笔记摘要

 

  今天回顾了索引部分的内容,把一些觉得重要的东西写在这里,不对的地方请不吝指教。

 

  1、原始数据文件是主文件、索引数据组成的文件是索引文件;一个主文件可能会有多个索引文件,可以通过索引文件来索引具有相同辅码的若干记录

  2、稠密索引是指对每项记录都建立一个索引项,不要求数据的有序性等;但是稀疏索引是对已经排序好的记录进行索引,可以对一组记录建立一个索引项,且索引指针指向记录在磁盘中的初始地址

  3、一个二级索引的例子:总共有10000个记录,每个记录的索引是8个字节,每个磁盘的大小是1024字节,则需要8 * 10000 / 1024 = 79个磁盘才可以创建稠密索引,而这79个磁盘的索引可以再放到一个磁盘里面建立二级索引。比如一级索引的磁盘之间是有序的,那么只要在二级索引里面存每个磁盘块的最小记录就可以了。建立二级索引的意义在于,可以减少磁盘I/O的次数:上面这个例子就可以看出来,我们可以先在二级索引里面确定一个磁盘,直接读那个磁盘就可以了;而没有二级索引的话需要一个磁盘一个磁盘读过来。

  4、倒排索引:用属性值来建立一个索引文件,可以支持基于属性的高效检索,但是花费了保存倒排索引表的空间代价,降低了更新的效率;还有正文文件的倒排(词索引/全文索引)

  5、动态索引:B树/B+树

  6、B树定义:m阶B树是一颗m路查找树,每个结点里面可能有多个记录,k – 1个记录的结点有k个孩子结点。同时根节点至少有两个子树,非叶节点至少有floor(m/2)个子树,叶节点都在同一层,有floor(m/2) – 1到 m – 1个关键码。B树满足“BST”性质,每个结点的一般形式是(p0,k1,p1,k2,…,pn-1,kn,pn)即有n个元素的话就有n+1个指针指向n+1个孩子结点。

  7、B树查找过程,先把根结点的k1~kn找一遍,找到了就完事,否则就要找到对应指针,得到下一个结点,递归下去,如果最后的指针指向外部结点,就表示查找失败。

  8、B树插入时要注意保持其结构,所以可能要不断往上分裂,甚至分裂到根节点使得树高增加1。

  9、B树的删除操作时,如果待删除结点在叶子结点里面而且不会下溢出,则直接删除,否则需要考虑合并操作,向邻居借(结点比较多),否则就和邻居合并(要涉及父节点);在内部结点的话需要和后继交换再考虑删除。

  10、B树的访外约定:内存足够大,检索时读入的点,在向上分裂的时候不用再读,一个内部节点(非根)分裂的时候需要写2次盘,根节点分裂的时候需要写3次盘,所以一个高度为h的B树插入的时候最多需要h + 2(h-1) + 3 = 3h + 1次访外

  11、B+树是B树的变形,所有的关键码都在叶结点处,且每个结点的记录都是对孩子结点里面的最大(小)关键码的复写,n个关键码的结点有n个叶子结点,其他和B树差不多。

  12、有N个关键码的B树有N+1个外部空指针,证明如下:

         当N = 1时命题显然成立

         假设命题对N <= k 成立,考虑 N = k + 1的情况,假设根节点有s个关键码,则其有s+1个孩子结点,xi表示第i个子B树具有的关键码数目,这些孩子结点的总共关键码数量和为x1 +x2 + ... + xs+1 = k + 1 – s, 每个孩子结点对应的子B树满足归纳假设的前提,那么根据归纳假设,他们提供的外部空指针数目为 sum(1 + xi, i = 1 to s + 1)  = k + 1 - s + s + 1 = k + 2,这样子一来对N = k + 1的情况也得证了

  13、运用12的结论,我们可以估计查找一个B树最大访外次数:

  

 

   用高度h代替k就可以估计。

  14、我们再来估计插入一个结点时,B树的结点分裂次数(可能会不断分裂),对于一个m阶B树,设有N个关键码,p个结点,则N应该满足 N >= 1 + [(p-1) * floor(m/2) - 1],也就是说根节点提供1个关键码,其他结点提供floor(m/2)- 1个关键码得到最少的关键码个数。再认为除了第一个结点,其他结点都是分裂而来的,所以s  = (p-1) / (N-1) <= 1 / (floor(m/2) - 1)

  15、读盘次数最少的话B树结点中尽量放多的关键码,读盘次数至多的话按之前的一个k的估计式进行估计即可。

  16、RB树留到之后和AVL树一起写

posted @ 2019-12-23 11:51  一笑正中双飞翼  阅读(213)  评论(0编辑  收藏  举报