文件系统的索引—B树

B-tree

如何设计一个文件系统的索引??

1 前置知识:

  • 索引:为了更快找到数据的一种键值对(k:v);比如字典索引。

  • 让你设计一个文件系统的索引,你会用什么数据结构来实现?

    • 线性结构:等于是全部遍历一遍,如果是线性表还涉及大规模的移动。
    • 哈希表:其实就是对key进行模运算来进行数据访问
      • hash冲突后,数据散列不均匀,产生大量线性遍历,效率低
      • 等值查询可以,范围查询就需要挨个遍历
  • 二叉树:拿它来做索引,数据访问的时候还是得遍历,因为它的键值是无序的
  • BST二叉查找树:

    • 特点是左小右大。如果用数组来存,它是递增的,根节点在最中间。
    • 但是树的形态和插入顺序相关,导致树可能存在大量线性部分。
      文件系统的索引—B树_第1张图片
      文件系统的索引—B树_第2张图片
  • AVL树:

    • 1962年村里来了两个年轻人,解决了BST二叉查找树的致命问题
    • 他们怎么做的(快让我康康)
      • 插入数据时,通过算法让这棵树保持平衡,即上一层满了,我才可以把数据插在下一层。
      • 也可以说用插入的成本来弥补查询的效率
    • 但是插入操作多的时候,平衡算法耗时所以有缺陷
  • 红黑树:

    • 它是一种弱AVL树。即不需要绝对的平衡,大体上平衡就好了。

    • 最长子树高度超过最短子树的二倍才进行平衡调节。

    • 保持查找效率的同时提升了插入效率

    • 但是只有两个分支,导致随着数据的插入,树的深度激增,意味着IO次数增多,影响读取的效率。

      下划线注释:文件系统的索引—B树_第3张图片

      这里的意思就是我们要使用磁盘数据,则需要把数据输入到内存,但是我们不可能把D盘直接输入进去再进行检索,我们的检索信息是通过IO来传递然后再外存进行检索的。这里想象一下我们打开D盘,打开游戏目录,最后打开一个游戏程序。(一个文件夹只能两个子目录,所以很深)

2 转入正题 —B树

  • 1970年,村里又来了两个年轻人提出了B树

  • B树:一个有序的多路查询树。它是可以看作是红黑树的进化版。

文件系统的索引—B树_第4张图片

  • 磁盘预读

    在一个典型的B树应用中,需要处理的数据量非常大,所有数据无法一次装入主存。B树算法将所需页面从磁盘复制到主存,然后将修改过的页面写回磁盘。任何时刻B树算法都只需要在主存中保持一定数量的页面。因此主存的大小并不限制被处理B树的大小

    文件系统的索引—B树_第5张图片

    文件系统的索引—B树_第6张图片

  • B 树的索引方式
    任何和关键字相关联的卫星数据都将与关键字存储在同一个节点。比如B树的变种,B+树就是把所有卫星数据都存储在叶节点上,以最大化内部节点的分支因子
    文件系统的索引—B树_第7张图片
    文件系统的索引—B树_第8张图片

练习:

文件系统的索引—B树_第9张图片

你可能感兴趣的:(数据结构,b树)