Anda di halaman 1dari 8

SISTEM

MULTIM
EDIA

TUGAS 4
NAMA: LIS INDRIANI
NIM: 105841108020
KELAS: 5C

FAKULTAS TEKNIK
PROGRAM STUDI INFORMATIKA
UNIVERSITAS MUHAMMADIYAH MAKASSAR
TAHUN AJARAN 2022/2023

Tugas: Menganalisis alur dari program (Algoritma) Huffman.


Pertama, membuat kelas Node untuk node bagi pohon Huffman. Setiap

node terdiri dari simbol dan probabilitas variabel, child kiri/kanan, dan kode

variabel. Kode variabel terdiri 0 atau 1 tergantung pada sisi yang terpilih (kiri=0

dan kanan=1) pada pohon Huffman.

class Node:
    def __init__(self, prob, symbol, left=None, right=None):
        # probability of symbol
        self.prob = prob

        # symbol
        self.symbol = symbol

        # left node
        self.left = left

        # right node
        self.right = right

        # tree direction (0/1)


        self.code = ''

Penjelasan:

Pada source code di atas, membuat sebuah kelas dengan nama Node dan

menginisialisasi beberapa parameter yakni prob, symbol, left dan right. Inisialisasi

untuk nilai left dan right yaitu none karena arahnya belum ditentukan.

""" A helper function to print the codes of symbols by traveling


Huffman Tree"""
codes = dict()

def Calculate_Codes(node, val=''):


    # huffman code for current node
    newVal = val + str(node.code)

    if(node.left):
        Calculate_Codes(node.left, newVal)
    if(node.right):
        Calculate_Codes(node.right, newVal)

    if(not node.left and not node.right):


        codes[node.symbol] = newVal
         
    return codes        

def Calculate_Probability(data):
    symbols = dict()
    for element in data:
        if symbols.get(element) == None:
            symbols[element] = 1
        else:
            symbols[element] += 1    
    return symbols

def Output_Encoded(data, coding):


    encoding_output = []
    for c in data:
      #  print(coding[c], end = '')
        encoding_output.append(coding[c])
       
    string = ''.join([str(item) for item in encoding_output])    
    return string
         

Penjelasan:

Pada fungsi Calculate_Codes, membuat dictionary dengan nama codes. Fungsi ini

akan menetapkan variabel yang menyimpan kode huffman untuk node saat ini dan

menggunakan pengkondisian if untuk menambahkan node di kiri dan kanan

dengan node saat ini dan mengembalikan pengkodean simbol.

Pada fungsi Calculate_Probability, mendefinisikan dictionary lain dengan nama

symbols dan membuat perulangan untuk memasukkan data kedalam dictionary.

Dictionary adalah tipe data pada python yang berfungsi untuk menyimpan
kumpulan data/nilai dengan pendekatan “key-value”. Pada perulangan tersebut

menggunakan pengkondisian if-else untuk mengecek apakah data mengandung

beberapa elemen atau tidak.

Pada Output_Encoded, membuat array kosong kemudian menggunakan

perulangan for-loop melalui karakter dalam data dan fungsi append() untuk

menambahkan data ke array. Kemudian menggunakan fungsi join() untuk

menggabungkan elemen dari array ke string dan mengembalikan string.

Selain itu, juga membuat fungsi lain dengan nama TotalGain, yang menerima data

awal dan dictionary yang berasal dari CalculateCode, menyatukan simbol dan

kodenya. Fungsi ini akan membantu menghitung perbedaan antara ukuran bit data

terkompresi dengan non terkompresi.

def Total_Gain(data, coding):


    before_compression = len(data) * 8 # total bit space to stor the
data before compression
    after_compression = 0
    symbols = coding.keys()
    for symbol in symbols:
        count = data.count(symbol)
        after_compression += count * len(coding[symbol]) #calculate
how many bit is required for that symbol in total
    print("Space usage before compression (in bits):",
before_compression)    
    print("Space usage after compression (in bits):",
after_compression)          

Penjelasan:

Pada source code diatas, fungsi Total_Gain menghitung total ruang bit untuk

menyimpan data sebelum kompresi. Terdapat variabel yang ditetapkan untuk


menyimpan ukuran ruang bit setelah kompresi data dan menetapkannya ke nol.

Kemudian melakukan perulangan melalui key dari dictionary dari fungsi

CalculateCode dan menghitung kemunculannya. Lalu menghitung ruang bit yang

diperlukan untuk menyimpan data setelah kompresi. Kemudian menggunakan

fungsi HuffmanEncoding yang menerima data sebagai argumen dan

