关于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)

查找(四)-------基于B树的查找和所谓的B树的更多相关文章

  1. 数据结构与算法->树->2-3-4树的查找,添加,删除(Java)

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 目录 一. 2-3-4树的定义 二. 2-3-4树数据结构定义 三. 2-3-4树的可以得到 ...

  2. Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现

    表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...

  3. AVL树(查找、插入、删除)——C语言

    AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...

  4. Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树)

    什么是树表查询? 借助具有特殊性质的树数据结构进行关键字查找. 本文所涉及到的特殊结构性质的树包括: 二叉排序树. 平衡二叉树. 使用上述树结构存储数据时,因其本身对结点之间的关系以及顺序有特殊要求, ...

  5. SDUT 3376 数据结构实验之查找四:二分查找

    数据结构实验之查找四:二分查找 Time Limit: 20MS Memory Limit: 65536KB Submit Statistic Problem Description 在一个给定的无重 ...

  6. 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树

    实验7 学号:      姓名:     专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...

  7. 计蒜客 41387.XKC's basketball team-线段树(区间查找大于等于x的最靠右的位置) (The Preliminary Contest for ICPC Asia Xuzhou 2019 E.) 2019年徐州网络赛

    XKC's basketball team XKC , the captain of the basketball team , is directing a train of nn team mem ...

  8. SDUT-3376_数据结构实验之查找四:二分查找

    数据结构实验之查找四:二分查找 Time Limit: 30 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无重复元素的递增序列里,查找与给 ...

  9. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

随机推荐

  1. 在Thinkphp中使用AJAX实现无刷新分页

    在Thinkphp目录的Lib\ORG\Util\目录里新建AjaxPage.class.php,写入一下内容: <?php // +------------------------------ ...

  2. python语言中的编码问题(续)

    上文提到了python开发中非常重要的两处设置. 一个是编解码器的默认设置defaultencoding >>> import sys >>> sys.getdef ...

  3. 利用mysql查询总数据条数,再php处理数据转出数组,生成随机返回到页面,可以做成刷新页面,出现不同的内容

    create table hxfimported( pid int primary key auto_increment, pic ), pname ), price ,) ); insert int ...

  4. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  5. 自定义UITableViewCell实现左滑动多菜单功能LeftSwipe

    今天愚人节,小伙们,愚人节快乐! 实现一个小功能,滑动菜单,显示隐藏的功能菜单, 先上图:                       这里尝试用了下使用三个方式来实现了这个功能: 1.使用自定义UI ...

  6. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  7. 看完你也能独立负责项目!产品经理做APP从头到尾的所有工作流程详解!

    (一)项目启动前 从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为 ...

  8. html img图片等比例缩放

    在img标签里面只设置宽,不设置高,图片就会等比例缩放.

  9. IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈

    以前写过一个文(IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章),主要介绍笔者的职业发展之路,不过该文需要后续了,因为笔者现在从事的是“产品经理”一职.从笔者的导航文([置顶]博文快 ...

  10. 纯js实现10分钟倒计时

    一个简单实现倒计时的小栗子~ 效果图:简陋的不能再简陋了,捂脸 代码: <!DOCTYPE HTML> <html> <head> <title> 倒计 ...