diff --git a/dyn_huffman.py b/dyn_huffman.py index 96a9b17d7ffd69ba87c15cd1846c60e25275079d..494bfb1113f9cd72f240af23202a62f63fabd44d 100644 --- a/dyn_huffman.py +++ b/dyn_huffman.py @@ -1,5 +1,4 @@ from __future__ import annotations -import code from dataclasses import dataclass import numpy as np import pprint @@ -8,6 +7,7 @@ import argparse import string LIST_ALPHABET = list(string.ascii_lowercase) + list(string.digits) +# LIST_ALPHABET = list(string.ascii_lowercase) DICT_ALPHABET = {item: index + 1 for index, item in enumerate(LIST_ALPHABET)} @dataclass @@ -28,19 +28,54 @@ def swap(tree: Node): tree.left = tmp +# def compute_prefix(tree: Node, char: str) -> str: +# prefix = '' +# +# if tree: +# if tree.value == char: +# return '' +# +# if tree.left: +# prefix = '0' + compute_prefix(tree.left, char) +# +# if tree.right: +# prefix = '1' + compute_prefix(tree.right, char) +# +# return prefix + +def compute_prefix(tree: Node, char: str) -> str: + if tree.value == char: + return '' + + if tree.left: + left_result = compute_prefix(tree.left, char) + if left_result is not None: + return '0' + left_result + + if tree.right: + right_result = compute_prefix(tree.right, char) + if right_result is not None: + return '1' + right_result + + return None # char not found in this subtree + + + + def find_char(tree: Node, char: str) -> Node | None: if tree: - if tree.right: - _ = find_char(tree.right, char) + if tree.value == char: + return tree if tree.left: - _ = find_char(tree.left, char) + n = find_char(tree.left, char) + if n: + return n - if tree.value == char: - print(tree) - return tree - else: - return None + if tree.right: + n = find_char(tree.right, char) + if n: + return n @@ -92,25 +127,48 @@ def compute_code(char: str): return bin(bin_val)[2:].zfill(e) -def main(string: str) -> None: +def encode(string: str) -> list[str]: tree = Node() - fixed_code = [] + encoded: list[str] = [] + seen: set[str] = set() for c in string: - fixed_code.append(compute_code(c)) - - pprint.pp(fixed_code) - - for c in string: - pprint.pp(tree) - print(f'\n====== Inserting \'{c}\' ======\n') insert_char(tree, c) + prefix = find_char(tree, c) - pprint.pp(tree) + if c not in seen: + seen.add(c) + encoded.append(prefix.nyt_code) + encoded.append(compute_code(c)) + else: + encoded.append(compute_prefix(tree, c)) - n = find_char(tree, 'k') + return ' '.join(encoded)[1:] - pprint.pp(n) + +def main(string: str) -> None: + msg = encode(string) + print(msg) + +# def main(string: str) -> None: +# tree = Node() +# fixed_code = [] +# +# for c in string: +# fixed_code.append(compute_code(c)) +# +# pprint.pp(fixed_code) +# +# for c in string: +# pprint.pp(tree) +# print(f'\n====== Inserting \'{c}\' ======\n') +# insert_char(tree, c) +# +# pprint.pp(tree) +# +# n = find_char(tree, 'o') +# +# pprint.pp(n) if __name__ == "__main__":