luishenriique

Atividade 07 - TAP II

Oct 31st, 2013
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.55 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3.  
  4. public class MainCls {
  5.  
  6.     /**
  7.      * Função para transformar a String em um vetor com a quantidade de cada
  8.      * caracter correspondente a tabela ASCII
  9.      *
  10.      * @param txt
  11.      *            String que será aplicada o Huffman, passada pelo usuário
  12.      * @return Vetor da tabela ASCII contendo a quantidade de cada caracter na
  13.      *         String em sua respectiva posição
  14.      */
  15.     public static int[] frequencia(String txt) {
  16.         int vet[] = new int[256];
  17.  
  18.         for (int i = 0; i < txt.length(); i++) {
  19.             char ch = txt.charAt(i);
  20.             vet[ch]++;
  21.         }
  22.         return vet;
  23.     }
  24.  
  25.     /**
  26.      * Função para imprimir o código Huffman de cada caracter
  27.      *
  28.      * @param no
  29.      *            Nó raiz da árvore
  30.      */
  31.     public static void preOrdem(Node<Integer> no) {
  32.         // Condição de parada
  33.         if (no == null)
  34.             return;
  35.         // 1) Tratar raiz
  36.         // Se o valor da esquerda e direita forem nulos
  37.         if (no.getEsq() == null && no.getDir() == null) {
  38.             // Imprimimos o caracter, sua quantidade e seu código Huffman
  39.             System.out.println("  " + no.getSimbolo() + "  \t  " + no.getQtd()
  40.                     + "\t " + no.getAux());
  41.         }
  42.         // 2) Percorrer sae
  43.         // Se o nó esquerdo não for nulo
  44.         if (no.getEsq() != null) {
  45.             // Adicionamos o auxiliar 0 junto ao auxiliar do seu pai
  46.             no.getEsq().setAux(no.getAux() + "0");
  47.             // Chamamos a função novamente passando o nó esquerdo como
  48.             // referência
  49.             preOrdem(no.getEsq());
  50.         }
  51.  
  52.         // 3) Percorrer sad
  53.         // Se o nó direito não for nulo
  54.         if (no.getDir() != null) {
  55.             // Adicionamos o auxiliar 1 junto ao auxiliar do seu pai
  56.             no.getDir().setAux(no.getAux() + "1");
  57.             // Chamamos a função novamente passando o nó direito como
  58.             // referência
  59.             preOrdem(no.getDir());
  60.         }
  61.     }
  62.  
  63.     public static void main(String[] args) {
  64.         // Lista para armazenar a árvore
  65.         ArrayList<Node> lista = new ArrayList<Node>();
  66.         // String informada pelo usuário
  67.         String texto = "DCCACADEACCCCCBCEBBBD";
  68.  
  69.         // Passamos a string para a função que nos retornará a frequência e
  70.         // armazenamos em outro vetor
  71.         int freq[] = frequencia(texto);
  72.  
  73.         // Percorremos o vetor frequência
  74.         for (int i = 0; i < freq.length; i++) {
  75.             // Caso não seja igual a zero é porque existe uma quantidade de
  76.             // caracter correspondente a posição da tabela ASCII
  77.             if (freq[i] != 0) {
  78.                 // Criamos um novo nó
  79.                 Node n = new Node();
  80.                 // Setamos o caracter como simbolo
  81.                 n.setSimbolo((char) i);
  82.                 // Setamos a quantidade como frequência
  83.                 n.setQtd(freq[i]);
  84.                 // Adicionamos o nó na lista
  85.                 lista.add(n);
  86.             }
  87.         }
  88.  
  89.         // Devemos reduzir a lista à apenas um nó
  90.         while (lista.size() > 1) {
  91.             // Ordenamos a lista de forma crescente
  92.             Collections.sort(lista);
  93.             // Removemos o primeiro e segundo elemento da lista armazenando cada
  94.             // um em um nó
  95.             Node n1 = lista.remove(0);
  96.             Node n2 = lista.remove(0);
  97.             // Criamos um novo nó
  98.             Node novo = new Node();
  99.             // O nó esquerdo ao novo nó deverá ser o primeiro elemento retirado
  100.             // da lista
  101.             novo.setEsq(n1);
  102.             // O nó direito ao novo nó deverá ser o segundo elemento retirado
  103.             // da lista
  104.             novo.setDir(n2);
  105.             // O novo nó irá conter a soma da frequência de seus dois filhos
  106.             novo.setQtd(n1.getQtd() + n2.getQtd());
  107.             // Adcionamos o novo nó na lista
  108.             lista.add(novo);
  109.             // O bit da raiz é vazio, pois não tem nenhum caracter nele
  110.             novo.setAux("");
  111.         }
  112.         // Imprimimos a tabela com o caracter, frequência e seus bits
  113.         System.out.println("Simbolo  Qtd     bits");
  114.         // Chamamos a função para imprimir
  115.         preOrdem(lista.get(0));
  116.  
  117.     }
  118. }
  119.  
  120. #########################################
  121.  
  122. /**
  123.  * Classe nó para criar e gerenciar a árvore
  124.  */
  125. public class Node<E> implements Comparable<Node> {
  126.     private Character simbolo;
  127.     private int qtd;
  128.     private Node esq, dir;
  129.     private String aux;
  130.  
  131.     public String getAux() {
  132.         return aux;
  133.     }
  134.  
  135.     public void setAux(String aux) {
  136.         this.aux = aux;
  137.     }
  138.  
  139.     public Character getSimbolo() {
  140.         return simbolo;
  141.     }
  142.  
  143.     public void setSimbolo(Character simbolo) {
  144.         this.simbolo = simbolo;
  145.     }
  146.  
  147.     public int getQtd() {
  148.         return qtd;
  149.     }
  150.  
  151.     public void setQtd(int qtd) {
  152.         this.qtd = qtd;
  153.     }
  154.  
  155.     public Node getEsq() {
  156.         return esq;
  157.     }
  158.  
  159.     public void setEsq(Node esq) {
  160.         this.esq = esq;
  161.     }
  162.  
  163.     public Node getDir() {
  164.         return dir;
  165.     }
  166.  
  167.     public void setDir(Node dir) {
  168.         this.dir = dir;
  169.     }
  170.  
  171.     @Override
  172.     public int compareTo(Node o) {
  173.         if (qtd > o.getQtd())
  174.             return 1;
  175.         else if (qtd < o.getQtd())
  176.             return -1;
  177.         else
  178.             return 0;
  179.     }
  180.  
  181. }
Advertisement
Add Comment
Please, Sign In to add comment