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. Программа также выведет на экран кодовый словарь, размеры исходного и закодированного файлов, а также время кодирования.
сообщения.
Программа должна иметь следующие функции:
1) чтение исходного сообщения из файла;
2) выбор пользователем метода кодирования;
3) кодирование сообщения и вывод на экран кодового словаря (символ - метка);
4) сохранение закодированного сообщения в виде файла в памяти.
Задание 2: оценить эффективность результатов кодирования:
1) по размеру исходного и закодированного файлов;
2) по времени, затраченному на кодирование сообщения
Пример пусть будет словосочетание "I love you!"