Zarysowanie kompresji LZ77
Buduję kompresję LZ77. Przeczytałem cały plik jako pojedynczy ciąg i próbowałem go skompresować. Czy jest jakiś inny sposób na to? Załączę poniższy kod, aby powiedzieć, czy są jakieś zmiany, które mają być wprowadzone, aby program kompresował bardzo szybko, nawet jeśli odczytuje duży plik.
importowanie pliku
Przypisanie klasy:
def pattern(self, data):
self.skip = []
self.m = len(data)
for k in range(256): self.skip.append(self.m)
for k in range(self.m - 1): self.skip[ord(data[k])] = self.m - k - 1
self.skip = tuple(self.skip)
self.data = data
def find(self, text):
n = len(text)
if self.m > n: return -1
k = self.m - 1
while k < n:
j = self.m - 1; i = k
while j >= 0 and text[i] == self.data[j]:
j -= 1; i -= 1
if j == -1: return i + 1
k += self.skip[ord(text[k])]
return -1
klasa LZ77:
def __init__(self, data):
self.position = 0
self.window = ""
self.stream = data
self.streamSize = len(self.stream)
self.search = Assign()
def Encode(self):
p = 0
c = ''
lastresult = 0
found = 0
for i in range(self.streamSize):
self.search.pattern(self.stream[self.position:self.position+i+1])
result = self.search.find(self.window)
if result < 0: break
lastresult = result
found = 1
c = self.stream[self.position+i]
p = lastresult
B = 0
if i > 0: B = self.position - p
L = i
if self.streamSize > 0:
self.position += i + 1
self.streamSize -= i + 1
self.window = self.stream[:self.position]
#print B,L,c
return ((B, L), c)
def Encoder(self):
output = ""
length = self.streamSize
while self.streamSize > 0:
((B, L), C) = self.Encode()
output += str(B) + str(L) + C
return (output)
def aiyoo (nazwa pliku):
enter = raw_input("enter the filename to which the original file is to e compressed to")
enter1 = enter
fob1 = open(enter,'wb')
print filename
fob = open(filename,'rb')
original = ''
for i in fob:
original += i
lz = LZ77(original)
stream = lz.Encoder()
fob1.write(stream)
fob.close()
fob1.close()
Z góry dziękuję