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

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

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

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

  1. // 1213.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <list>
  7. #include <vector>
  8. #include <assert.h>
  9. using namespace std;
  10.  
  11. #define t 2;
  12.  
  13. struct MyB_Tree {
  14. size_t keySize_;
  15. bool isLeaf_;
  16. std::vector<size_t> keys_;
  17. std::vector<MyB_Tree*> subTrees_;
  18. MyB_Tree() {
  19. keySize_ = 0;
  20. isLeaf_ = true;
  21. }
  22. };
  23.  
  24. struct SearchResult {
  25. MyB_Tree* pBTree_;
  26. size_t keyNum_;
  27. SearchResult() {
  28. pBTree_ = NULL;
  29. keyNum_ = 0;
  30. }
  31. SearchResult(MyB_Tree* pBTree, size_t keyNum) {
  32. pBTree_ = pBTree;
  33. keyNum_ = keyNum;
  34. }
  35. };
  36.  
  37. MyB_Tree* CreateB_TreeNode() {
  38. MyB_Tree* pBTree = new MyB_Tree();
  39. return pBTree;
  40. }
  41.  
  42. bool BTreeeSearch(MyB_Tree* pBTree, size_t value, SearchResult& result) {
  43. bool ret = false;
  44. size_t i = 0;
  45. while (i <pBTree->keySize_ && value > pBTree->keys_[i]) {
  46. i++;
  47. }
  48. if (i <pBTree->keySize_ && value == pBTree->keys_[i])
  49. {
  50. result.pBTree_ = pBTree;
  51. result.keyNum_ = i;
  52. ret = true;
  53. return ret;
  54. }
  55. if (pBTree->isLeaf_) {
  56. return ret;
  57. }
  58. else {
  59. return BTreeeSearch(pBTree->subTrees_[i], value, result);
  60. }
  61. }
  62.  
  63. void PrintTree(MyB_Tree* p) {
  64. std::cout << "//==========================\nstart print keys : ";
  65. for (int i = 0; i<p->keySize_; i++) {
  66. std::cout << p->keys_[i] << " ";
  67. }
  68.  
  69. std::cout << "\n//==========================" << std::endl;
  70. if (!p->isLeaf_) {
  71. for (int i = 0; i <= p->keySize_; i++)
  72. {
  73. PrintTree(p->subTrees_[i]);
  74. }
  75. }
  76. }
  77.  
  78. int main(int argc, char *argv[])
  79. {
  80. MyB_Tree* root = CreateB_TreeNode();
  81. MyB_Tree* subright = CreateB_TreeNode();
  82. MyB_Tree* subleft = CreateB_TreeNode();
  83.  
  84. root->keySize_ = 1;
  85. root->keys_.push_back(20);
  86.  
  87. subleft->keySize_ = 2;
  88. subleft->keys_.push_back(10);
  89. subleft->keys_.push_back(19);
  90.  
  91. subright->keySize_ = 3;
  92. subright->keys_.push_back(21);
  93. subright->keys_.push_back(25);
  94. subright->keys_.push_back(30);
  95.  
  96. root->isLeaf_ = false;
  97. root->subTrees_.push_back(subleft);
  98. root->subTrees_.push_back(subright);
  99.  
  100. PrintTree(root);
  101.  
  102. SearchResult result;
  103. assert(BTreeeSearch(root, 33, result) == false);
  104. assert(BTreeeSearch(root, 25, result) == true);
  105. assert(result.pBTree_ == subright);
  106. assert(result.keyNum_ == 1);
  107.  
  108. std::cout << "finished " << std::endl;
  109. return 0;
  110. }

运行截图

代码建立了一个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. js 中数字问题

    在js中请注意数字是没有长度的, 不能使用for循环遍历数字的长度 操作时通过.toString()把数字转换成字符串后通过字符串的.length 属性得到长度

  2. php工作笔记1-数组常用方法总结,二维数组的去重,上传图片到oss服务器

    1.二维数组去重,生成二维数组 private function array_unique_fb($array2D){ $data = array(); foreach($array2D  as $k ...

  3. html focus事件小学问

    focus事件千万不要有alert方法,不然在有些浏览器会进入死循环的.例如:$('#test').focus(function(){ alert('dead loop'); }); 在chrome下 ...

  4. KMP算法分析

    KMP是一种复杂度较低的字符串比较算法.基本思路是对欲匹配字符串进行预处理,分析当k位匹配时可以后移的位数,所得的数构成该字符串的特征向量. 求特征向量Next int* Next(string p) ...

  5. PHP简单利用token防止表单重复提交

    <?php /* * PHP简单利用token防止表单重复提交 * 此处理方法纯粹是为了给初学者参考 */ session_start(); function set_token() { $_S ...

  6. jquery实现章节目录效果

    <html><head><title>jquery实现章节目录效果</title> <script type="text/javascr ...

  7. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

  8. python3.5------用户的三次验证

    笔者QQ: 360212316 逻辑图 代码 #/usr/bin/python # -*- coding: utf-8 -*- lock = open("black_user_list.tx ...

  9. Elasticsearch升级1.5版本暴露jdk的bug

    把测试环境的Elasticsearch升级到1.5.1版本,启动的时候报错: [root@node2 elasticsearch-1.5.1]# bin/service/elasticsearch s ...

  10. RequireJS基础(三)

    这篇来写一个具有依赖的事件模块event. event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.d ...