From 454a2b8ae7f97a97789e9cd4e8eef7989348cf3a Mon Sep 17 00:00:00 2001 From: William Jacobs Date: Sat, 16 Mar 2019 14:17:40 -0400 Subject: [PATCH] Minor readability improvements This makes various minor improvements to readability and implementation. --- .gitignore | 2 +- README.md | 1 + pom.xml | 2 +- .../btrekkie/red_black_node/RedBlackNode.java | 54 +++++++++++------- .../github/btrekkie/tree_list/TreeList.java | 7 ++- target/RedBlackNode-1.0.0.jar | Bin 20851 -> 0 bytes target/RedBlackNode-1.0.1.jar | Bin 0 -> 20859 bytes 7 files changed, 40 insertions(+), 26 deletions(-) delete mode 100644 target/RedBlackNode-1.0.0.jar create mode 100644 target/RedBlackNode-1.0.1.jar diff --git a/.gitignore b/.gitignore index 67fae9804..0c2ab5325 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,5 @@ hs_err_pid* .DS_Store -target +target/** !target/RedBlackNode*.jar diff --git a/README.md b/README.md index 39bf14c85..4a5080399 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ data and augmentation information to each node. # Limitations * The values of the tree must be stored in the non-leaf nodes. `RedBlackNode` does not support use cases where the values must be stored in the leaf nodes. + (Note that many data structures can be implemented with either approach.) * Augmentations that depend on information stored in a node's ancestors are not (easily) supported. For example, augmenting each node with the number of nodes in the left subtree is not (easily and efficiently) supported, because in diff --git a/pom.xml b/pom.xml index c6a125803..9dd63689b 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.github.btrekkie.red_black_node RedBlackNode - 1.0.0 + 1.0.1 RedBlackNode Java implementation of augmented red-black trees. Easily maintain custom augmentation information by subclassing RedBlackNode: the base class does the work for you. diff --git a/src/main/java/com/github/btrekkie/red_black_node/RedBlackNode.java b/src/main/java/com/github/btrekkie/red_black_node/RedBlackNode.java index b604d5267..7777b7361 100644 --- a/src/main/java/com/github/btrekkie/red_black_node/RedBlackNode.java +++ b/src/main/java/com/github/btrekkie/red_black_node/RedBlackNode.java @@ -269,6 +269,7 @@ public abstract class RedBlackNode> implements Compara grandparent.left.isRed = false; grandparent.right.isRed = false; grandparent.isRed = true; + if (changed) { changed = parent.augment(); if (changed) { @@ -288,6 +289,7 @@ public abstract class RedBlackNode> implements Compara node = parent; parent = node.parent; } + if (parent.left == node) { boolean grandparentChanged = grandparent.rotateRight(); if (augment) { @@ -299,6 +301,7 @@ public abstract class RedBlackNode> implements Compara changed = grandparentChanged; } } + parent.isRed = false; grandparent.isRed = true; node = parent; @@ -366,8 +369,8 @@ public abstract class RedBlackNode> implements Compara * solitary node that does not belong to any tree, and we ignore its initial "parent", "left", "right", and isRed * fields. * - * If it is not efficient or convenient for a subclass to find the location for a node using a Comparator, then it - * should manually add the node to the appropriate location, color it red, and call fixInsertion(). + * If it is not efficient or convenient to find the location for a node using a Comparator, then you should manually + * add the node to the appropriate location, color it red, and call fixInsertion(). * * @param newNode The node to insert. * @param allowDuplicates Whether to insert newNode if there is an equal node in the tree. To check whether we @@ -544,6 +547,7 @@ public abstract class RedBlackNode> implements Compara } } + // Update augmentation info N parent = sibling.parent; if (changed && parent != null) { if (!haveAugmentedParent) { @@ -594,6 +598,7 @@ public abstract class RedBlackNode> implements Compara } if (child != null) { + // Replace this node with its child child.parent = parent; if (parent != null) { if (parent.left == this) { @@ -603,6 +608,7 @@ public abstract class RedBlackNode> implements Compara } } child.isRed = false; + if (child.parent != null) { N parent; for (parent = child.parent; parent != null; parent = parent.parent) { @@ -612,6 +618,7 @@ public abstract class RedBlackNode> implements Compara } } } else if (parent != null) { + // Replace this node with a leaf node N leaf = left; N parent = this.parent; N sibling; @@ -622,6 +629,7 @@ public abstract class RedBlackNode> implements Compara parent.right = leaf; sibling = parent.left; } + if (!isRed) { RedBlackNode siblingNode = sibling; siblingNode.fixSiblingDeletion(); @@ -704,6 +712,7 @@ public abstract class RedBlackNode> implements Compara N left = createTree(iterator, (size - 1) / 2, height - 1, leaf); N node = iterator.next(); N right = createTree(iterator, size / 2, height - 1, leaf); + node.isRed = height % 4 == 1; node.left = left; node.right = right; @@ -713,6 +722,7 @@ public abstract class RedBlackNode> implements Compara if (!right.isLeaf()) { right.parent = node; } + node.augment(); return node; } @@ -732,10 +742,12 @@ public abstract class RedBlackNode> implements Compara if (size == 0) { return leaf; } + int height = 0; for (int subtreeSize = size; subtreeSize > 0; subtreeSize /= 2) { height++; } + N node = createTree(nodes.iterator(), size, height, leaf); node.parent = null; node.isRed = false; @@ -866,10 +878,10 @@ public abstract class RedBlackNode> implements Compara /** * Splits the tree rooted at this node into two trees, so that the first element of the return value is the root of * a tree consisting of the nodes that were before the specified node, and the second element of the return value is - * the root of a tree consisting of the nodes that were equal to or after the specified node. This method assumes - * that this node is the root. It assumes that this is in the same tree as splitNode. It takes O(log N) time. It - * is considerably more efficient than removing all of the elements after splitNode and then creating a new tree - * from those nodes. + * the root of a tree consisting of the nodes that were equal to or after the specified node. This method is + * destructive, meaning it does not preserve the original tree. It assumes that this node is the root and is in the + * same tree as splitNode. It takes O(log N) time. It is considerably more efficient than removing all of the + * nodes at or after splitNode and then creating a new tree from those nodes. * @param The node at which to split the tree. * @return An array consisting of the resulting trees. */ @@ -895,6 +907,9 @@ public abstract class RedBlackNode> implements Compara if (parent != null) { throw new IllegalArgumentException("This is not the root of a tree"); } + if (isLeaf() || splitNode.isLeaf()) { + throw new IllegalArgumentException("The root or the split node is a leaf"); + } // Create an array containing the path from the root to splitNode int depth = 1; @@ -905,8 +920,7 @@ public abstract class RedBlackNode> implements Compara if (parent != this) { throw new IllegalArgumentException("The split node does not belong to this tree"); } - @SuppressWarnings("unchecked") - N[] path = (N[])Array.newInstance(getClass(), depth); + RedBlackNode[] path = new RedBlackNode[depth]; for (parent = splitNode; parent != null; parent = parent.parent) { depth--; path[depth] = parent; @@ -1052,22 +1066,18 @@ public abstract class RedBlackNode> implements Compara } // Add lastPivot to the post-split tree - if (last == null) { - last = leaf; - } else { - lastPivot.isRed = true; - lastPivot.parent = lastParent; - if (lastParent != null) { - lastParent.left = lastPivot; - } - lastPivot.left = leaf; - lastPivot.right = leaf; - lastPivot.fixInsertionWithoutGettingRoot(false); - for (last = lastPivot; last.parent != null; last = last.parent) { - last.augment(); - } + lastPivot.isRed = true; + lastPivot.parent = lastParent; + if (lastParent != null) { + lastParent.left = lastPivot; + } + lastPivot.left = leaf; + lastPivot.right = leaf; + lastPivot.fixInsertionWithoutGettingRoot(false); + for (last = lastPivot; last.parent != null; last = last.parent) { last.augment(); } + last.augment(); @SuppressWarnings("unchecked") N[] result = (N[])Array.newInstance(getClass(), 2); diff --git a/src/main/java/com/github/btrekkie/tree_list/TreeList.java b/src/main/java/com/github/btrekkie/tree_list/TreeList.java index 41e411d91..3201bbd23 100644 --- a/src/main/java/com/github/btrekkie/tree_list/TreeList.java +++ b/src/main/java/com/github/btrekkie/tree_list/TreeList.java @@ -140,9 +140,8 @@ public class TreeList extends AbstractList { public T remove(int index) { TreeListNode node = getNode(index); modCount++; - T value = node.value; root = node.remove(); - return value; + return node.value; } @Override @@ -151,6 +150,7 @@ public class TreeList extends AbstractList { throw new IndexOutOfBoundsException("Index " + index + " is not in the range [0, " + root.size + "]"); } modCount++; + if (values.isEmpty()) { return false; } else { @@ -325,6 +325,7 @@ public class TreeList extends AbstractList { } else if (modCount != TreeList.this.modCount) { throw new ConcurrentModificationException(); } + haveCalledNextOrPrevious = true; justCalledNext = true; haveModified = false; @@ -357,6 +358,7 @@ public class TreeList extends AbstractList { } else if (modCount != TreeList.this.modCount) { throw new ConcurrentModificationException(); } + haveCalledNextOrPrevious = true; justCalledNext = false; haveModified = false; @@ -380,6 +382,7 @@ public class TreeList extends AbstractList { } else if (modCount != TreeList.this.modCount) { throw new ConcurrentModificationException(); } + if (justCalledNext) { prevNode.value = value; } else { diff --git a/target/RedBlackNode-1.0.0.jar b/target/RedBlackNode-1.0.0.jar deleted file mode 100644 index 0b2b3dbf9abb7047d7f8564c2ece619173236ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20851 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 Tv$BDV7Y4#IAnQ5M0tN;E1h=tA diff --git a/target/RedBlackNode-1.0.1.jar b/target/RedBlackNode-1.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..e73187bc816f0f9a67056acbaf745c6e4bad9181 GIT binary patch literal 20859 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 literal 0 HcmV?d00001