mengembalikan pengkodean yang dihasilkan dan perolehan total menggunakan

semua fungsi yang dijelaskan.

def Huffman_Encoding(data):
    symbol_with_probs = Calculate_Probability(data)
    symbols = symbol_with_probs.keys()
    probabilities = symbol_with_probs.values()
    print("symbols: ", symbols)
    print("probabilities: ", probabilities)
   
    nodes = []
   
    # converting symbols and probabilities into huffman tree nodes
    for symbol in symbols:
        nodes.append(Node(symbol_with_probs.get(symbol), symbol))
   
    while len(nodes) > 1:
        # sort all the nodes in ascending order based on their
probability
        nodes = sorted(nodes, key=lambda x: x.prob)
        # for node in nodes:  
        #      print(node.symbol, node.prob)
   
        # pick 2 smallest nodes
        right = nodes[0]
        left = nodes[1]
   
        left.code = 0
        right.code = 1
   
        # combine the 2 smallest nodes to create new node
        newNode = Node(left.prob+right.prob,
left.symbol+right.symbol, left, right)
   
        nodes.remove(left)
        nodes.remove(right)
        nodes.append(newNode)
           
    huffman_encoding = Calculate_Codes(nodes[0])
    print("symbols with codes", huffman_encoding)
    Total_Gain(data, huffman_encoding)
    encoded_output = Output_Encoded(data,huffman_encoding)
    return encoded_output, nodes[0]  
   

Penjelasan:

Pada source code diatas menggunakan argumen data, menghitung probabilitas

simbol menggunakan fungsi CalculateProbabilty, dan menyimpan data yang

dihasilkan dalam sebuah variabel. Kemudian mengekstraksi simbol (keys) dan

probabilitas (nilai) dan mencetaknya. Kemudian mendefenisikan sebuah array

sebagai nodes dan mengubah simbol dan probabilitas menjadi node dari pohon

Huffman. Menggunakan perulangan for-loop melalui symbol dan

menambahkannya ke array dan menggunakan while loop untuk mengurutkan

node dalam urutan ascending berdasarkan probabilitasnya. Memilih dua simpul

terkecil dan menggabungkannya untuk mebuat simpul baru. Menghapus node

terkecil dari array dan menambahkan node baru ke dalamnya. Kemudian

menggunakan fungsi CalculateCode untuk menghitung kode. Menggunakan

fungsi TotalGain, untuk menghitung perbedaan antara ruang bit data terkompresi

dan non-terkompresi. Akhirnya, mencetak hasilnya dan mengembalikan

encodedOutput dan indeks nol dari array. Kemudian membuat sebuah fungsi

untuk mendekode data Huffman Encoded untuk mendapatkan kembali data awal

yang tidak terkompresi.


def Huffman_Decoding(encoded_data, huffman_tree):
    tree_head = huffman_tree
    decoded_output = []
    for x in encoded_data:
        if x == '1':
            huffman_tree = huffman_tree.right  
        elif x == '0':
            huffman_tree = huffman_tree.left
        try:
            if huffman_tree.left.symbol == None and
huffman_tree.right.symbol == None:
                pass
        except AttributeError:
            decoded_output.append(huffman_tree.symbol)
            huffman_tree = tree_head
       
    string = ''.join([str(item) for item in decoded_output])
    return string      

Penjelasan :

Pada Code diatas, membuat fungsi dengan nama HuffmanDecoding yang

menerima dua parameter yaitu encodedData dan huffmanTree. Kemudian

menetapkan variabel huffmanTree ke variabel lain. Pada code tersebut membuat

array kosong dengan nama decodeOutput. Kemudian menggunakan for-loop

untuk perulangan elemen-elemen dalam encoded data. Didalam loop,

menggunakan if-else-if dan try-exception untuk mendekode data yang dikodekan

untuk menghasilkan output yang dikodekan. Terakhir membuat sebuah string dan

mengembalikan string tersebut.

Selanjutnya menginisialisasi data string dan mencetak hasilnya.

data = "AAAAAAABCCCCCCDDEEEEE"
print(data)
encoding, tree = Huffman_Encoding(data)
print("Encoded output", encoding)
print("Decoded Output", Huffman_Decoding(encoding,tree))

Penjelasan:

Pada Code diatas, membuat data string dan mencetaknya. Data ini akan

diteruskan ke fungsi HuffmanEncoding dan menyimpan nilai dalam pengkodean

dan variabel tree. Kemudian mencetak hasil Encoded. Terakhir meneruskan data

yang dikodekan ke fungsi HuffmanDecoding dan mencetak string yang

didekodekan.

Berikut ouputnya:

Anda mungkin juga menyukai