diff --git a/src/Main.java b/src/Main.java index 3506e0047568840168ee48f1e860093336834a5a..7851bcd2bccb242dd42c198f4679e1bea72f87ad 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,13 +1,23 @@ import java.io.IOException; +import java.util.Arrays; public class Main { public static void main(String[] args) throws IOException { - FileHandler fileHandler = new FileHandler("../data/graph"); + FileHandler fileHandler = new FileHandler("data/graph"); InputGraph inputGraph = fileHandler.parseInputGraph(); Graph g = inputGraph.getGraph(); System.out.println(g); TreeNode root = Graph.getCoTree(g); System.out.println(root); + + Tree tree = new Tree(root); + System.out.println("\nDepths:"); + System.out.println(tree.getStringRepresentation(node -> String.valueOf(node.getDepth()))); + tree.calculateIds(); + System.out.println("\nIDs:"); + System.out.println(tree.getStringRepresentation(node -> String.valueOf(node.getId()))); + System.out.println("\nComposite IDs:"); + System.out.println(tree.getStringRepresentation(node -> Arrays.toString(node.getCompositeId()))); } } diff --git a/src/NodeDesignator.java b/src/NodeDesignator.java new file mode 100644 index 0000000000000000000000000000000000000000..a6224ff1969631b62b17c103d4fdf2838ffc7578 --- /dev/null +++ b/src/NodeDesignator.java @@ -0,0 +1,3 @@ +public interface NodeDesignator { + public String designate(TreeNode treeNode); +} diff --git a/src/Tree.java b/src/Tree.java new file mode 100644 index 0000000000000000000000000000000000000000..998e8f0c893323e074fe934bc6ca23bfe802b1f6 --- /dev/null +++ b/src/Tree.java @@ -0,0 +1,74 @@ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class Tree { + + private TreeNode root; + private List> layers; + + public Tree(TreeNode root) { + this.root = root; + this.layers = new ArrayList<>(); + computeDepths(root); + } + + public TreeNode getRoot() { + return root; + } + + public void calculateIds() { + for (TreeNode leaf : layers.get(0)) { + leaf.setId(1); + } + AtomicInteger lastID = new AtomicInteger(1); // use AtomicInteger for thread safety + for (int depth = 1; depth < layers.size(); depth++) { + // sort children by composite ID + layers.get(depth).sort((t1, t2) -> compareIntArray(t1.getCompositeId(), t2.getCompositeId())); + // give first child in order its ID + layers.get(depth).get(0).setId(lastID.incrementAndGet()); + // iterate other children by order, increment ID only if compositeID is higher than before + for (int i = 1; i < layers.get(depth).size(); i++) { + int compareToPrevious = compareIntArray(layers.get(depth).get(i - 1).getCompositeId(), layers.get(depth).get(i).getCompositeId()); + if (compareToPrevious < 0) { + lastID.incrementAndGet(); + } else if (compareToPrevious > 0) { + throw new IllegalStateException("List of children was not iterated in order."); + } + layers.get(depth).get(i).setId(lastID.get()); + } + } + } + + public int computeDepths(TreeNode vertex) { + int depth = -1; + if (vertex.getChildren().isEmpty()) { + depth = 0; + } + else { + for (TreeNode child : vertex.getChildren()) { + depth = Math.max(depth,computeDepths(child)); + } + depth ++; + } + if (layers.size()()); + } + vertex.setDepth(depth); + layers.get(depth).add(vertex); + return depth; + } + + public int compareIntArray(int[] a, int[] b) { + if (a.length != b.length) return a.length - b.length; + for (int i = 0; i < a.length; i++) { + if (a[i] != b[i]) return a[i] - b[i]; + } + return 0; + } + + public String getStringRepresentation(NodeDesignator nodeDesignator) { + return root.getStringRepresentation(nodeDesignator); + } +} diff --git a/src/TreeNode.java b/src/TreeNode.java index c700984e58f1bbc75b8badc427f44872330e5c8e..e167abf166206528cd24ce353ab754361b452e06 100644 --- a/src/TreeNode.java +++ b/src/TreeNode.java @@ -7,6 +7,8 @@ public class TreeNode { private List children; private int label; + private int depth; + private int id; public TreeNode() { this.children = new ArrayList<>(); @@ -31,6 +33,7 @@ public class TreeNode { } public List getChildren() { + children.sort((c1, c2) -> Integer.compare(c2.id, c1.id)); return children; } @@ -42,24 +45,56 @@ public class TreeNode { this.label = label; } + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getDepth() { + return depth; + } + + public void setDepth(int depth) { + this.depth = depth; + } + @Override public String toString() { + return getStringRepresentation(n -> String.valueOf(n.label)); + } + + public String getStringRepresentation(NodeDesignator nodeDesignator) { StringBuilder buffer = new StringBuilder(50); - print(buffer, "", ""); + print(buffer, "", "", nodeDesignator); return buffer.toString(); } - private void print(StringBuilder buffer, String prefix, String childrenPrefix) { + public void print(StringBuilder buffer, String prefix, String childrenPrefix, NodeDesignator nodeDesignator) { buffer.append(prefix); - buffer.append(label); + buffer.append(nodeDesignator.designate(this)); buffer.append('\n'); for (Iterator it = children.iterator(); it.hasNext();) { TreeNode next = it.next(); if (it.hasNext()) { - next.print(buffer, childrenPrefix + "├── ", childrenPrefix + "│ "); + next.print(buffer, childrenPrefix + "├── ", childrenPrefix + "│ ", nodeDesignator); } else { - next.print(buffer, childrenPrefix + "└── ", childrenPrefix + " "); + next.print(buffer, childrenPrefix + "└── ", childrenPrefix + " ", nodeDesignator); } } } + + /** + * All IDs of descending nodes from this must be calculated before calling this method. + * @return An array representing the composite ID of this node. + */ + public int[] getCompositeId() { + int[] subID = new int[getChildren().size()]; + for (int i = 0; i < getChildren().size(); i++) { + subID[i] = getChildren().get(i).getId(); + } + return subID; + } } diff --git a/src/compile.bat b/src/compile.bat deleted file mode 100644 index 30f6945ea59ee9bc0eb46772040c5712accff10a..0000000000000000000000000000000000000000 --- a/src/compile.bat +++ /dev/null @@ -1 +0,0 @@ -java -jar omp4j-1.2.jar -d classes -v *.java \ No newline at end of file