Question

In: Computer Science

Read through "The Huffman Code" on page 415 of the book. Write a program to implement...

Read through "The Huffman Code" on page 415 of the book.

Write a program to implement Huffman coding and decoding. It should do the following:

  • Accept a text message, possibly of more than one line.
  • Create a Huffman tree for this message.
  • Create a code table.
  • Encode the message into binary.
  • Decode the message from binary back to text.

in java please

Solutions

Expert Solution

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.Map.*;

class HuffmanNode implements Comparable<HuffmanNode> {
int frequency;
char data;
HuffmanNode left, right;

public int compareTo(HuffmanNode node) {
return frequency - node.frequency;
}
}

public class Solution
{
private static Map<Character, String> charPrefixHashMap = new HashMap<>();
   static HuffmanNode root;

   public static void main(String[] args) {

       String test = "This is a new message";
       System.out.println("Original Text = "+test);
       String s = encode(test);
       decode(s);

   }

   private static HuffmanNode buildTree(Map<Character, Integer> freq) {

       PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<>();
       Set<Character> keySet = freq.keySet();
       for (Character c : keySet) {

           HuffmanNode huffmanNode = new HuffmanNode();
           huffmanNode.data = c;
           huffmanNode.frequency = freq.get(c);
           huffmanNode.left = null;
           huffmanNode.right = null;
           priorityQueue.offer(huffmanNode);
       }
       assert priorityQueue.size() > 0;

       while (priorityQueue.size() > 1) {

           HuffmanNode x = priorityQueue.peek();
           priorityQueue.poll();

           HuffmanNode y = priorityQueue.peek();
           priorityQueue.poll();

           HuffmanNode sum = new HuffmanNode();

           sum.frequency = x.frequency + y.frequency;
           sum.data = '-';

           sum.left = x;

           sum.right = y;
           root = sum;

           priorityQueue.offer(sum);
       }

       return priorityQueue.poll();
   }


   private static void setPrefixCodes(HuffmanNode node, StringBuilder prefix) {

       if (node != null) {
           if (node.left == null && node.right == null) {
               charPrefixHashMap.put(node.data, prefix.toString());

           } else {
               prefix.append('0');
               setPrefixCodes(node.left, prefix);
               prefix.deleteCharAt(prefix.length() - 1);

               prefix.append('1');
               setPrefixCodes(node.right, prefix);
               prefix.deleteCharAt(prefix.length() - 1);
           }
       }

   }

   private static String encode(String test) {
       Map<Character, Integer> freq = new HashMap<>();
       for (int i = 0; i < test.length(); i++) {
           if (!freq.containsKey(test.charAt(i))) {
               freq.put(test.charAt(i), 0);
           }
           freq.put(test.charAt(i), freq.get(test.charAt(i)) + 1);
       }

//        System.out.println("Character Frequency Map = " + freq);
System.out.println("Code Table");
freq.entrySet().forEach(entry->{
System.out.println(entry.getKey() + " ------------------- " + entry.getValue());
});
       root = buildTree(freq);

       setPrefixCodes(root, new StringBuilder());
       System.out.println("Character Prefix Map = " + charPrefixHashMap);
       StringBuilder s = new StringBuilder();

       for (int i = 0; i < test.length(); i++) {
           char c = test.charAt(i);
           s.append(charPrefixHashMap.get(c));
       }

       return s.toString();
   }

   private static void decode(String s) {

       StringBuilder stringBuilder = new StringBuilder();

       HuffmanNode temp = root;

       System.out.println("Encoded: " + s);

       for (int i = 0; i < s.length(); i++) {
           int j = Integer.parseInt(String.valueOf(s.charAt(i)));

           if (j == 0) {
               temp = temp.left;
               if (temp.left == null && temp.right == null) {
                   stringBuilder.append(temp.data);
                   temp = root;
               }
           }
           if (j == 1) {
               temp = temp.right;
               if (temp.left == null && temp.right == null) {
                   stringBuilder.append(temp.data);
                   temp = root;
               }
           }
       }

       System.out.println("Decoded string is : " + stringBuilder.toString());

   }
}


