diff --git a/dyn_huffman.py b/dyn_huffman.py index eb04d1ea08a51543bc6334c18e27ad48c1d1aef8..0e260508955231e1b39d41c2ef2258dafa1dd33a 100644 --- a/dyn_huffman.py +++ b/dyn_huffman.py @@ -4,6 +4,10 @@ import numpy as np import pprint import math import argparse +import string + +LIST_ALPHABET = list(string.ascii_lowercase) + list(string.digits) +DICT_ALPHABET = {item: index + 1 for index, item in enumerate(LIST_ALPHABET)} @dataclass class Node: @@ -46,28 +50,41 @@ def insert_char(tree: Node, char: str): swap(tree) -def compute_vitter_params(m: int) -> (int, int): +def compute_vitter_params(m: int) -> tuple[int, int]: e = math.floor(np.log2(m)) r = m - (2 ** e) - return (e, r) -def main(string: str) -> None: - print(compute_vitter_params(26)) +def compute_k(char: str) -> int: + return DICT_ALPHABET[char] + + +def compute_code(char: str): + e, r = compute_vitter_params(len(LIST_ALPHABET)) + k_char = compute_k(char) + + if k_char <= 2*r: + bin_val = k_char - 1 + n_bits = e + 1 + return bin(bin_val)[2:].zfill(n_bits) + else: + bin_val = k_char - r - 1 + return bin(bin_val)[2:].zfill(e) + +def main(string: str) -> None: tree = Node() + enc = [] for c in string: pprint.pp(tree) print(f'\n====== Inserting \'{c}\' ======\n') insert_char(tree, c) + enc.append(compute_code(c)) pprint.pp(tree) - - # pprint.pp(tree) - - + pprint.pp(enc) if __name__ == "__main__":