huffman

“””Write a program to implement Huffman Encoding using a greedy strategy”””

import heapq

def huffman_encoding(text):

    freq = {}

    for ch in text:

        freq[ch] = freq.get(ch, 0) + 1

    heap = [[weight, [ch, “”]] for ch, weight in freq.items()]

    heapq.heapify(heap)

    while len(heap) > 1:

        lo = heapq.heappop(heap)

        hi = heapq.heappop(heap)

        for pair in lo[1:]:

            pair[1] = “0” + pair[1]

        for pair in hi[1:]:

            pair[1] = “1” + pair[1]

        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])

    huff_codes = dict(sorted(heap[0][1:], key=lambda p: (len(p[-1]), p)))

    encoded_text = “”.join(huff_codes[ch] for ch in text)

    return huff_codes, encoded_text

def huffman_decoding(encoded_text, codes):

    reverse_codes = {v: k for k, v in codes.items()}

    decoded_text = “”

    current = “”

    for bit in encoded_text:

        current += bit

        if current in reverse_codes:

            decoded_text += reverse_codes[current]

            current = “”

    return decoded_text

text = “huffman encoding”

codes, encoded = huffman_encoding(text)

decoded = huffman_decoding(encoded, codes)

print(“Original Text:”, text)

print(“Character Codes:”, codes)

print(“Encoded Text:”, encoded)

print(“Decoded Text:”, decoded)