Вы находитесь на странице: 1из 1

Группа: ІПЗ-18-1

Хрипункова Е.А
Лабораторная работа №9.2
Создайте программу, которая строит коды Хаффмана и оценивает степень сжатия с их
помощью для произвольного заданного файла.
from heapq import heappush, heappop, heapify
from collections import defaultdict
import os
def encode(symb2freq):
heap = [[wt, [sym, ""]] for sym, wt in symb2freq.items()]
heapify(heap)
while len(heap) > 1:
lo = heappop(heap)# елемент с миним частотой
hi = heappop(heap)# елемент с макс частотой
for pair in lo[1:]:
pair[1] = '0' + pair[1]
for pair in hi[1:]:
pair[1] = '1' + pair[1]
#print('lo')
#print(lo)
#print('hi')
# print(hi)
heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
return sorted(heappop(heap)[1:], key=lambda p:
(len(p[-1]), p))

with open('sample.txt', 'r') as myfile:


txt=myfile.read().replace('\n', '')
print(txt)
symb2freq = defaultdict(int)
for ch in txt:
symb2freq[ch] += 1
#print(symb2freq)
huff = encode(symb2freq)

a=0
print ("Символ\tВес\tКод Хаффмана")
for p in huff:
print ("%s\t%s\t%s" % (p[0], symb2freq[p[0]], p[1]))
a=a+len(p[1])
print("Без сжатия: ",(os.path.getsize('sample.txt')*8),"bits")
print("Код Хаффмана: ",a,"bits")
print("Сжали на: ",100-int((a*100)/(os.path.getsize('sample.txt')*8)),"%")