Alguma explicação (Incremento direto no Array)

2 respostas
quil

Olá pessoal eu estava estudando esse código sobre a criação de uma arvore Huffman:

import java.util.*;

 
abstract class HuffmanTree implements Comparable<HuffmanTree> {
    public final int frequency; // the frequency of this tree
    public HuffmanTree(int freq) { frequency = freq; }//Fim do construtor HuffmanTree
 
    // compares on the frequency
    public int compareTo(HuffmanTree tree) {
        return frequency - tree.frequency;
    }//Fim do metodo compareTo
}//fim da classe Abstrata HuffmanTree
 
class HuffmanLeaf extends HuffmanTree {
    public final char value; // the character this leaf represents
 
    public HuffmanLeaf(int freq, char val) {
        super(freq);
        value = val;
    }//Fim do construtor
}//Fim da classe HuffmanLeaf
 
class HuffmanNode extends HuffmanTree {
    public final HuffmanTree left, right; // subtrees
 
    public HuffmanNode(HuffmanTree l, HuffmanTree r) {
        super(l.frequency + r.frequency);
        left = l;
        right = r;
    }//Fim do construtor
}//Fim da classe HuffmanNode
 
public class HuffmanCode {
    // input is an array of frequencies, indexed by character code
    public static HuffmanTree buildTree(int[] charFreqs) {
        PriorityQueue<HuffmanTree> trees = new PriorityQueue<HuffmanTree>();
        // initially, we have a forest of leaves
        // one for each non-empty character
        for (int i = 0; i < charFreqs.length; i++)
            if (charFreqs[i] > 0)
                trees.offer(new HuffmanLeaf(charFreqs[i], (char)i));
 
        assert trees.size() > 0;
        // loop until there is only one tree left
        while (trees.size() > 1) {
            // two trees with least frequency
            HuffmanTree a = trees.poll();
            HuffmanTree b = trees.poll();
 
            // put into new node and re-insert into queue
            trees.offer(new HuffmanNode(a, b));
        }//Fim do while
        return trees.poll();
    }//Fim do metodo buildTree
 
    public static void printCodes(HuffmanTree tree, StringBuffer prefix) {
        assert tree != null;
        if (tree instanceof HuffmanLeaf) {
            HuffmanLeaf leaf = (HuffmanLeaf)tree;
 
            // print out character, frequency, and code for this leaf (which is just the prefix)
            System.out.println(leaf.value + "\t" + leaf.frequency + "\t" + prefix);
 
        } else if (tree instanceof HuffmanNode) {
            HuffmanNode node = (HuffmanNode)tree;
 
            // traverse left
            prefix.append('0');
            printCodes(node.left, prefix);
            prefix.deleteCharAt(prefix.length()-1);
 
            // traverse right
            prefix.append('1');
            printCodes(node.right, prefix);
            prefix.deleteCharAt(prefix.length()-1);
        }
    }//Fim do metodo printCodes
 
    public static void main(String[] args) {
        String test = "this is an example for huffman encoding";
 
        // we will assume that all our characters will have
        // code less than 256, for simplicity
        int[] charFreqs = new int[256];
        // read each character and record the frequencies
        for (char c : test.toCharArray())
            charFreqs[c]++;
 
        // build tree
        HuffmanTree tree = buildTree(charFreqs);
 
        // print out results
        System.out.println("SYMBOL\tWEIGHT\tHUFFMAN CODE");
        printCodes(tree, new StringBuffer());
    }//fim do metodo main
}//fim da classe HuffmanCode
Eu estava quebrando a cabeça para entender o código quando eu me deparei com a seguinte linha:
// read each character and record the frequencies
        for (char c : test.toCharArray())
            charFreqs[c]++;

Eu que pensava já saber bastante sobre o uso do for e do incremento e decremento, e me deparei com esse código que ao meu ver parece estar contando a frequência da aparição de cada caractere direto em um array usando apenas o operador de incremento.

A minha duvida era a de saber como exatamente esse pequeno código
charFreqs[c]++;
esta fazendo para descobrir a frequência da aparição de cada caractere?

2 Respostas

AntonioDiego

Vamos supor que c seja o char 50 que deve ser alguma letra.
Toda vez que ele achar a letra que corresponde a 50 ele vai lá no registro do int que está no indice 50 e incrementa
no fim la vai estar contado a frequencia de cada char do 0 a 256

quil

Valeu AntonioDiego.

Agora que você falou eu percebi.

Por exemplo o caractere ‘A’ corresponde ao valor ''65" em Decimal na tabela ASCII.

Ou seja toda vez que estiver no índice “65” no “charFreqs” ele verifica se há um valor nesse índice e incrementa esse valor.

Valeu mesmo pela explicação AntonioDiego.
Eu só estranhei um pouco quando eu vi isso “charFreqs[c]++;” mas era algo tão simples e fácil de se usar.

Criado 2 de maio de 2014
Ultima resposta 3 de mai. de 2014
Respostas 2
Participantes 2