B树,B+树,B*树
来源:互联网 发布:中国实际领土知乎 编辑:程序博客网 时间:2024/05/22 14:39
第一个是B树,首先扩展一下Array
Array.prototype.center = function() {return Math.floor(this.length / 2);}Array.prototype.median = function() {return this.length > 0 ? this[this.center()] : null;}Array.prototype.first = function() {return this.length > 0 ? this[0] : null;}Array.prototype.last = function() {return this.length > 0 ? this[this.length-1] : null;}Array.prototype.findInsertPos = function(k) {if (this.length == 0) {return 0;}else if (k < this.first()) {return 0;}else if (k > this.last()) {return this.length;}else {for (var i=0; i<this.length-1; i++) {if ( k > this[i] && k < this[i+1]) {return i+1;}}}throw new Error();}Array.prototype.insert = function(k) {var p = this.findInsertPos(k);if (p >= this.length) this.push(k); else this.splice(p, 0, k);}
定义Node节点
Node = function() {this.keys = new Array();this.children = new Array(); // store node // for root ; for 2 | ceil(m / 2) < num < Mthis.parent = null;
定义画布
<svg id="c" width="100%" version="1.1" xmlns="http://www.w3.org/2000/svg" />
执行建立B树
t = new Tree();t.init();t.b();t.display("c");
建立B树
this.b = function() {for (var i=0 ; i<data.length; i++) {var d = data[i];var p = this.findLeaf(d);this.root = p.addKey(this.root, d);}}
添加过程
this.addKey = function(root, k) {this.keys.insert(k);if (this.keys.length > NUM) {root = this.split(root);}return root;}this.split = function(root) {var m = this.keys.median();var c = this.keys.center();var parent = this.parent;if (parent == null) {parent = new Node();root =parent;parent.children.push(this);this.parent = parent;}var la = this.keys.splice(0, c);var lc = this.children.splice(0, c+1);var l = new Node();l.keys = la;l.children = lc;for (var i=0; i<lc.length; i++) {lc[i].parent = l;}l.parent = parent;parent.addChild(m, l);root = this.parent.addKey(root, this.keys.shift());return root;}
显示如下图
F5
然后是B+树
定义Node节点
Node = function() {this.keys = new Array();this.children = new Array(); this.parent = null;this.next = null;
建立B+树
this.b1 = function() {for (var ij=0 ; ij<data.length; ij++) {var d = data[ij];var p = this.findLeaf(d);this.root = p.addKey(this.root, d);}}
添加节点过程
this.update = function(n) {var p = this.children.indexOf(n);if (this.keys[p] > n.keys.first()) {this.keys[p] = n.keys.first();if (this.parent != null) this.parent.update(this);}}this.addKey = function(root, k) {this.keys.insert(k);if (this.parent != null) this.parent.update(this);if (this.keys.length > NUM) {root = this.split(root);}return root;}this.split = function(root) {var m = this.keys.median();var c = this.keys.indexOf(m);var parent = this.parent;if (parent == null) {parent = new Node();root =parent;parent.children.push(this);this.parent = parent;parent.keys.push(this.keys.first());}var ra = this.keys.splice(c, this.keys.length - c);var rc = this.children.splice(c, this.children.length - c);var r = new Node();r.parent = parent;r.keys = ra;r.children = rc;for (var i=0; i<rc.length; i++) {rc[i].parent = r;}if (this.children.length == 0) {r.next = this.next;this.next = r;}var i = parent.keys.findInsertPos(m);parent.keys.splice(i,0,m);parent.children.splice(i,0,r);if (parent.keys.length > NUM) root = parent.split(root);return root;}
建立后显示下图
F5
然后是B*树
建立B*树
this.b2 = function() {for (var ij=0 ; ij<data.length; ij++) {var d = data[ij];var p = this.findLeaf(d);this.root = p.addKey(this.root, d);}}this.findLeaf = function(k) {var p = this.root;while (p.children.length != 0) {var b = false;for (var i=p.keys.length-1; i>=0 ; i--) {if (k > p.keys[i]) {p = p.children[i];b = true;break ;}}if (b == false) p = p.children.first();}return p;}
添加节点过程
this.update = function(n) {var p = this.children.indexOf(n);if (this.keys[p] > n.keys.first()) {this.keys[p] = n.keys.first();if (this.parent != null) this.parent.update(this);}}this.addKey = function(root, k) {this.keys.insert(k);if (this.parent != null) this.parent.update(this);if (this.next != null && this.keys.length > NUM && this.next.keys.length < NUM ) {var k = this.keys.splice(this.keys.length-1, 1)[0];root = this.next.addKey(root, k);}else if (this.keys.length > NUM) {root = this.split(root);}return root;}this.split = function(root) {var m = this.keys.median();var c = this.keys.indexOf(m);var parent = this.parent;if (parent == null) {parent = new Node();root =parent;parent.children.push(this);this.parent = parent;parent.keys.push(this.keys.first());}var ra = this.keys.splice(c, this.keys.length - c);var rc = this.children.splice(c, this.children.length - c);var r = new Node();r.parent = parent;r.keys = ra;r.children = rc;for (var i=0; i<rc.length; i++) {rc[i].parent = r;}r.next = this.next;this.next = r;var i = parent.keys.findInsertPos(m);parent.keys.splice(i,0,m);parent.children.splice(i,0,r);if (parent.keys.length > NUM) root = parent.split(root);return root;}
显示下图
F5
0 0
- B,B-,B+,B*树
- B-、B、B+、B*树
- B/B+/B*树
- B- ,B+ , B*树
- B , B+ ,B*树
- B-, B+,B* 树
- B树B-B+树
- B- B+ B*树 小结
- B 、B-、B+树总结
- B-、B+、B*树介绍
- B 树、 B- 树、 B+ 树、 B*
- B树、B-树、B+树、B*
- B树,B-,B+,B*树
- B树、B-、B+、B*树
- B树,B-,B+,B* 各种树
- B,B-,B+ 和B*树
- 辨析B树(B-、B+、B*)
- B树 B+树
- 理解zookeeper选举机制
- 对拍器
- shell编程条件语句
- 2017 年热门编程语言排行榜,你的语言上榜没?
- QEMU使用简介
- B树,B+树,B*树
- DenseNet-caffe
- PAT A1069 the black hole of numbers (20)
- CSS--Margin
- HDU 3400 Line belt
- 第一次安装android studio时候弹出unable to access android sdk add-on list解决方法
- vs2013 vs2015下,配置 QWebEngineView
- 排序算法 八种排序算法的分类
- 入职9个月总结-新的一年的规划