-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04_LZ78_AX8701671.py
115 lines (98 loc) · 5.7 KB
/
04_LZ78_AX8701671.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# -*- coding: utf-8 -*-
"""
Dado un mensaje dar su codificación usando el
algoritmo LZ78
mensaje='wabba wabba wabba wabba woo woo woo'
LZ78Code(mensaje)=[[0, 'w'], [0, 'a'], [0, 'b'], [3, 'a'],
[0, ' '], [1, 'a'], [3, 'b'], [2, ' '],
[6, 'b'], [4, ' '], [9, 'b'], [8, 'w'],
[0, 'o'], [13, ' '], [1, 'o'], [14, 'w'],
[13, 'o'], [0, 'EOF']]
"""
def LZ78Code(mensaje):
diccionario = []
codigo = []
posicion = 0
while posicion < len(mensaje):
i = 0
l = 1
cadena = mensaje[posicion:posicion + l]
while True:
try:
i = diccionario.index(cadena) + 1
l += 1
if posicion + l > len(mensaje):
break
cadena = mensaje[posicion:posicion + l]
except:
break
posicion += l
if posicion < len(mensaje):
diccionario += [cadena]
codigo += [[i, mensaje[(posicion - 1)]]]
elif posicion == len(mensaje):
diccionario += [cadena]
codigo += [[i, mensaje[(posicion - 1)]]]
codigo += [[0, 'EOF']]
else:
diccionario += [cadena]
codigo += [[i, 'EOF']]
return codigo
#"""
#Dado un mensaje codificado con el algoritmo LZ78 hallar el mensaje
#correspondiente
code=[[0, 'm'], [0, 'i'], [0, 's'], [3, 'i'], [3, 's'],
[2, 'p'], [0, 'p'], [2, ' '], [1, 'i'], [5, 'i'],
[10, 'p'], [7, 'i'], [0, ' '], [0, 'r'], [2, 'v'],
[0, 'e'], [14, 'EOF']]
#LZ78Decode(code)='mississippi mississippi river'
#"""
def LZ78Decode(codigo):
diccionario = []
mensaje = ''
for i in range(len(codigo) - 1):
indice = codigo[i][0]
letra = codigo[i][1]
if indice == 0:
mensaje += letra
diccionario += [letra]
else:
palabra = diccionario[(indice - 1)] + letra
mensaje += palabra
diccionario += [palabra]
indice = codigo[(len(codigo) - 1)][0]
letra = codigo[(len(codigo) - 1)][1]
if indice > 0:
palabra = diccionario[(indice - 1)]
mensaje += palabra
return (mensaje, diccionario)
mensaje='wabba wabba wabba wabba woo woo woo'
mensaje_codificado=LZ78Code(mensaje)
print('Código: ',mensaje_codificado)
mensaje_recuperado, diccionario = LZ78Decode(mensaje_codificado)
print(mensaje_recuperado)
if (mensaje!=mensaje_recuperado):
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
mensaje='mississipi mississipi river'
mensaje_codificado=LZ78Code(mensaje)
print('Código: ',mensaje_codificado)
mensaje_recuperado, diccionario = LZ78Decode(mensaje_codificado)
print(mensaje_recuperado)
if (mensaje!=mensaje_recuperado):
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
#%%
mensaje='La heroica ciudad dormía la siesta. El viento Sur, caliente y perezoso, empujaba las nubes blanquecinas que se rasgaban al correr hacia el Norte. En las calles no había más ruido que el rumor estridente de los remolinos de polvo, trapos, pajas y papeles que iban de arroyo en arroyo, de acera en acera, de esquina en esquina revolando y persiguiéndose, como mariposas que se buscan y huyen y que el aire envuelve en sus pliegues invisibles. Cual turbas de pilluelos, aquellas migajas de la basura, aquellas sobras de todo se juntaban en un montón, parábanse como dormidas un momento y brincaban de nuevo sobresaltadas, dispersándose, trepando unas por las paredes hasta los cristales temblorosos de los faroles, otras hasta los carteles de papel mal pegado a las esquinas, y había pluma que llegaba a un tercer piso, y arenilla que se incrustaba para días, o para años, en la vidriera de un escaparate, agarrada a un plomo. Vetusta, la muy noble y leal ciudad, corte en lejano siglo, hacía la digestión del cocido y de la olla podrida, y descansaba oyendo entre sueños el monótono y familiar zumbido de la campana de coro, que retumbaba allá en lo alto de la esbeltatorre en la Santa Basílica. La torre de la catedral, poema romántico de piedra,delicado himno, de dulces líneas de belleza muda y perenne, era obra del siglo diez y seis, aunque antes comenzada, de estilo gótico, pero, cabe decir, moderado por uninstinto de prudencia y armonía que modificaba las vulgares exageraciones de estaarquitectura. La vista no se fatigaba contemplando horas y horas aquel índice depiedra que señalaba al cielo; no era una de esas torres cuya aguja se quiebra desutil, más flacas que esbeltas, amaneradas, como señoritas cursis que aprietandemasiado el corsé; era maciza sin perder nada de su espiritual grandeza, y hasta sussegundos corredores, elegante balaustrada, subía como fuerte castillo, lanzándosedesde allí en pirámide de ángulo gracioso, inimitable en sus medidas y proporciones.Como haz de músculos y nervios la piedra enroscándose en la piedra trepaba a la altura, haciendo equilibrios de acróbata en el aire; y como prodigio de juegosmalabares, en una punta de caliza se mantenía, cual imantada, una bola grande debronce dorado, y encima otra más pequenya, y sobre ésta una cruz de hierro que acababaen pararrayos.'
import time
bits_indice=12
start_time = time.clock()
mensaje_codificado = LZ78Code(mensaje)
print (time.clock() - start_time, "seconds CODE")
start_time = time.clock()
mensaje_recuperado, diccionario =LZ78Decode(mensaje_codificado)
print (time.clock() - start_time, "seconds DECODE")
ratio_compresion=8*len(mensaje)/((bits_indice+8)*len(mensaje_codificado))
print(len(mensaje_codificado),ratio_compresion)
if (mensaje!=mensaje_recuperado):
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print(len(mensaje),len(mensaje_recuperado))
print(mensaje[-5:],mensaje_recuperado[-5:])