Está en la página 1de 8

HITO NRO.

“4”

CARRERA: ING. SISTEMAS SEDE: EL ALTO

ESTUDIANTE: GABRIEL ROMAN QUESO LAURA


Introducción.

Este algoritmo fue desarrollado por el norteamericano David Albert


Huffman en 1952 mientras hacía el doctorado en el MIT. El método fue
publicado en una revista como A Method for the Construction of Minimum-
Redundancy Codes (el artículo original). El algoritmo funciona a partir de un
conjunto dado de símbolos con sus respectivos pesos. Los pesos son la
frecuencia de aparición en una cadena. Por ejemplo en la
cadena Genciencia el peso del símbolo i es 2, ya que aparece en dos
ocasiones. La salida del algoritmo es el mismo conjunto de símbolos de
entrada codificado mediante un código binario con un tamaño menor.

Reseña

El algoritmo de Huffman se usa para la compresión o encriptación de datos


mediante el estudio de la frecuencia de aparición de caracteres.
Esta compresión es mayor cuando la variedad de caracteres diferentes que
aparecen es menor. Por ejemplo: si el texto se compone únicamente de números
o mayúsculas, se conseguirá una compresión mayor.
Para recuperar el fichero original es necesario conocer el código asignado a cada
caracter, así como su longitud en bits, si ésta información se omite, y el receptor
del fichero la conoce, podrá recuperar la información original. De este modo es
posible utilizar el algoritmo para encriptar ficheros.
Para una mayor comprensión sobre el funcionamiento del algoritmo, ve el video
que se encuentra en este articulo.

Operación

Para poder hacer todas nuestras operaciones, vamos a utilizar diferentes


estructuras no genericas, sobre todo una lista de arboles binarios.
Primero creamos una clase para poner las funciones que nos ayudaran a
encriptar y desencriptar. En mi caso llamé a la clase Winzip.
Dentro de ella encontramos las funciones principales:
• public String[] Comprimir(String mensaje): Comprime el mensaje y lo escribe en
un archivo junto con la tabla de direcciones. Retorna el String de direcciones y el
String comprimido solo para informar al usuario.
• public String Descomprimir(): Lee el archivo señalado y lo descomprime,
retornando el mensaje original.
• private String escribir(String mensaje,ListaTabla tabla,String nombre): Escribe en
un archivo el mensaje comprimido y la tabla de direcciones.
• private String rellenar(String cadena): Rellena un String con ceros hasta que
tenga una longitud de 8 caracteres.
• private String quitar(String cad,Integer n): Le quita n caracteres a la cadena cad.
Código

Ahora veremos la funcion Comprimir que está dentro de la clase Winzip. Vean
como el proceso que se sigue es el mismo que el del video.

Figuras

Representacion grafica de las estructuras necesarias para la lista de arboles.


Creando el árbol

Para crear el árbol solo debemos crear una clase llamada Node (Nodo), veamos
el código necesario para definir los atributos a utilizar:

1 public class Node {


2 private Integer value;
3 private Node left;
4 private Node right;
5
6 public Node(Integer value) {
7 this.value = value;
8 }
9 //... Getters y setters
10 }
Agregar un valor nuevo

Para agregar un valor nuevo al árbol la lógica será la siguiente:


1. Si el valor a agregar es menor al del nodo actual se insertará del lado izquierdo
2. Si el valor a agregar es mayor al del nodo actual se insertará del lado derecho

Recordemos que cada nodo puede tener solo 2 nodos hijos, por lo tanto si el
nodo actual contiene un 10 y el valor a insertar es un 7 este se insertará del lado
izquierdo, si ya hay un valor insertado del lado izquierdo se ejecutará la misma
lógica con el valor insertado hasta llegar a un nodo izquierdo o derecho nulo,
veamos el código:

1 public class Node {


2 ...// El código anterior
3 public void add(Integer value) {
4 if (value < this.value) {
5 if (left != null) {
6 left.add(value);
7 } else {
8 left = new Node(value);
9 }
10 } else {
11 if (right != null) {
12 right.add(value);
13 } else {
14 right = new Node(value);
15 }
16 }
17 }
18 }
Como se puede observar en el código se utiliza recursividad para agregar los
nodos en caso de que ya existan en el árbol.

Buscar un valor

La lógica para buscar un valor en el árbol es muy similar que para insertarlo, en
el código que se mostrará se utilizará la clase Optional agregada en Java 8,
veamos el código:

1 import java.util.Optional;
2 public class Node {
3 ...// El código anterior
4 public Optional<Node> find(Integer value) {
5 if (value == this.value) {
6 return Optional.of(this);
7 } else if (value < this.value) {
8 if (this.left != null) {
9 return this.left.find(value);
10 } else {
11 return Optional.empty();
12 }
13 } else {
14 if (this.right != null) {
15 return this.right.find(value);
16 } else {
17 return Optional.empty();
18 }
19 }
20 }
21 }
Como se puede ver es necesario importar la clase Optional del paquete
java.util.

Imprimir los valores del árbol binario

Para imprimir los valores es necesario iterar el árbol utilizando recursividad y


existen 3 formas de hacerlo:

1. In order: Imprime el valor del nodo izquierdo, después el del nodo contenedor y
al final el del nodo derecho
2. Pre order: Imprime el valor del nodo contenedor, después el del nodo izquierdo
y al final el del nodo derecho
3. Pos order: Imprime el valor del nodo izquierdo, después el del nodo derecho y al
final el del nodo contenedor

Veámoslo en código:

1 public class Node{


2 ...// El código anterior
3 public void printInOrder(){
4 if(left!=null){
5 left.printInOrder();
6 }
7 System.out.println(value);
8 if(right!=null){
9 right.printInOrder();
10 }
11 }
12
13 public void printPreOrder(){
14 System.out.println(value);
15 if(left!=null){
16 left.printPreOrder();
17 }
18 if(right!=null){
19 right.printPreOrder();
20 }
21 }
22
23 public void printPosOrder(){
24 if(left!=null){
25 left.printPreOrder();
26 }
27 if(right!=null){
28 right.printPreOrder();
29 }
30 System.out.println(value);
31 }}

También podría gustarte