B树系列文章(1)--查询操作

     B树是最重要的存取路径结构。 B 树总是平衡的,并且对任意修改操作来说,也容易维持 B 树的平衡。

1.B树的基本思想

   B树的每个节点都是一个页面。B树有两种类型的节点:叶子节点和索引节点。叶子节点包含要查找的数据,对聚集索引而言数据是记录,对非聚集索引,这里的数据是指索引列、主关键字(或ROWID)。索引节点不包含数据,只包含下一层节点的路由信息。

   B树索引节点的抽象数据结构如下:

ulint      F;              // 在一个索引节点中最大入口项的数量

struct

{

  
char     *K;           //B树的key值

  PAGEID   P;            
//指向其它页面的指针

}
index_node_structure[];     // 有key-指针所组成的数组

 

   这里F定义了每个页最多存放的索引项(也可称为入口项)的数量,在实际的数据库实现当中,不会定义该数值。比如,假设在varchar列上建立索引,那么索引项的大小就是变长的,因此索引节点中存放的索引项的数量也是变化的。为了便于叙述的方便,这里设定了该值F。

Ki标识数组的第i个成员。每个索引节点包含一个有序的索引键值K1≤K2≤…≤KF,它们对这个节点的查找空间加以划分。每个索引键值Ki的后面都跟着一个指向其它后继节点的指针Pi,该后续节点包含位于Ki和Ki+1之间的那些索引键值Kj(Ki≤Kji+1)有关的所有信息。同样,小于索引键值K1的信息保存在P0指向的子树中。

   上面申明的结构中包含一个附加的索引键值K0,它正好位于索引序列的开始处。如果规定P0指向的子树中包含所有小于K1的索引值,那么实际上不需要该索引值(也就是,index_node_structure[0]中的K成员的值无意义)。尽管如此,大多数的B树实现中还是包含该字段的,这使得节点的内部结构变得更加简单:因为可以统一使用规则的<索引键值,指针>对数组结构,而不必使用另外一个指针。

   所有的内部节点都包含这种路由信息,即索引键和指向下层节点的指针,在下层节点中含有更详细的信息。

   叶子节点基本上也是相同的结构,但不包含其它节点的指针。需要注意的是,在索引节点中第一个记录K0是无意义的,但对叶子节点来说,它却是重要的,是该叶子节点的第一个元组。

2.B树上的查找操作

 

 

        参照图1,描述一个查找属性值=s的检索元组的操作。查找总是根节点开始,根节点是一个索引节点。令m(m≤F)为当前节点中具有最大索引键值的入口项索引,则存在以下两种情况:

  1)若s≥Km,则转到Pm指向的子树;否则,

  2)转到指针Pj指向的子树,这里Ki≤sj+1。

     如果指针指向的节点是一个索引节点,那么重复以上过程。最终指针将会指向一个叶子节点。索引键值=s的元组要么在该叶子节点中,要么根本不存在。在叶子节点内部进行的查找是利用二分查找。

      对于s≤属性值≤t形式的范围查询,因为B树在叶子页之间存在全序。所以该范围查找的执行过程为:

     1)沿B树向下查找值范围的下限,即执行属性值=s的精确匹配查询。这样定位的元组是满足该查找条件的第一个元组。

     2)沿着叶子节点中该记录向后扫描,只要是符合≤t的就符合,如果扫描到该叶子节点的尾部,则跳到它的右兄弟页节点。数据库的页中会保存左、右兄弟的节点指针。重复这样的执行过程,直到元组的索引键值超过上限t或者最后一个叶子节点被处理完。

     当然,如果是降序生成元组,其处理过程也是一样的,只不过是按上限到下限的顺序进行处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
题目采自 《数据结构题集》(c语言版)(严蔚敏`吴伟民)6.3 图书管理,最大的难度在于要求用B树对书号进行索引。 设计语言:C语言 编译环境: VC++6.0 里面包含完整的源程序和报告文档,程序为dos界面,有彩色菜单,对数据显示实现表格化……本课程设计成绩为优秀。 源程序有注释,报告文档完全按要求,包括所用数据结构的描述与实现、算法的时空分析等都包括在内。 程序所能达到的功能 1图书采编入库(用B树对书号建立索引) 2清除库存 3图书借阅 4图书归还 5图书预约 6列出某著者全部著作名 7列出某种书的状态(包括图书基本信息和该书借者名单、 预约者名单) 8每次插入或删除一个关键字后以凹入表显示B树的状态 9把一次会话过程中的全部人机对话记录入一个日志文件中 10在程序主界面显示当前系统时间 一、 需求分析 1. 书号和借阅证号、库存量、出版年份用整型表示;书名用20位字符型数组,著者和借阅者姓名用30位字符型数组表示;图书价格用浮点型表示。图书入库时输入图书的书号、书名、著者、总量等完整信息,清除库存时输入图书书号,借阅和归还时输入书号和借阅者证号,姓名等信息,并记录系统时间为借书日期。 2. 借书和归还时显示图书的信息。插入、删除后用凹入表显示以书号建立的B树状态。查看图书状态,以表格显示图书的基本信息,借阅者名单和预约者名单。 ……………… 课程设计清单: base.h //全程常量、全局变量和公共函数等 btree.h //B树类型单元 library.h //书库类型单元 main.cpp //主程序 bookiofo.dat //图书信息文件 borrower.dat //借书者姓名文件 bespeaker.dat //预约者姓名文件 main.exe //编译得到的可执行文件 数据结构课程设计实验报告-图书管理.doc
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值