算法导论 第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. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

  2. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  3. Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis

     本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.htm ...

  4. yii + elasticsearch 手册

    https://zhuowenji1.gitbooks.io/elasticsearch/content/an_zhuang_yii2.html

  5. {POJ}{3988}{Software Industry Revolution}{DP好题}

    题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值 思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划 ...

  6. javascript对象引用与赋值

    avascript对象引用与赋值 <script type="text/javascript"> //例子一: 引用 var myArrayRef = new Arra ...

  7. UCS2和UTF16有区别

    UCS2是定长的,固定2个字节,所以不能支持扩展字符,而UTF16是变长的.   UCS2是落伍的.   msdn里有这样一段描述: UCS-2 is a predecessor of UTF-16. ...

  8. HTML5 canvas beginPath() 方法

    beginPath() 方法开始一条路径,或重置当前的路径.w3school上的解释! 路径是canvas里很重要的一个概念,刚开始学canvas的人对路径理解不是很深,他们在用canvas的时候会乱 ...

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

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

  10. Nginx的nginx.conf配置文件中文注释说明

    #运行用户    user www-data;        #启动进程,通常设置成和cpu的数量相等    worker_processes  1;    #全局错误日志及PID文件    erro ...