jueves, 25 de abril de 2013

Tarea: Método de Codificación adaptativa

En esta entrada se nos pidio que hicieramos un código adaptativo para la compresión de datos y lo que se me ocurrio fue lo siguiente:

1-El texto se manda en partes, esos datos que se envían son en una cierta cantidad.
2- Los datos que entran se le busca un patron que se repita en esa misma cadena y se guardan en un diccionario.
3-Cuando la siguiente parte del mensaje va entrando lo que hace es buscar nuevos patrones además de adaptar los anteriores haciendolos mas grandes.
4- Cada patrón tendra su código binario
5- Se busca en las cadenas ese patron y se sustituye por su código binario.

Me quede solo en sacar lo que son los patrones, su valor en binario


El código es el siguiente:
import random
patrones={}
posiciones={}
#cad=''
#i=''
#posiciones.setdefault(i,[])
contador=0
def reader(msj):
msj=open(msj,'r')
text=msj.read()[:-1]
msj.close()
text=text.replace(' ','3')
print text
print len(text)
longitud=(len(text))
return text,longitud
def receptor(cadena,cad):
global contador
global patrones
print 'cadena final',cad
c=0
for i in cadena:
print 'posiciones',posiciones
if i not in posiciones:
print 'letra',i
print 'contador',contador
posiciones.setdefault(i,[])
posiciones[i].append(contador)
else:
print 'letra',i
print 'contador',contador
x=1
patron=[]
for m in posiciones[i]:
print 'm=', m
while True:
raw_input()
print 'Compara'
print 'cadena1=',cad[m:(m+x)],'cadena2=',cad[contador:(contador+x)]
if (cad[m:(m+x)] == cad[contador:(contador+x)]):
print 'Es igual agrega a diccionario'
patron.append(cad[contador:contador+x])
print 'patron',patron
x +=1
else:
print 'NO es igual sale del while'
break
posiciones[i].append(contador)
if str(patron[-1]) not in patrones:
patrones[str(patron[-1])]=0
codificar(str(patron[-1]),contador)
print 'posiciones',posiciones
contador +=1
c +=1
raw_input()
print posiciones
def codificar(patron,contador):
b = bin(contador)[2:]
patrones[patron]=str(b)
return
def emisor(msj,num):
print 'num',num
n=0
sub=''
cad=''
while True:
sub=msj[n:n+num]
if n+num>len(msj):
num =len(msj)-(n)
cad +=sub
receptor(sub,cad)
print '--------------------------------------------------------'
if len(msj)==n:
break
n +=num
print n
print 'patrones',patrones
def main():
txt='texto.txt'
msj,longitud=reader(txt)
div=random.randint(3,6)
num=int(longitud/div)
emisor(msj,num)
main()
view raw compresor.py hosted with ❤ by GitHub

Capturas



Y aquí nos muestra ya su valor en binario


2 comentarios:

  1. La explicación de lo que se hace queda muy vaga -> 2 pts por el reporte. Por el avance parcial de código, 3 pts.

    ResponderEliminar
  2. NP en tarea de códigos bloque.

    ResponderEliminar