关于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. GJM : Unity3D HIAR -【 快速入门 】 三、导入 SDK

    导入 SDK 本文将向您介绍如何在 Unity 工程中导入 HiAR SDK for Unity.在开始之前,请先访问 HiAR 官网下载最新版本的 SDK. 下载 HiAR SDK for Unit ...

  2. spider RPC安全性

    spider提供了多重安全保障机制,目前主要支持接入握手校验,报文完整性校验,报文加密,报文长度检查四种机制. 接入认证 spider使用两次握手校验,其握手流程如下: 签名AES加密的方式实现. l ...

  3. HTML DOM总结

    MDN的定义 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口.它给文档(结构树)提供了一个结构化的表述并且定义了一种方式—程序可以对结构树进行访问,以改变文档的结构,样式和内容. ...

  4. CentOS7安装docker

    1. 查看系统版本 $ cat /etc/redhat-release   2. 安装docker $  yum install docker 3.检查安装是否成功$ docker version 若 ...

  5. 在View and Data API中更改指定元素的颜色

    大家在使用View and Data API开发过程中,经常会用到的就是改变某些元素的颜色已区别显示.比如根据某些属性做不同颜色的专题显示,或者用不同颜色表示施工进度,或者只是简单的以颜色变化来提醒用 ...

  6. heartbeat在yum系发行版本的处理资料

    centos 安装包[rpm]和光盘iso文件 http://mirror.centos.org/centos/ 对应如上包的代码 http://vault.centos.org/ git.cento ...

  7. 基于InstallShield2013LimitedEdition的安装包制作

    在VS2012之前,我们做安装包一般都是使用VS自带的安装包制作工具来创建安装包的,VS2012.VS2013以后,微软把这个去掉,集成使用了InstallShield进行安装包的制作了,虽然思路差不 ...

  8. SQL中几个常用的排序函数

         最近使用窗口函数的频率越来越高,这里打算简单介绍一下几个排序的函数,做一个引子希望以后这方面的问题能够更深入的理解,这里先简单介绍一下几个简单的排序函数及其相关子句,这里先从什么是排序开始吧 ...

  9. python 进度条的编写

    背景: 在执行一些Python脚本时,经常出现执行脚本的过程当中,不知道脚本执行了百分之多少,这个问题一直都让我很苦恼.所以特意总结一下,进度条的编写. #!/usr/bin/env python2. ...

  10. 用application实现一个网页的浏览计数器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...