Class IntArrayRBTcommon
java.lang.Object
org.apache.uima.internal.util.rb_trees.IntArrayRBTcommon
- Direct Known Subclasses:
Int2IntRBT
,IntArrayRBT
Common part of Red-black tree implementation based on integer arrays. Preliminary performance
measurements on j2se 1.4 indicate that the performance improvement as opposed to an object-based
implementation are miniscule. This seems to indicate a much improved object creation handling in
this vm. However the space improvements are substantial.
-
Field Summary
Modifier and TypeFieldDescriptionprotected static final boolean
protected boolean[]
protected static final int
int
protected final int
protected final int
protected int[]
klrp: Key, Left, Right, Parent Each "node" has a node address.protected int[]
protected int[]
protected int[]
protected static final int
protected static final int
protected final int
protected int
static final int
protected static final boolean
protected int
protected int
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected int
compare
(int v1, int v2) final boolean
contains
(int k) final boolean
containsKey
(int k) protected void
deleteFixup
(int x) protected void
deleteNode
(int z) delete node z Step 1: locate a node to delete at the bottom of the tree.protected final int[]
ensureArrayCapacity
(int[] array, int newSize) protected void
ensureCapacityKlrp
(int requiredSize) There are two strategies for storing data, controlled by useklrp.int
findInsertionPoint
(int k) Find the node such that key[node] ≥ k and key[previous(node)] < k.int
findInsertionPointCmn
(int k, boolean moveToLeftmost) int
findInsertionPointNoDups
(int k) Find the node such that key[node] ≥ k and key[previous(node)] < k.int
findKey
(int k) protected int
findKeyDown
(int k, int node) void
flush()
final int
protected int
getKeyForNode
(int node) protected int
getLeft
(int node) protected int
getParent
(int node) protected int
getRight
(int node) protected int
getXXX
(int node, int offset) protected void
initVars()
protected final void
leftRotate
(int x) int
maxDepth()
protected int
maxDepth
(int node, int depth) int
minDepth()
protected int
minDepth
(int node, int depth) protected int
newNode
(int k) final int
nextNode
(int node) Method: if there's a right descendant, return the left-most chain down on that link Else, go up until parent has a right descendant not the previous, and return that.protected int
nextPowerOf2
(int v) int
nodeDepth
(int k) protected int
nodeDepth
(int node, int depth, int k) final int
previousNode
(int node) Method: if there's a left descendant, go to the right-most bottom of that Otherwise, ascend up until the parent's left descendant isn't the previous linkfinal void
protected final void
printKeys
(int node, int offset, StringBuilder buf) protected final void
rightRotate
(int x) protected boolean
satisfiesRBProps
(int node, int blackDepth, int currentBlack) boolean
protected final void
setAsRoot
(int x) protected int
setLeft
(int node, int value) protected int
setParent
(int node, int value) protected int
setRight
(int node, int value) protected void
protected int
setXXX
(int node, int offset, int value) final int
size()
-
Field Details
-
klrp
protected int[] klrpklrp: Key, Left, Right, Parent Each "node" has a node address. The Left, Right, and Parent are in terms of the the node address. The key is arbitrary, but kept in sorted order. A global, "root" has the node address of the root node. The range of possible nodes is 0 to Integer.MAX_VALUE, but 0 is reserved as NIL -
klrp1
protected int[] klrp1 -
klrp2
protected int[] klrp2 -
klrp3
protected int[] klrp3 -
MAXklrp0
protected static final int MAXklrp0- See Also:
-
MAXklrpMask
protected static final int MAXklrpMask- See Also:
-
color
protected boolean[] color -
next
protected int next -
size
protected int size -
root
protected int root -
greatestNode
public int greatestNode -
default_size
protected static final int default_size- See Also:
-
initialSize
protected final int initialSize -
growth_factor
protected final int growth_factor- See Also:
-
multiplication_limit
protected final int multiplication_limit- See Also:
-
NIL
public static final int NIL- See Also:
-
red
protected static final boolean red- See Also:
-
black
protected static final boolean black- See Also:
-
-
Constructor Details
-
IntArrayRBTcommon
public IntArrayRBTcommon()Constructor for IntArrayRBT. -
IntArrayRBTcommon
public IntArrayRBTcommon(int initialSize)
-
-
Method Details
-
getXXX
protected int getXXX(int node, int offset) -
setXXX
protected int setXXX(int node, int offset, int value) -
getLeft
protected int getLeft(int node) -
setLeft
protected int setLeft(int node, int value) -
getRight
protected int getRight(int node) -
setRight
protected int setRight(int node, int value) -
getParent
protected int getParent(int node) -
setParent
protected int setParent(int node, int value) - Parameters:
node
- -value
- -- Returns:
- the value
-
getKeyForNode
protected int getKeyForNode(int node) -
nextPowerOf2
protected int nextPowerOf2(int v) -
setupArrays
protected void setupArrays() -
initVars
protected void initVars() -
flush
public void flush() -
size
public final int size() -
ensureCapacityKlrp
protected void ensureCapacityKlrp(int requiredSize) There are two strategies for storing data, controlled by useklrp. If useklrp, then 4 elements are put together into one int vector, taking 4 words per element. Other elements are kept in their own vectors. The growth strategy for the 4-element one is to a) start at some minimum (a power of 2) b) grow by doubling up to 2 * 1024 *1024 c) grow by adding 2 *1024 * 1024, until d) reaching the maximum size (the max index will be 1 less) e) when that size is reached, the next int[] is set up with the minimum, and it grows as above. The test for growth and growing is made individually for the different parts. For color (a boolean), the size for stopping doubling is 32 * 2 * 1024 * 1024, so the # of words is the same.- Parameters:
requiredSize
- -
-
newNode
protected int newNode(int k) -
setAsRoot
protected final void setAsRoot(int x) -
ensureArrayCapacity
protected final int[] ensureArrayCapacity(int[] array, int newSize) - Parameters:
array
- - the array to expand - may be klrp0, 1, 2, 3, etc.newSize
- = the total size - if in parts, the size of the part- Returns:
- expanded array
-
leftRotate
protected final void leftRotate(int x) -
rightRotate
protected final void rightRotate(int x) -
findKey
public int findKey(int k) - Parameters:
k
- -- Returns:
- the first node such that k = key[node].
-
findKeyDown
protected int findKeyDown(int k, int node) -
findInsertionPoint
public int findInsertionPoint(int k) Find the node such that key[node] ≥ k and key[previous(node)] < k. If k is less than all the nodes, then the first node is returned If k is greater than all the nodes, then NIL is returned (invalid signal)- Parameters:
k
- the key- Returns:
- the index of the node, or NIL if k > all keys
-
findInsertionPointNoDups
public int findInsertionPointNoDups(int k) Find the node such that key[node] ≥ k and key[previous(node)] < k.- Parameters:
k
- -- Returns:
- the node such that key[node] ≥ k and key[previous(node)] < k.
-
findInsertionPointCmn
public int findInsertionPointCmn(int k, boolean moveToLeftmost) -
containsKey
public final boolean containsKey(int k) -
contains
public final boolean contains(int k) -
getFirstNode
public final int getFirstNode() -
nextNode
public final int nextNode(int node) Method: if there's a right descendant, return the left-most chain down on that link Else, go up until parent has a right descendant not the previous, and return that.- Parameters:
node
- starting point- Returns:
- the node logically following this one.
-
previousNode
public final int previousNode(int node) Method: if there's a left descendant, go to the right-most bottom of that Otherwise, ascend up until the parent's left descendant isn't the previous link- Parameters:
node
- the current node index- Returns:
- the previous node index or NIL
-
deleteNode
protected void deleteNode(int z) delete node z Step 1: locate a node to delete at the bottom of the tree. Bottom means left or right (or both) descendant is NIL. There are 2 cases: either the node to delete is z, or the node is the nextNode. If z has one or both descendants NIL, then it's the one to delete. Otherwise, the next node which is found by descending right then left until reaching the bottom (left = 0) node. y is node to remove from the tree. x is the non-NIL descendant of y (if one exists). It will be reparented to y's parent, and y's parent's left or right will point to it, skipping over y.- Parameters:
z
- node to be removed, logically
-
deleteFixup
protected void deleteFixup(int x) -
compare
protected int compare(int v1, int v2) -
satisfiesRedBlackProperties
public boolean satisfiesRedBlackProperties() -
satisfiesRBProps
protected boolean satisfiesRBProps(int node, int blackDepth, int currentBlack) -
maxDepth
public int maxDepth() -
minDepth
public int minDepth() -
nodeDepth
public int nodeDepth(int k) -
nodeDepth
protected int nodeDepth(int node, int depth, int k) -
maxDepth
protected int maxDepth(int node, int depth) -
minDepth
protected int minDepth(int node, int depth) -
printKeys
public final void printKeys() -
printKeys
-