关于B树,不想写太多了,因为花在基于树的查找上的时间已经特么有点多了,就简单写写算了,如果以后有需要,或者有时间,可以再深入写写

首先说一下,为什么要有B树,以及B树是什么,很多数据结构和算法的书上来就上B树的定义,然后讲基于B树的几个操作,什么插入啊,建立啊,分裂啊,最后写个查找算法了事

我想,请问一下,编书的人这样搞是什么意思,这样还不如直接画算法的示意图,接下来是源码就够了,这样学下来,各种查找,搜索算法之间都是孤立开来的,无法领会到他们为什么这样做,他们是怎样想出来的,算了,不扯了,心里烦编书的人

为什么会有B树呢?我们还是先回到二叉排序树和平衡二叉排序树上,有了他们,我们才能理解为什么会有B树

在平衡二叉排序树里,算法的时间复杂度为O(log2(n)),明显,这里的算法时间复杂度是取决于树的深度的,想一想,一个节点只能存储有限的数据,一个结点最多只能有两颗子树,这样一来,数据一多,树的深度就很大,因此,算法的时间复杂度很容易就变得很大,这种问题有什么解决办法呢?肯定是减少树的深度啊!,怎么减少树的深度呢?可以多增加几个子树啊!子树之间也是有序的,这样一来,树的深度不久降下来了吗,这样的话,这种多子树的平衡术的时间复杂度就为logm(n),其中的m为子树的个数,m越大,算法时间复杂度就很小了!

按照这样的思路,我们新提出来一种树,那就是B树了,B树通常被描述为m阶B树,m阶B树的定义如下:

1.每个结点最多只能有m颗子树()

2.根节点至少有2颗子树(根节点子树数目>=2&&<=m)

3.除了根节点之外的非叶结点至少有|_m/2_|颗子树(>=|_m/2_|&&<=m)

4.所有的叶子结点都在同一层()

好了,有了以上的定义,下面可以给出B树的数据结构了

#include<iostream>
#define M 100
typedef char KeyType;
//m阶B树表示:这个树每个节点最多能有m颗子树,根节点最少有2颗子树,非根的非叶子结点最少有ceil(m/2)颗子树
typedef struct _B_Node
{
struct _B_Node* childTree[M+1];//M+1个子树
int keyNum;//关键字个数,keyNum+1为子树个数
struct _B_Node* parent;
KeyType key[M+1];//m个关键字,第0个不用
}B_Node,*BTreeRoot;

  

接下来是基于B树的查找

//返回查找成功或者失败,成功时:node为该关键字所在结点的地址,number为该关键字在他节点中的位置,
//失败时:返回false,node为应该插入的结点,number为这个节点中应该插入的位置,
bool find_By_Btree(BTreeRoot root,int* number,B_Node* &node,KeyType k)
{
B_Node *p=root;
int i=1;
while (p)
{
for (i = 1; i <=p->keyNum; i++)
{ if (p->key[i]==k)
{
*number=i;
node=p;
return true;
}
else if (p->key[i]<k)
{
continue;
}
else
{
break;
}
}
node=p;
p=p->childTree[i-1];
}
if (p==nullptr)
{
*number=i;
node=p->parent;
return false;
} }

  

算法分析:通过对B树的树形的分析,不难发现,B树的时间复杂度为O(logm(n)),也可以写为log(n)

最新文章

  1. [JavaEE笔记]Cookie
  2. 页面静态化技术Freemarker技术的介绍及使用实例.
  3. 另类分析SIGSEGV信号
  4. 什么是API
  5. web前端编写注意点
  6. C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***
  7. Spring-如何实现事物管理的
  8. SequoiaDB的数据分区操作
  9. 20、内存溢出(Out of Memory)
  10. python计算机视觉1:基本操作与直方图
  11. WAMP环境 apache 2.4.23 局域网访问
  12. 201521123075 《Java程序设计》第2周学习总结
  13. Intellij IDEA 插件开发之自建插件仓库
  14. Linux下截取指定时间段日志并输出到指定文件
  15. 用python在后端将数据写入到数据库并读取
  16. Java8 利用Lambda处理List集合
  17. 高性能迷你React框架anujs1.0.8发布
  18. shell分析日志常用指令合集
  19. UX设计秘诀之注册表单设计,细节决定成败
  20. spring-boog-测试打桩-Mockito

热门文章

  1. Windows消息机制
  2. CSS3写折纸
  3. O365(世纪互联)SharePoint 之使用Designer报错
  4. Android EventBus 3.0.0 使用总结
  5. MP3文件信息批量更改器
  6. 【C++】类和对象(构造与析构)
  7. vi(vim)键盘图及其基本命令
  8. Java实现office文档与pdf文档的在线预览功能
  9. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
  10. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)