Кодирование Хаффмана в java с использованием TreeMap - PullRequest
0 голосов
/ 23 апреля 2020

Я из Колумбии, мой английский 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());
        }
    }
}
...