算法导论 第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 学习的更多相关文章
-
珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
-
dsu on tree学习笔记
前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...
-
Gradient Boosting Decision Tree学习
Gradient Boosting Decision Tree,即梯度提升树,简称GBDT,也叫GBRT(Gradient Boosting Regression Tree),也称为Multiple ...
-
Merkle Tree学习
/*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为接触时间不长,对Merkle Tree的理解也不是 ...
-
Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
-
矩阵树定理(Matrix Tree)学习笔记
如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...
-
k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
-
Codeforces 600E. Lomsat gelral(Dsu on tree学习)
题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...
-
splay tree 学习笔记
首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...
-
【转载】决策树Decision Tree学习
本文转自:http://www.cnblogs.com/v-July-v/archive/2012/05/17/2539023.html 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...
随机推荐
-
bnuoj 29368 Check the Identity(栈)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29368 [题解]:模拟,然后对x,进行枚举,看是否所有都满足条件 [code]: #include ...
-
配置php的CAS客户端
1.下载安装xmapp 2.开启Apache服务. 3.下载php的CAS客户端源码包(我使用的是CAS-1.2.0.tgz),解压到xmap的htdocs目录下(D:\xmapp\htdocs),进 ...
-
[转载]为什么使用%lf读取double型的值,而用%f进行显示?
博客地址:http://blog.csdn.net/shenzhou111/article/details/7826444 今天看到一篇好文章,mark一下. 出去旅游了一下,所以有些天没敲代码,于是 ...
-
[Firebase + PWA] Keynote: Progressive Web Apps on Firebase
Link : Video. 1. Firebase Auth: provides simple login with Github, Google, Facebook, Twittr. Link 2. ...
-
Java基础知识强化之集合框架笔记33:Arrays工具类中asList()方法的使用
1. Arrays工具类中asList()方法的使用 public static <T> List<T> asList(T... a): 把数组转成集合 注意事项: 虽然可以把 ...
-
SQL Server 分组后取Top N
SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...
-
label 标签
<label> 标签为 input 元素定义标注内容 label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发此控件.就是 ...
-
Java使用递归找出某目录下的所有子目录以及子文件
/* 使用递归找出某目录("C:\\JavaProducts")下的所有子目录以及子文件 */ import java.util.*; import java.io.*; publ ...
-
ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
-
A1111. Online Map
Input our current position and a destination, an online map can recommend several paths. Now your jo ...