﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-不过是用Ms Tools的一个民工..-文章分类-Data Structure and Algorithm</title><link>http://www.cppblog.com/IssacAsimoy/category/7398.html</link><description>人恒过，然后能改。困于心，衡于虑，而后作。</description><language>zh-cn</language><lastBuildDate>Fri, 04 Jul 2008 23:25:25 GMT</lastBuildDate><pubDate>Fri, 04 Jul 2008 23:25:25 GMT</pubDate><ttl>60</ttl><item><title>B 树、 B- 树、 B+ 树、 B* 树都是什么 </title><link>http://www.cppblog.com/IssacAsimoy/articles/55356.html</link><dc:creator>IssAc</dc:creator><author>IssAc</author><pubDate>Fri, 04 Jul 2008 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/IssacAsimoy/articles/55356.html</guid><wfw:comment>http://www.cppblog.com/IssacAsimoy/comments/55356.html</wfw:comment><comments>http://www.cppblog.com/IssacAsimoy/articles/55356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IssacAsimoy/comments/commentRss/55356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IssacAsimoy/services/trackbacks/55356.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><font size=4><font color=#ff0000><span><font face="Times New Roman">B</font></span><span>树</span></font></font></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>即二叉搜索树：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.</font></span><span>所有非叶子结点至多拥有两个儿子（</span><span><font face="Times New Roman">Left</font></span><span>和</span><span><font face="Times New Roman">Right</font></span><span>）；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2.</font></span><span>所有结点存储一个关键字；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3.</font></span><span>非叶子结点的左指针指向小于其关键字的子树，右指针指向大于其关键字的子树；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/1.JPG"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B</font></span><span>树的搜索，从根结点开始，如果查询的关键字与结点的关键字相等，那么就命中；否则，如果查询关键字比结点关键字小，就进入左儿子；如果比结点关键字大，就进入右儿子；如果左儿子或右儿子的指针为空，则报告找不到相应的关键字；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如果</span><span><font face="Times New Roman">B</font></span><span>树的所有非叶子结点的左右子树的结点数目均保持差不多（平衡），那么</span><span><font face="Times New Roman">B</font></span><span>树的搜索性能逼近二分查找；但它比连续内存空间的二分查找的优点是，改变</span><span><font face="Times New Roman">B</font></span><span>树结构（插入与删除结点）不需要移动大段的内存数据，甚至通常是常数开销；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/2.JPG"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span>&nbsp;&nbsp;&nbsp; 但</span><span><font face="Times New Roman">B</font></span><span>树在经过多次插入与删除后，有可能导致不同的结构：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><font size=2><span><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/31.JPG"></span></font></p>
<span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=left></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><font size=2><span><span><font face="Times New Roman"><span>&nbsp;&nbsp; 右边也是一个</span><span><font face="Times New Roman">B</font></span><span>树，但它的搜索性能已经是线性的了；同样的关键字集合有可能导致不同的树结构索引；所以，使用</span><span><font face="Times New Roman">B</font></span><span>树还要考虑尽可能让</span><span><font face="Times New Roman">B</font></span><span>树保持左图的结构，和避免右图的结构，也就是所谓的&#8220;平衡&#8221;问题；</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>实际使用的</span><span><font face="Times New Roman">B</font></span><span>树都是在原</span><span><font face="Times New Roman">B</font></span><span>树的基础上加上平衡算法，即&#8220;平衡二叉树&#8221;；如何保持</span><span><font face="Times New Roman">B</font></span><span>树结点分布均匀的平衡算法是平衡二叉树的关键；平衡算法是一种在</span><span><font face="Times New Roman">B</font></span><span>树中插入和删除结点的策略；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><font size=4><font color=#ff0000><span><font face="Times New Roman">B-</font></span><span>树</span></font></font></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>是一种多路搜索树（并不是二叉的）：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.</font></span><span>定义任意非叶子结点最多只有</span><span><font face="Times New Roman">M</font></span><span>个儿子；且</span><span><font face="Times New Roman">M&gt;2</font></span><span>；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2.</font></span><span>根结点的儿子数为</span><span><font face="Times New Roman">[2, M]</font></span><span>；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3.</font></span><span>除根结点以外的非叶子结点的儿子数为</span><span><font face="Times New Roman">[M/2, M]</font></span><span>；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>4.</font></span><span>每个结点存放至少</span><span><font face="Times New Roman">M/2-1</font></span><span>（取上整）和至多</span><span><font face="Times New Roman">M-1</font></span><span>个关键字；（至少</span><span><font face="Times New Roman">2</font></span><span>个关键字）</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>5.</font></span><span>非叶子结点的关键字个数</span><span><font face="Times New Roman">=</font></span><span>指向儿子的指针个数</span><span><font face="Times New Roman">-1</font></span><span>；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>6.</font></span><span>非叶子结点的关键字：</span><span><font face="Times New Roman">K[1], K[2], &#8230;, K[M-1]</font></span><span>；且</span><span><font face="Times New Roman">K[i] &lt; K[i+1]</font></span><span>；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>7.</font></span><span>非叶子结点的指针：</span><span><font face="Times New Roman">P[1], P[2], &#8230;, P[M]</font></span><span>；其中</span><span><font face="Times New Roman">P[1]</font></span><span>指向关键字小于</span><span><font face="Times New Roman">K[1]</font></span><span>的子树，</span><span><font face="Times New Roman">P[M]</font></span><span>指向关键字大于</span><span><font face="Times New Roman">K[M-1]</font></span><span>的子树，其它</span><span><font face="Times New Roman">P[i]</font></span><span>指向关键字属于</span><span><font face="Times New Roman">(K[i-1], K[i])</font></span><span>的子树；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>8.</font></span><span>所有叶子结点位于同一层；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如：（</span><span><font face="Times New Roman">M=3</font></span><span>）</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><font size=2><span><span><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/4.JPG"></span></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=left><span><font size=2><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B-</font></span><span>树的搜索，从根结点开始，对结点内的关键字（有序）序列进行二分查找，如果命中则结束，否则进入查询关键字所属范围的儿子结点；重复，直到所对应的儿子指针为空，或已经是叶子结点；</span></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size=2><span><font face="Times New Roman">B-</font></span><span>树的特性：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.</font></span><span>关键字集合分布在整颗树中；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2.</font></span><span>任何一个关键字出现且只出现在一个结点中；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3.</font></span><span>搜索有可能在非叶子结点结束；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>4.</font></span><span>其搜索性能等价于在关键字全集内做一次二分查找；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>5.</font></span><span>自动层次控制；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>由于限制了除根结点以外的非叶子结点，至少含有</span><span><font face="Times New Roman">M/2</font></span><span>个儿子，确保了结点的至少利用率，其最底搜索性能为：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><span><font face="Times New Roman"><font size=2><span><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/0.JPG"></span></font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>其中，</span><span><font face="Times New Roman">M</font></span><span>为设定的非叶子结点最多子树个数，</span><span><font face="Times New Roman">N</font></span><span>为关键字总数；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>所以</span><span><font face="Times New Roman">B-</font></span><span>树的性能总是等价于二分查找（与</span><span><font face="Times New Roman">M</font></span><span>值无关），也就没有</span><span><font face="Times New Roman">B</font></span><span>树平衡的问题；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>由于</span><span><font face="Times New Roman">M/2</font></span><span>的限制，在插入结点时，如果结点已满，需要将结点分裂为两个各占</span><span><font face="Times New Roman">M/2</font></span><span>的结点；删除结点时，需将两个不足</span><span><font face="Times New Roman">M/2</font></span><span>的兄弟结点合并；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><font size=4><font color=#ff0000><span><font face="Times New Roman">B+</font></span><span>树</span></font></font></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B+</font></span><span>树是</span><span><font face="Times New Roman">B-</font></span><span>树的变体，也是一种多路搜索树：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.</font></span><span>其定义基本与</span><span><font face="Times New Roman">B-</font></span><span>树同，除了：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2.</font></span><span>非叶子结点的子树指针与关键字个数相同；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3.</font></span><span>非叶子结点的子树指针</span><span><font face="Times New Roman">P[i]</font></span><span>，指向关键字值属于</span><span><font face="Times New Roman">[K[i], K[i+1])</font></span><span>的子树（</span><span><font face="Times New Roman">B-</font></span><span>树是开区间）；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>5.</font></span><span>为所有叶子结点增加一个链指针；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>6.</font></span><span>所有关键字都在叶子结点出现；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如：（</span><span><font face="Times New Roman">M=3</font></span><span>）</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><font size=2><span><span><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/5.JPG"></span></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span>&nbsp;&nbsp; </span></font><font size=2><span><font face="Times New Roman">B+</font></span><span>的搜索与</span><span><font face="Times New Roman">B-</font></span><span>树也基本相同，区别是</span><span><font face="Times New Roman">B+</font></span><span>树只有达到叶子结点才命中（</span><span><font face="Times New Roman">B-</font></span><span>树可以在非叶子结点命中），其性能也等价于在关键字全集做一次二分查找；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B+</font></span><span>的特性：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1.</font></span><span>所有关键字都出现在叶子结点的链表中（稠密索引），且链表中的关键字恰好是有序的；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2.</font></span><span>不可能在非叶子结点命中；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3.</font></span><span>非叶子结点相当于是叶子结点的索引（稀疏索引），叶子结点相当于是存储（关键字）数据的数据层；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>4.</font></span><span>更适合文件索引系统；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><font size=4><font color=#ff0000><span><font face="Times New Roman">B*</font></span><span>树</span></font></font></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>是</span><span><font face="Times New Roman">B+</font></span><span>树的变体，在</span><span><font face="Times New Roman">B+</font></span><span>树的非根和非叶子结点再增加指向兄弟的指针；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt" align=center><font size=2><span><span><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/manesking/6.JPG"></span></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span>&nbsp;&nbsp; </span></font><font size=2><span><font face="Times New Roman">B*</font></span><span>树定义了非叶子结点关键字个数至少为</span><span><font face="Times New Roman">(2/3)*M</font></span><span>，即块的最低使用率为</span><span><font face="Times New Roman">2/3</font></span><span>（代替</span><span><font face="Times New Roman">B+</font></span><span>树的</span><span><font face="Times New Roman">1/2</font></span><span>）；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B+</font></span><span>树的分裂：当一个结点满时，分配一个新的结点，并将原结点中</span><span><font face="Times New Roman">1/2</font></span><span>的数据复制到新结点，最后在父结点中增加新结点的指针；</span><span><font face="Times New Roman">B+</font></span><span>树的分裂只影响原结点和父结点，而不会影响兄弟结点，所以它不需要指向兄弟的指针；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B*</font></span><span>树的分裂：当一个结点满时，如果它的下一个兄弟结点未满，那么将一部分数据移到兄弟结点中，再在原结点插入关键字，最后修改父结点中兄弟结点的关键字（因为兄弟结点的关键字范围改变了）；如果兄弟也满了，则在原结点与兄弟结点之间增加新结点，并各复制</span><span><font face="Times New Roman">1/3</font></span><span>的数据到新结点，最后在父结点增加新结点的指针；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>所以，</span><span><font face="Times New Roman">B*</font></span><span>树分配新结点的概率比</span><span><font face="Times New Roman">B+</font></span><span>树要低，空间使用率更高；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span><font size=2><strong>小结</strong></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B</font></span><span>树：二叉树，每个结点只存储一个关键字，等于则命中，小于走左结点，大于走右结点；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B-</font></span><span>树：多路搜索树，每个结点存储</span><span><font face="Times New Roman">M/2</font></span><span>到</span><span><font face="Times New Roman">M</font></span><span>个关键字，非叶子结点存储指向关键字范围的子结点；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>所有关键字在整颗树中出现，且只出现一次，非叶子结点可以命中；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B+</font></span><span>树：在</span><span><font face="Times New Roman">B-</font></span><span>树基础上，为叶子结点增加链表指针，所有关键字都在叶子结点中出现，非叶子结点作为叶子结点的索引；</span><span><font face="Times New Roman">B+</font></span><span>树总是到叶子结点才命中；</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>B*</font></span><span>树：在</span><span><font face="Times New Roman">B+</font></span><span>树基础上，为非叶子结点也增加链表指针，将结点的最低利用率从</span><span><font face="Times New Roman">1/2</font></span><span>提高到</span><span><font face="Times New Roman">2/3</font></span><span>；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [此文为转载]</span></font></p>
</span>
<img src ="http://www.cppblog.com/IssacAsimoy/aggbug/55356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IssacAsimoy/" target="_blank">IssAc</a> 2008-07-04 16:40 <a href="http://www.cppblog.com/IssacAsimoy/articles/55356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几种常用的字符串hash函数</title><link>http://www.cppblog.com/IssacAsimoy/articles/hash.html</link><dc:creator>IssAc</dc:creator><author>IssAc</author><pubDate>Wed, 18 Jun 2008 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/IssacAsimoy/articles/hash.html</guid><wfw:comment>http://www.cppblog.com/IssacAsimoy/comments/53922.html</wfw:comment><comments>http://www.cppblog.com/IssacAsimoy/articles/hash.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/IssacAsimoy/comments/commentRss/53922.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/IssacAsimoy/services/trackbacks/53922.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 字符串的算法一般大公司都会考到，我们首先要想到高效的hash。如百度查找一组字符串是否出现在某个文本中，这个不是考什么kmp，他们想听到的是hash。趋势科技考的是从某个文本中删除一组字符串，我想也是要hash吧。1 概述链表查找的时间效率为O(N)，二分法为log2N，B+ Tree为log2N，但Hash链表查找的时间效率为O(1)。设计高效算法往往需要使用Hash链表，常数级的查找速度是...&nbsp;&nbsp;<a href='http://www.cppblog.com/IssacAsimoy/articles/hash.html'>阅读全文</a><img src ="http://www.cppblog.com/IssacAsimoy/aggbug/53922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/IssacAsimoy/" target="_blank">IssAc</a> 2008-06-18 21:29 <a href="http://www.cppblog.com/IssacAsimoy/articles/hash.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>