Я из Колумбии, мой английский sh не совершенен, и в этот момент мне нужно помочь с проблемой кодирования Хаффмана, и мне нужно составить программу для пункта a, следующее упражнение .
Предположим, символы a, b, c, d, e встречаются с частотами 1 / 2,1 / 4,1 / 8,1 / 16,1 / 16 соответственно. а) Что такое кодировка Хаффмана в алфавите? (b) Если это кодирование применяется к файлу, состоящему из 1 000 000 символов с заданными частотами, какова длина этого кодированного файла в битах?
У меня есть половина точки A), у меня есть программа, которая выдает мне следующее
TreeMap
Key: 0.125 Value: [0.0625, 0.0625]
Key: 0.25 Value: [0.125, 0.125]
Key: 0.5 Value: [0.25, 0.25]
Я программирую на java и это моя программа
public class Huffman {
public static void main(String[] args) throws Exception {
Scanner sn = new Scanner(System.in);
double [] Arrayfrequencies = {0.5,0.25,0.125,0.0625,0.0625};
TreeMap<Double, ArrayList<Double>> map =new TreeMap<Double, ArrayList<Double>>();
System.out.println("Frecuencias");
print(Arrayfrequencies);
System.out.println("TreeMap");
// imprimo valores del TreeMap
printMap(huffman(Arrayfrequencies,map));
}
static TreeMap<Double, ArrayList<Double>> huffman(double [] Arrayfrequencies, TreeMap<Double, ArrayList<Double>> map) {
// arreglos donde guardo los datos despues de la suma
double[] parents = new double[Arrayfrequencies.length-1];
if(parents.length ==1 ) return map;
// ordeno las frecuencias
Arrays.sort(Arrayfrequencies);
double add = 0;
// hago la suma de los dos primeros
add = Arrayfrequencies[0] + Arrayfrequencies[1];
// guardar los vecinos de la suma
ArrayList<Double> list = new ArrayList<Double>();
list.add(Arrayfrequencies[0]);
list.add(Arrayfrequencies[1]);
map.put(add, list);
for (int i = 2,j = 0; i <=parents.length; i++,j++) {
parents[j]=Arrayfrequencies[i];
}
parents[parents.length-1] = add;
Arrays.parallelSort(parents);
return huffman(parents,map);
}
static void print(double [] array) {
for (Double frequencie : array) {
System.out.print(frequencie + " ");
}
System.out.println();
}
static void printMap(TreeMap<Double, ArrayList<Double>> map) {
for (Entry<Double, ArrayList<Double>> data : map.entrySet()) {
System.out.println("Key: " + data.getKey() + " Value: " + data.getValue().toString());
}
}
}