Related Solutions

Read through "The Huffman Code" on page 415 of the book. Write a program to implement...
Read through "The Huffman Code" on page 415 of the book. Write a program to implement Huffman coding and decoding. It should do the following: Accept a text message, possibly of more than one line. Create a Huffman tree for this message. Create a code table. Encode the message into binary. Decode the message from binary back to text. in JAVA
Read through "The Huffman Code" on page 415 of the book. Write a program to implement...
Read through "The Huffman Code" on page 415 of the book. Write a program to implement Huffman coding and decoding. It should do the following: Accept a text message, possibly of more than one line. Create a Huffman tree for this message. Create a code table. Encode the message into binary. Decode the message from binary back to text.
Write a c or matlab text code(to be copied ) for Huffman coder and Huffman decoder...
Write a c or matlab text code(to be copied ) for Huffman coder and Huffman decoder that asks the user to enter the string and output the Huffman code for every letter and a code for encoding that will have every letter and its Huffman code and output all the possibilities for the real string. you must show a screen of an input and the output for both the encoder and the decoder
Write the code in C++. Write a program to implement Employee Directory. The main purpose of...
Write the code in C++. Write a program to implement Employee Directory. The main purpose of the class is to get the data, store it into a file, perform some operations and display data. For the purpose mentioned above, you should write a template class Directory for storing the data empID(template), empFirstName(string), empLastName(string), empContactNumber(string) and empAddress(string) of each Employee in a file EmployeeDirectory.txt. 1. Write a function Add to write the above mentioned contact details of the employee into EmployeeDirectory.txt....
Create a JAVA code program: Huffman code will be converted to its text equivalent Output an...
Create a JAVA code program: Huffman code will be converted to its text equivalent Output an error message if the input cannot be converted I can give an thumbs up! :)
Create a C++ program using native C++ (STL is acceptable) that produces Huffman code for a...
Create a C++ program using native C++ (STL is acceptable) that produces Huffman code for a string of text entered by the user. Must accept all ASCII characters. Provide an explanation for how you got frequencies of characters, how you sorted them, and how you got codes.
Read the Book "The Patient Will See you now", write a 4-5 page paper. I want...
Read the Book "The Patient Will See you now", write a 4-5 page paper. I want you to look closely at the areas discussed in this book, discuss what areas will work well and what types of medicine it will work well within. Please use APA formatting and cite your references.
Dr. Page believes that going through a training program will decrease weekly reading. College students read...
Dr. Page believes that going through a training program will decrease weekly reading. College students read a mean of 2.3 days a week with a variance of 0.49 days. Dr. Page's sample of 31 students read a mean of 1.9 days a week. What can be concluded with α = 0.01? a) What is the appropriate test statistic? ---Select--- na z-test one-sample t-test independent-samples t-test related-samples t-test b) Population: ---Select--- (reading) college students days in the week individuals exposed to...
Write an assembly program (Data and Code) that uses loop to read 10 numbers and output...
Write an assembly program (Data and Code) that uses loop to read 10 numbers and output the largest of those numbers, you can assume any length for those numbers. 80x86 assembly language
Write the code to implement the concept of inheritance forVehicles. You are required to implement inheritance...
Write the code to implement the concept of inheritance forVehicles. You are required to implement inheritance betweenclasses. You have to write four classes in C++ i.e. one superclass, two sub classes and one driver class. Vehicle is the super class whereas Bus and Truck are sub classesof Vehicle class. Transport is a driver class which contains mainmethod. Detailed description of Vehicle (Super class): The class Vehicle must have following attributes: 1. Vehicle model 2. Registration number 3. Vehicle speed (km/hour)...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT