Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

В Python написать код на основе алгоритма Хаффмана.

Татьяна Якушова Ученик (91), на голосовании 5 дней назад
Разработать программу, осуществляющую кодирование исходного
сообщения.
Программа должна иметь следующие функции:
1) чтение исходного сообщения из файла;
2) выбор пользователем метода кодирования;
3) кодирование сообщения и вывод на экран кодового словаря (символ - метка);
4) сохранение закодированного сообщения в виде файла в памяти.
Задание 2: оценить эффективность результатов кодирования:
1) по размеру исходного и закодированного файлов;
2) по времени, затраченному на кодирование сообщения
Пример пусть будет словосочетание "I love you!"
Голосование за лучший ответ
Maksim Nadeev Профи (637) 1 месяц назад
import heapq
import os
import time

class Node:
def __init__(self, char, freq):
self.char = char
self.freq = freq
self.left = None
self.right = None

# Определяем операторы сравнения для использования в heapq
def __lt__(self, other):
return self.freq < other.freq

def calculate_frequency(text):
frequency = {}
for char in text:
if char not in frequency:
frequency[char] = 0
frequency[char] += 1
return frequency

def build_huffman_tree(frequency):
heap = [Node(char, freq) for char, freq in frequency.items()]
heapq.heapify(heap)

while len(heap) > 1:
node1 = heapq.heappop(heap)
node2 = heapq.heappop(heap)
merged = Node(None, node1.freq + node2.freq)
merged.left = node1
merged.right = node2
heapq.heappush(heap, merged)

return heapq.heappop(heap)

def build_codes(node, current_code="", codes={}):
if node is None:
return

if node.char is not None:
codes[node.char] = current_code

build_codes(node.left, current_code + "0", codes)
build_codes(node.right, current_code + "1", codes)

return codes

def encode_text(text, codes):
return ''.join(codes[char] for char in text)

def save_encoded_text(encoded_text, file_path):
with open(file_path, 'w') as file:
file.write(encoded_text)

def read_file(file_path):
with open(file_path, 'r') as file:
return file.read()

def main():
input_file = "input.txt"
output_file = "encoded.txt"

# Чтение исходного сообщения
text = read_file(input_file)

# Вычисление частоты символов
frequency = calculate_frequency(text)

# Построение дерева Хаффмана
huffman_tree = build_huffman_tree(frequency)

# Построение кодов
codes = build_codes(huffman_tree)

# Кодирование текста
start_time = time.time()
encoded_text = encode_text(text, codes)
end_time = time.time()

# Вывод кодового словаря
print("Кодовый словарь (символ - метка):")
for char, code in codes.items():
print(f"{char}: {code}")

# Сохранение закодированного текста
save_encoded_text(encoded_text, output_file)

# Оценка эффективности
original_size = os.path.getsize(input_file)
encoded_size = os.path.getsize(output_file)
encoding_time = end_time - start_time

print(f"Размер исходного файла: {original_size} байт")
print(f"Размер закодированного файла: {encoded_size} байт")
print(f"Время кодирования: {encoding_time:.6f} секунд")

if __name__ == "__main__":
main()

Инструкции по использованию:
1. Создайте файл `input.txt`, содержащий текст "I love you!".
2. Запустите программу. Она прочитает текст из `input.txt`, закодирует его, и сохранит закодированное сообщение в файл `encoded.txt`.
3. Программа также выведет на экран кодовый словарь, размеры исходного и закодированного файлов, а также время кодирования.
Похожие вопросы