B树,B+树,B*树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vcshcn/article/details/56495298

第一个是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 < M
	this.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





猜你喜欢

转载自blog.csdn.net/vcshcn/article/details/56495298