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 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...
随机推荐
- js 中数字问题
在js中请注意数字是没有长度的, 不能使用for循环遍历数字的长度 操作时通过.toString()把数字转换成字符串后通过字符串的.length 属性得到长度
- php工作笔记1-数组常用方法总结,二维数组的去重,上传图片到oss服务器
1.二维数组去重,生成二维数组 private function array_unique_fb($array2D){ $data = array(); foreach($array2D as $k ...
- html focus事件小学问
focus事件千万不要有alert方法,不然在有些浏览器会进入死循环的.例如:$('#test').focus(function(){ alert('dead loop'); }); 在chrome下 ...
- KMP算法分析
KMP是一种复杂度较低的字符串比较算法.基本思路是对欲匹配字符串进行预处理,分析当k位匹配时可以后移的位数,所得的数构成该字符串的特征向量. 求特征向量Next int* Next(string p) ...
- PHP简单利用token防止表单重复提交
<?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...
- jquery实现章节目录效果
<html><head><title>jquery实现章节目录效果</title> <script type="text/javascr ...
- SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句
附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...
- python3.5------用户的三次验证
笔者QQ: 360212316 逻辑图 代码 #/usr/bin/python # -*- coding: utf-8 -*- lock = open("black_user_list.tx ...
- Elasticsearch升级1.5版本暴露jdk的bug
把测试环境的Elasticsearch升级到1.5.1版本,启动的时候报错: [root@node2 elasticsearch-1.5.1]# bin/service/elasticsearch s ...
- RequireJS基础(三)
这篇来写一个具有依赖的事件模块event. event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.d ...