算法导论 第18章 B树
与其他树的结构不同的是  B数是多叉而不是二叉树 而且分叉因子很大
一般使用于数据库 针对需要硬盘IO的情况而使用 可以降低磁盘IO
B树的一个节点是以磁盘的页面为单位,而不是数据内容为单位 一般一个节点等于一个完整的磁盘页

以下B树性质是本人理解  具体定义可查阅算法导论18章节
除了根节点以外 所有节点拥有T-1个 到 2T-1个关键字
关键字升序或者降序排列
节点拥有T个到2T个指针 指向子节点 定义为子节点
若节点仅拥有关键字而无指针 为叶子节点 在树的最下端
T=2时候 树拥有2、3或者4个子节点 成为2-3-4树

以下为我学习的一个简单代码 确定了B树的结构和创建、查找功能 打印节点数值功能。

增删功能比较麻烦,后继增加

// 1213.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <list>
#include <vector>
#include <assert.h>
using namespace std; #define t 2; struct MyB_Tree {
size_t keySize_;
bool isLeaf_;
std::vector<size_t> keys_;
std::vector<MyB_Tree*> subTrees_;
MyB_Tree() {
keySize_ = 0;
isLeaf_ = true;
}
}; struct SearchResult {
MyB_Tree* pBTree_;
size_t keyNum_;
SearchResult() {
pBTree_ = NULL;
keyNum_ = 0;
}
SearchResult(MyB_Tree* pBTree, size_t keyNum) {
pBTree_ = pBTree;
keyNum_ = keyNum;
}
}; MyB_Tree* CreateB_TreeNode() {
MyB_Tree* pBTree = new MyB_Tree();
return pBTree;
} bool BTreeeSearch(MyB_Tree* pBTree, size_t value, SearchResult& result) {
bool ret = false;
size_t i = 0;
while (i <pBTree->keySize_ && value > pBTree->keys_[i]) {
i++;
}
if (i <pBTree->keySize_ && value == pBTree->keys_[i])
{
result.pBTree_ = pBTree;
result.keyNum_ = i;
ret = true;
return ret;
}
if (pBTree->isLeaf_) {
return ret;
}
else {
return BTreeeSearch(pBTree->subTrees_[i], value, result);
}
} void PrintTree(MyB_Tree* p) {
std::cout << "//==========================\nstart print keys : ";
for (int i = 0; i<p->keySize_; i++) {
std::cout << p->keys_[i] << " ";
} std::cout << "\n//==========================" << std::endl;
if (!p->isLeaf_) {
for (int i = 0; i <= p->keySize_; i++)
{
PrintTree(p->subTrees_[i]);
}
}
} int main(int argc, char *argv[])
{
MyB_Tree* root = CreateB_TreeNode();
MyB_Tree* subright = CreateB_TreeNode();
MyB_Tree* subleft = CreateB_TreeNode(); root->keySize_ = 1;
root->keys_.push_back(20); subleft->keySize_ = 2;
subleft->keys_.push_back(10);
subleft->keys_.push_back(19); subright->keySize_ = 3;
subright->keys_.push_back(21);
subright->keys_.push_back(25);
subright->keys_.push_back(30); root->isLeaf_ = false;
root->subTrees_.push_back(subleft);
root->subTrees_.push_back(subright); PrintTree(root); SearchResult result;
assert(BTreeeSearch(root, 33, result) == false);
assert(BTreeeSearch(root, 25, result) == true);
assert(result.pBTree_ == subright);
assert(result.keyNum_ == 1); std::cout << "finished " << std::endl;
return 0;
}

运行截图

代码建立了一个B树

结构如下

B-Tree 学习的更多相关文章

  1. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

  2. dsu on tree学习笔记

    前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...

  3. Gradient Boosting Decision Tree学习

    Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...

  4. Merkle Tree学习

    /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为接触时间不长,对Merkle Tree的理解也不是 ...

  5. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  6. 矩阵树定理(Matrix Tree)学习笔记

    如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...

  7. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  8. Codeforces 600E. Lomsat gelral(Dsu on tree学习)

    题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...

  9. splay tree 学习笔记

    首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...

  10. 【转载】决策树Decision Tree学习

    本文转自:http://www.cnblogs.com/v-July-v/archive/2012/05/17/2539023.html 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...

随机推荐

  1. 从入门到精通C++需要学的10本书

    学习C++从入门到精通的的十本最经典书籍  文章来源中国IT实验室收集整理作者佚名更新时间2009-5-16 12:27:05 保存本文保存本文推荐给好友推荐给好友收藏本页收藏本页 欢迎进入C/C++ ...

  2. React Test相关资料

    karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...

  3. 如何在SqlServer中获取前端连接的IP地址,计算机名等信息

    在一些需求中,可能我们需要知道连接到SqlServer的前端程序的一些系统信息,比如前端连接的计算机名称,IP地址,什么时候开始请求连接,什么时候结束连接等信息. 如果你对SqlServer的系统函数 ...

  4. PHP防SQL注入不要再用addslashes和mysql_real_escape_string

    PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...

  5. 服务器控件中使用<%#...>, JS和html控件中使用<%=...>

    //在服务器控件的属性中,需要用<%#...>来绑定其他控件的ID, 并且要在页面初始方法中,执行Page.DataBind(); <asp:ImageButton ID=" ...

  6. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  7. lua代码设置unity对象的基础属性

    设置对象的父节点: wall.transform:SetParent(GameObject.Find("Walls").transform) 设置颜色: wall:GetCompo ...

  8. JcClient Ip Get

    ##通道##123.207.157.82:18425## ##通道##112.95.251.214:18425## ##通道##110.52.233.5:18425## ##通道##119.29.19 ...

  9. alhpa阶段回顾

    说明:本次课程,大家按照我下面列出来的问题进行回顾和反思,总结alhpa阶段以来的得失.每个组都要回答这些问题.由组长或者组员来回答都可以.目的依然是让大家养成软工的一些习惯和思维方式. 1.最初的需 ...

  10. 关于GC的几篇文章

    http://msdn.microsoft.com/zh-cn/magazine/bb985010(en-us).aspx http://msdn.microsoft.com/zh-cn/magazi ...