@Override public Integer read() { return helper.read(coreBlockInputStream); }
@Override public void write(final Integer value) { helper.write(coreBlockOutputStream, value); }
@Override public void write(final Byte value) { helper.write(coreBlockOutputStream, value); }
private static <T> void getBitCode(final HuffmanTree<T> tree, final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) { if (tree instanceof HuffmanLeaf) { final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree; final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>(); readyCode.bitCode = code.bitCode; readyCode.bitLength = code.bitLength; codes.put(leaf.value, readyCode); } else if (tree instanceof HuffmanNode) { final HuffmanNode<T> node = (HuffmanNode<T>) tree; // traverse left code.bitCode = code.bitCode << 1; code.bitLength++; getBitCode(node.left, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; // traverse right code.bitCode = code.bitCode << 1 | 1; code.bitLength++; getBitCode(node.right, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; } } }
public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) { final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>(); for (int i = 0; i < charFrequencies.length; i++) if (charFrequencies[i] > 0) list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i])); final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() { @Override public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) { return o1.frequency - o2.frequency; } }; while (list.size() > 1) { Collections.sort(list, comparator); // dumpList(list) ; final HuffmanTree<T> left = list.remove(); final HuffmanTree<T> right = list.remove(); list.add(new HuffmanNode<T>(left, right)); } return list.isEmpty() ? null : list.remove(); }
/** * Construct a Canonical Huffman Codec for Integer data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanIntegerCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final int[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanIntHelper(values, bitLengths); }
@Override public Byte read() { return helper.read(coreBlockInputStream); }
/** * Construct a Canonical Huffman Codec for Byte data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanByteCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final byte[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanByteHelper(values, bitLengths); }
final public long write(final BitOutputStream bitOutputStream, final byte value) throws IOException { final HuffmanBitCode code = valueToCode[value]; if (code.value != value) throw new RuntimeException(String.format( "Searching for %d but found %s.", value, code.toString())); bitOutputStream.write(code.bitCode, code.bitLength); // System.out.println("Writing: " + code.toString()); return code.bitLength; }
private static <T> void getBitCode(final HuffmanTree<T> tree, final HuffmanBitCode<T> code, final Map<T, HuffmanBitCode<T>> codes) { if (tree instanceof HuffmanLeaf) { final HuffmanLeaf<T> leaf = (HuffmanLeaf<T>) tree; final HuffmanBitCode<T> readyCode = new HuffmanBitCode<T>(); readyCode.bitCode = code.bitCode; readyCode.bitLength = code.bitLength; codes.put(leaf.value, readyCode); } else if (tree instanceof HuffmanNode) { final HuffmanNode<T> node = (HuffmanNode<T>) tree; // traverse left code.bitCode = code.bitCode << 1; code.bitLength++; getBitCode(node.left, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; // traverse right code.bitCode = code.bitCode << 1 | 1; code.bitLength++; getBitCode(node.right, code, codes); code.bitCode = code.bitCode >>> 1; code.bitLength--; } } }
public static <T> HuffmanTree<T> buildTree(final int[] charFrequencies, final T[] values) { final LinkedList<HuffmanTree<T>> list = new LinkedList<HuffmanTree<T>>(); for (int i = 0; i < charFrequencies.length; i++) if (charFrequencies[i] > 0) list.add(new HuffmanLeaf<T>(charFrequencies[i], values[i])); final Comparator<HuffmanTree<T>> comparator = new Comparator<HuffmanTree<T>>() { @Override public int compare(final HuffmanTree<T> o1, final HuffmanTree<T> o2) { return o1.frequency - o2.frequency; } }; while (list.size() > 1) { Collections.sort(list, comparator); // dumpList(list) ; final HuffmanTree<T> left = list.remove(); final HuffmanTree<T> right = list.remove(); list.add(new HuffmanNode<T>(left, right)); } return list.isEmpty() ? null : list.remove(); }
@Override public Integer read() { try { return helper.read(coreBlockInputStream); } catch (IOException e) { throw new RuntimeIOException(e); } }
@Override public void write(final Integer value) { try { helper.write(coreBlockOutputStream, value); } catch (IOException e) { throw new RuntimeIOException(e); } }
@Override public void write(final Byte value) { try { helper.write(coreBlockOutputStream, value); } catch (IOException e) { throw new RuntimeIOException(e); } }
/** * Construct a Canonical Huffman Codec for Integer data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanIntegerCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final int[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanIntHelper(values, bitLengths); }
@Override public Byte read() { try { return helper.read(coreBlockInputStream); } catch (IOException e) { throw new RuntimeIOException(e); } }
/** * Construct a Canonical Huffman Codec for Byte data * * @param coreBlockInputStream the input bitstream to read from * @param coreBlockOutputStream the output bitstream to write to * @param values the alphabet (provided as Integers) * @param bitLengths the number of bits of symbol's huffman code */ public CanonicalHuffmanByteCodec(final BitInputStream coreBlockInputStream, final BitOutputStream coreBlockOutputStream, final byte[] values, final int[] bitLengths) { super(coreBlockInputStream, coreBlockOutputStream); helper = new HuffmanByteHelper(values, bitLengths); }
final public long write(final BitOutputStream bitOutputStream, final byte value) { final HuffmanBitCode code = valueToCode[value]; if (code.value != value) throw new RuntimeException(String.format( "Searching for %d but found %s.", value, code.toString())); bitOutputStream.write(code.bitCode, code.bitLength); // System.out.println("Writing: " + code.toString()); return code.bitLength; }
public static <T> void getValuesAndBitLengths(final List<T> values, final List<Integer> lens, final HuffmanTree<T> tree) { final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>(); getBitCode(tree, new HuffmanBitCode<T>(), codes); for (final T value : codes.keySet()) { final HuffmanBitCode<T> code = codes.get(value); values.add(value); lens.add(code.bitLength); } }
public static <T> void getValuesAndBitLengths(final List<T> values, final List<Integer> lens, final HuffmanTree<T> tree) { final TreeMap<T, HuffmanBitCode<T>> codes = new TreeMap<T, HuffmanBitCode<T>>(); getBitCode(tree, new HuffmanBitCode<T>(), codes); for (final T value : codes.keySet()) { final HuffmanBitCode<T> code = codes.get(value); values.add(value); lens.add(code.bitLength); } }