miércoles, 24 de abril de 2013

Teoría de la información Código adaptativo

Buenas en esta ocasión nos toco inventar nuestro propio sistema  compresor/descompresor, además de que no se envía completo el mensaje, si no se envían carácter por carácter, esto hace que sea un poco más difícil la compresión y sea mas impreciso, pero las aplicaciones en línea son inimaginables. Bueno empezemos.

Lo primero que se tuvo que hacer fue crear el archivo a comprimir, y crear alguna manera de enviar dato por dato. En este ejemplo me espere a tener un bloque de 8 caracteres, para posteriormente enviárselo al compresor y este realice su respectivo trabajo, después ese pequeño bloque es enviado al receptor y este lo recibe y lo descomprime.

Aquí el código

Aquí termina el código

Sobre el método que se uso para la compresión fue el siguiente:

Primero se verificó uno por uno, cada uno de los caracteres de los bloques, en caso de que el carácter no haya sido agregado a una lista, se agrega y se va tomando las veces que aparecen de aquí en adelante, y así con cada uno de los caracteres.

Para crear su código de cada uno de ellos, me hubiera gustado hacerlo mas especial y binarizado pero por falta de tiempo se realizo de la siguiente manera:

Cada uno de los códigos tenían como fin un "1" y como se fuera agregando mas caracteres se agregaba un cero de lado izquierdo del uno, por ejemplo:

ave:

a = 1
v = 01
e = 001

Como vemos esto realmente no es muy óptimo, posteriormente después de cada 5 interacciones se verificaba la cantidad de repeticiones y se seleccionaba la letra con mayor repeticiones y se colocaba en la primera posición con el código mas pequeño, en caso de que ya fuera la letra mas frecuentada con el código mas pequeño no se realizaba nada.

Ahora para enviar el bloque nuevamente se realizaba de la siguiente manera que en caso de que ya existiera la letra solo se enviaría y se pondría su puro código  pero si es la primera vez que se envía  se enviaría el mismo carácter y su código, encerrado por signo de pesos, como el siguiente ejemplo:

si a es la primara vez que se enviaría seria así:

$a1$, 

donde 1 es su código y el receptor guardaría ese código y los signos nos ayudarían a identificar que es un nuevo código y lo guardaría en su propia base de datos.

En casi de que no fuera nuevo solo se pondría su código

1

ejemplo mas detallado

aaveev

a = 1
v = 01
e = 001

Bloque resultante:
-> $a1$1$v01$$e001$00101

Y este bloque seria el que recibiera el receptor

Aquí el código del compresor

Aquí el código del compresor




Posteriormente de enviar el bloque el receptor verificaría si se trata de algún cambio, o una variable nueva o simplemente código.

Para la variable nueva se utilizo el signo de porcentaje "%" para diferenciarlo y saber que se trata de un cambio de código,  haciendo un proceso parecido al de nuevo carácter  solo que el cambio se envia el carácter que cambiara de posición con la letra inicial que es el que tiene el menor código.

Proceso de ejemplo del receptor:

bloque recibido : -> $a1$1$v01$$e001$00101
$a1$ se guarda el carácter a con su código en una lista 
->1$v01$$e001$00101 Se saca que 1 es igual al carácter a

-> $v01$$e001$00101
$v01$ se guarda el caracter v con su codigo : 01

-> $e001$00101
$e001$ se guarda el caracter e con su codigo 001

-> 00101

001 = e y 01 = v se obtienen aparir del código

El cambio se realiza cuando aparece el signo de "%"

%v%...... Esto nos indica que la letra "v" cambiara su respectivo código por el mas pequeño y este le sedera su código al primer carácter.


Código de receptor

Termina código de receptor

La cadena que se utilizo para el ejemplo de las imágenes fue la siguiente:
alejandroavendanoortega


Concluciones: Por falta de tiempo no se pudo realiza el juntar los bloques de código y cambiarlos a hexadecimal esto hubiera cambiado en gran medida el compresor, ademas de que se pudo haber utilizado códigos en binario también para reducir un poco mas los diferentes bloques

1 comentario:

  1. Me parece bien la idea. En la implementación justamente hubiera sido bueno juntar bloques en una representación binaria. 4+5.

    ResponderEliminar