/* XXL: The eXtensible and fleXible Library for data processing
Copyright (C) 2000-2011 Prof. Dr. Bernhard Seeger
Head of the Database Research Group
Department of Mathematics and Computer Science
University of Marburg
Germany
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; If not, see <http://www.gnu.org/licenses/>.
http://code.google.com/p/xxl/
*/
package xxl.core.binarySearchTrees;
import xxl.core.functions.AbstractFunction;
import xxl.core.functions.Function;
import xxl.core.predicates.Predicate;
/**
* A binary tree where the balance of every subtree is bounded.
* The BBTree provides insertion and exactmatch search in O(log(n)) time.
* <br><br>
* For a detailed discussion see "Introduction to Algorithms", MIT Electrical Engineering
* and Computer Science, by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest.
*/
public class BBTree extends BinarySearchTree {
/**
* Returns a Factory-Method Function (Function x Function -> BinarySearchTree) that
* constructs new BBTrees.
*/
public static final Function FACTORY_METHOD = new AbstractFunction() {
public Object invoke (Object fixRotation, Object fixAggregate) {
return new BBTree((Predicate)fixRotation, (Function)fixAggregate);
}
};
/**
* Nodes in a BBTree are of the type BBTree.Node.
*/
protected class Node extends BinarySearchTree.Node {
/**
* The weight of the node.
*/
protected int weight = 2;
/**
* Creates a new Node.
*
* @param object The object to store in the node.
* @param parent The parent of the new node.
*/
Node (Object object, BinarySearchTree.Node parent) {
super(object, parent);
}
/* (non-Javadoc)
* @see xxl.core.binarySearchTrees.BinarySearchTree.Node#rotate()
*/
protected BinarySearchTree.Node rotate () {
int index = index();
Node parent = (Node)this.parent;
super.rotate();
parent.weight -= getWeight(children[index]);
weight += getWeight(parent.children[index^1]);
return this;
}
/* (non-Javadoc)
* @see xxl.core.binarySearchTrees.BinarySearchTree.Node#fix(int)
*/
protected void fix (int index) {
for (BinarySearchTree.Node node = this; node!=null; node = node.parent) {
index = getWeight(node.children[0])<getWeight(node.children[1])? 0: 1;
if (getWeight(node.children[index])<alpha*refreshWeight(node)) {
node = node.children[index^1];
if (getWeight(node.children[index])>d*getWeight(node))
node = node.children[index].rotate();
node.rotate();
}
}
}
}
/**
* Refreshs the weight information of the given node.
*
* @param node Node of the tree.
* @return The new weight of the node after the refresh.
*/
protected int refreshWeight (BinarySearchTree.Node node) {
return ((Node)node).weight = getWeight(node.children[0])+getWeight(node.children[1]);
}
/**
* Gives the weight of a node.
*
* @param node Node of the tree.
* @return The weight of the given node.
*/
protected int getWeight (BinarySearchTree.Node node) {
return node==null? 1: ((Node)node).weight;
}
/**
* Parameter alpha
*/
protected final double alpha;
/**
* Parameter d
*/
protected final double d;
/**
* Creates a BBTree.
*
* @param fixAggregate Predicate that is called when an aggregate information in
* the tree might be outdated.
* @param fixRotation Function that is called when a rotation has occured and rotation
* information in a node has to become fixed.
* @param alpha Parameter alpha.
* @param d Parameter d.
*/
public BBTree (Predicate fixAggregate, Function fixRotation, double alpha, double d) {
super(fixAggregate, fixRotation);
this.alpha = alpha;
this.d = d;
}
/**
* Creates a BBTree with default parameters.
* This constructor is equivalent to the call of
* <code>BBTree(fixAggregate,fixRotation,3.0/11.0, 6.0/10.0)</code>.
*
* @param fixAggregate Predicate that is called when an aggregate information in
* the tree might be outdated.
* @param fixRotation Function that is called when a rotation has occured and rotation
* information in a node has to become fixed.
*
*/
public BBTree (Predicate fixAggregate, Function fixRotation) {
this(fixAggregate, fixRotation, 3.0/11.0, 6.0/10.0);
}
/* (non-Javadoc)
* @see xxl.core.binarySearchTrees.BinarySearchTree#newNode(java.lang.Object, xxl.core.binarySearchTrees.BinarySearchTree.Node)
*/
public BinarySearchTree.Node newNode (Object object, BinarySearchTree.Node parent) {
return new Node(object, parent);
}
}