B-Tree 学习
算法导论 第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 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...
随机推荐
- php 中常见的函数及系统常量
1.判断是否存在某函数: function_exists('memory_get_usage'): 2.统计程序执行到某节点消耗的系统内存: memory_get_usage(); 3.当前访问目录的 ...
- dubbo-monitor图标功能不显示
原因有3: 1.需要创建目录 2.需要在consumer的配置文件中增加如下配置,使用zk为注册中心 <!-- 监控中心,需要配置以后dubbo-monitor才能生效 --> &l ...
- nginx的优化
Nginx 优化 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/P ...
- linux使用grep和find查找内容
1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...
- jquery 使用方法(一)
jquery是什麼? jquery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScript开发的函數库. javascript是屬於網絡的腳本語言,宿主文件是html, ...
- memcached tomcat maven 学习记录
2016.12.11 maven 快速搭建项目,只要有pom.xml文件配置好依赖 可以把项目切割(具体切割出来的块怎么用?) nginx 负载均衡 文件服务器 主要配置nginx.conf 文件 ...
- linux小程序--cmatrix
wget http://www.asty.org/cmatrix/dist/cmatrix-1.2a.tar.gz .2a.tar.gz cd cmatrix-.2a yum install ncur ...
- SQL Server类型的对应关系
bit bool tinyint byte smallint short int int bigint long real float float double money decimal datet ...
- python之路-Mysql&&ORM
1. 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以 ...
- Linux进程间通信之消息队列
本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...