TỔNG HỢP HƠN 100 ĐỀ THI THỬ TỐT NGHIỆP THPT TOÁN 2024 - TỪ CÁC TRƯỜNG, TRƯỜNG...
write a java program related to Huffman coding.SolutionThe Jav.pdf
1. write a java program related to Huffman coding.
Solution
The Java program for Huffman coding is as below:
public final class Huffman
{
private Huffman() {};
private static class HuffmanNode
{
char ch;
int frequency;
HuffmanNode left;
HuffmanNode right;
HuffmanNode(char ch, int frequency, HuffmanNode left, HuffmanNode right) {
this.ch = ch;
this.frequency = frequency;
this.left = left;
this.right = right;
}
}
private static class HuffManComparator implements Comparator
{
@Override
public int compare(HuffmanNode node1, HuffmanNode node2)
{
return node1.frequency - node2.frequency;
}
}
public static void compress(String sentence) throws FileNotFoundException, IOException {
if (sentence == null) {
throw new NullPointerException("Input sentence cannot be null.");
}
if (sentence.length() == 0)
{
2. throw new IllegalArgumentException("The string should atleast have 1 character.");
}
final Map charFreq = getCharFrequency(sentence);
final HuffmanNode root = buildTree(charFreq);
final Map charCode = generateCodes(charFreq.keySet(), root);
final String encodedMessage = encodeMessage(charCode, sentence);
serializeTree(root);
serializeMessage(encodedMessage);
}
private static Map getCharFrequency(String sentence)
{
final Map map = new HashMap();
for (int i = 0; i < sentence.length(); i++) {
char ch = sentence.charAt(i);
if (!map.containsKey(ch))
{
map.put(ch, 1);
}
else
{
int val = map.get(ch);
map.put(ch, ++val);
}
}
return map;
}
private static HuffmanNode buildTree(Map map)
{
final Queue nodeQueue = createNodeQueue(map);
while (nodeQueue.size() > 1)
{
final HuffmanNode node1 = nodeQueue.remove();
final HuffmanNode node2 = nodeQueue.remove();
HuffmanNode node = new HuffmanNode('0', node1.frequency + node2.frequency, node1,
node2);
nodeQueue.add(node);
3. }
return nodeQueue.remove();
}
private static Queue createNodeQueue(Map map) {
final Queue pq = new PriorityQueue(11, new HuffManComparator());
for (Entry entry : map.entrySet())
{
pq.add(new HuffmanNode(entry.getKey(), entry.getValue(), null, null));
}
return pq;
}
private static Map generateCodes(Set chars, HuffmanNode node) {
final Map map = new HashMap();
doGenerateCode(node, map, "");
return map;
}
private static void doGenerateCode(HuffmanNode node, Map map, String s)
{
if (node.left == null && node.right == null)
{
map.put(node.ch, s);
return;
}
doGenerateCode(node.left, map, s + '0');
doGenerateCode(node.right, map, s + '1' );
}
private static String encodeMessage(Map charCode, String sentence) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < sentence.length(); i++) {
stringBuilder.append(charCode.get(sentence.charAt(i)));
}
return stringBuilder.toString();
}
private static void serializeTree(HuffmanNode node) throws FileNotFoundException,
IOException {
final BitSet bitSet = new BitSet();