磁盘作为辅存,它的容量要比内存大得多,但是速度也要慢许多,下面就是磁盘的的结构图:
磁盘驱动器由一个或多个盘片组成,它们以固定的速度绕着主轴旋转,数据存储于盘片的表面,磁盘驱动器通过磁臂末尾的磁头来读写盘片。礠臂可以将磁头向主轴移近或移远。当一个磁头处于静止的时候,它下面经过的磁盘表面称为磁道。
磁盘之所以比主存要慢,是因为它有机械运动的部分:盘片旋转和磁臂运动。为了摊还机械移动所花费的等待时间,磁盘会一次存取多个数据项。磁盘上的数据被组织成页面。每次磁盘读写的数据都是以页面为单位。
本章考虑运行时间主要考虑:磁盘存取次数以及CPU时间。尽管磁盘读写时间依赖于当前磁道和所需磁道之间的距离以及磁盘的初始旋转状态,但是仍然使用读写的页数作为磁盘存取时间的近似值。
在一个典型的B树应用中,需要处理的数据非常大,以至于所有数据无法一次装入主存。通过下面的代码对磁盘操作进行建模。设x为指向一个对象的指针,如果该对象在主存中,那么可以像平时一样引用该对象的属性。如果x所指的对象不在主存中,那么在引用该对象的属性之前,需要先执行DISK-READ(x),将该对象读入主存中。(如果对象已经在主存中,则DISK-READ(x)是个空操作)。同样,如果x所指的对象的属性改变了,则需要通过DISK-WRITE(x)写入磁盘:
x = a pointer to some object
DISK-READ(x)
operations that access and/or modify the attributes of x
DISK-WRITE(x) // omitted if no attributes of x were changed
other operations that access but do not modify attributes of x
一个B树算法的运行时间主要由DISK-READ和DISK-WRITE操作的次数决定,希望这些操作能够读写尽可能多的信息。因此,一个B树节点通常和一个完整磁盘页一样大。B树就是为磁盘设计的一种平衡搜索树。许多数据库系统使用B树或者B树的变种来存储信息。
B树类似于红黑树,不同之处在于B树可以有很多孩子,也就是B树的分支因子可以很大,所以对于n个节点,B树的严格高度要比红黑树小得多。下图就是一个简单的B树:
如果B树的内部节点x包含x.n个关键字,则节点x就有x.n+1个孩子。节点x中的关键字就是分隔点,他把所有的关键字分隔为x.n+1个子域,每个子域都由x的一个孩子处理。
一:B树的定义
一颗B树具有下面的性质:
1:每个节点x有下面属性:
4:所有叶节点具有相同的深度,树的高度为