Skip to content
Snippets Groups Projects
Commit dc4f6d4c authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Make createSymbolCodes static.

This allows us to build symbol map from the root of the tree.
parent fcc04ca7
Branches
Tags
No related merge requests found
...@@ -10,6 +10,15 @@ public class HuffmanTreeBuilder { ...@@ -10,6 +10,15 @@ public class HuffmanTreeBuilder {
private final int[] symbols; private final int[] symbols;
private final long[] symbolFrequencies; private final long[] symbolFrequencies;
public HuffmanTreeBuilder(final int codebookSize, final long[] symbolFrequencies) {
assert (codebookSize == symbolFrequencies.length) : "Array lengths mismatch";
this.symbolFrequencies = symbolFrequencies;
this.symbols = new int[codebookSize];
for (int i = 0; i < codebookSize; i++) {
symbols[i] = i;
}
}
public HuffmanTreeBuilder(final int[] symbols, final long[] symbolFrequencies) { public HuffmanTreeBuilder(final int[] symbols, final long[] symbolFrequencies) {
assert (symbols.length == symbolFrequencies.length) : "Array lengths mismatch"; assert (symbols.length == symbolFrequencies.length) : "Array lengths mismatch";
this.symbols = symbols; this.symbols = symbols;
...@@ -36,16 +45,18 @@ public class HuffmanTreeBuilder { ...@@ -36,16 +45,18 @@ public class HuffmanTreeBuilder {
queue.add(mergedNode); queue.add(mergedNode);
} }
root = queue.poll(); root = queue.poll();
buildHuffmanCodes(); symbolCodes = createSymbolCodes(root);
} }
private void buildHuffmanCodes() { public static HashMap<Integer, boolean[]> createSymbolCodes(final HuffmanNode node) {
symbolCodes = new HashMap<>(symbols.length); final HashMap<Integer, boolean[]> codes = new HashMap<>();
createSymbolCodesImpl(codes, node, new ArrayList<Boolean>());
traverseSymbolCodes(root, new ArrayList<Boolean>()); return codes;
} }
private void traverseSymbolCodes(final HuffmanNode currentNode, final ArrayList<Boolean> currentCode) { private static void createSymbolCodesImpl(final HashMap<Integer, boolean[]> codes,
final HuffmanNode currentNode,
final ArrayList<Boolean> currentCode) {
boolean inLeaf = true; boolean inLeaf = true;
final int bit = currentNode.getBit(); final int bit = currentNode.getBit();
if (bit != -1) { if (bit != -1) {
...@@ -54,12 +65,12 @@ public class HuffmanTreeBuilder { ...@@ -54,12 +65,12 @@ public class HuffmanTreeBuilder {
if (currentNode.rightChild != null) { if (currentNode.rightChild != null) {
final ArrayList<Boolean> codeCopy = new ArrayList<Boolean>(currentCode); final ArrayList<Boolean> codeCopy = new ArrayList<Boolean>(currentCode);
traverseSymbolCodes(currentNode.rightChild, codeCopy); createSymbolCodesImpl(codes, currentNode.rightChild, codeCopy);
inLeaf = false; inLeaf = false;
} }
if (currentNode.leftChild != null) { if (currentNode.leftChild != null) {
final ArrayList<Boolean> codeCopy = new ArrayList<Boolean>(currentCode); final ArrayList<Boolean> codeCopy = new ArrayList<Boolean>(currentCode);
traverseSymbolCodes(currentNode.leftChild, codeCopy); createSymbolCodesImpl(codes, currentNode.leftChild, codeCopy);
inLeaf = false; inLeaf = false;
} }
...@@ -71,9 +82,8 @@ public class HuffmanTreeBuilder { ...@@ -71,9 +82,8 @@ public class HuffmanTreeBuilder {
for (int i = 0; i < finalSymbolCode.length; i++) { for (int i = 0; i < finalSymbolCode.length; i++) {
finalSymbolCode[i] = currentCode.get(i); finalSymbolCode[i] = currentCode.get(i);
} }
symbolCodes.put(currentNode.getSymbol(), finalSymbolCode); codes.put(currentNode.getSymbol(), finalSymbolCode);
} }
} }
private PriorityQueue<HuffmanNode> buildPriorityQueue() { private PriorityQueue<HuffmanNode> buildPriorityQueue() {
...@@ -108,4 +118,8 @@ public class HuffmanTreeBuilder { ...@@ -108,4 +118,8 @@ public class HuffmanTreeBuilder {
assert (root != null) : "Huffman tree was not build yet"; assert (root != null) : "Huffman tree was not build yet";
return new HuffmanDecoder(root); return new HuffmanDecoder(root);
} }
public HuffmanNode getRoot() {
return root;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment