Algoritma Shannon-Fano Coding adalah salah satu algoritma yang dapat digunakan untuk melakukan kompresi data sehingga ukuran data yang dihasilkan menjadi lebih rendah dari ukuran sebenarnya. Contoh yang dibahas kali ini adalah mengenai kompresi dan pengembalian data dari sebuah kalimat.
Shannon-Fano Coding adalah sebuah teknik untuk membuat kode prefiks berdasarkan beberapa set simbol dan kemungkinan simbol tersebut. Algoritma ini tidak mencapai panjang kode optimal yang seharusnya, tetapi algoritma ini menjamin bahwa semua panjang huruf kode adalah dalam 1 bit pada ide logP(><)
Langkah-langkah penggunaan algoritma ini adalah
* Tentukan kalimat yang digunakan sebagai data input
Diasumsikan data input adalah sebagai berikut:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
1. Hitung ukuran data yang digunakan dalam perhitungan sebagai penanda ukuran data sebelum dilakukan kompresi
Dim inputData As Byte() = System.Text.Encoding.[Default].GetBytes(input) Dim ukuranInputData As UInteger = CUInt(input.Length) Console.WriteLine("Ukuran input data = " & ukuranInputData)
2. Lakukan proses kompresi data menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim KompresiData As Byte() = New Byte(ukuranInputData * (101 \ 100) + 383) {} Dim ukuranKompresiData As Integer = Compress(inputData, KompresiData, ukuranInputData)
* Gunakan fungsi ini untuk melakukan kompresi data
Public Function Compress(input As Byte(), output As Byte(), ukuranInput As UInteger) As Integer Dim sim As Simbol() = New Simbol(255) {} Dim temp As Simbol Dim stream As New BitStream() Dim i As UInteger, totalBytes As UInteger, swaps As UInteger, symbol As UInteger, simbolTerakhir As UInteger If ukuranInput < 1 Then Return 0 End If inisialisasiBitStream(stream, output) histogram(input, sim, ukuranInput) simbolTerakhir = 255 While sim(simbolTerakhir).Count = 0 simbolTerakhir -= 1 End While If simbolTerakhir = 0 Then simbolTerakhir += 1 End If buatTree(sim, stream, 0, 0, 0, simbolTerakhir) Do swaps = 0 For i = 0 To 254 If sim(i).Sim > sim(i + 1).Sim Then temp = sim(i) sim(i) = sim(i + 1) sim(i + 1) = temp swaps = 1 End If Next Loop While Convert.ToBoolean(swaps) For i = 0 To ukuranInput - 1 symbol = input(i) tulisBits(stream, sim(symbol).Code, sim(symbol).Bits) Next totalBytes = stream.Index If stream.posisiBit > 0 Then totalBytes += 1 End If Return CInt(totalBytes) End Function
3. Dapatkan hasil kompresi data dan ukuran data hasil kompresi yang baru
Dim teksKompresiData As String = System.Text.Encoding.[Default].GetString(KompresiData)
4. Lakukan proses pengembalian data kompresi menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim PengembalianData As Byte() = New Byte(ukuranInputData - 1) {} Decompress(KompresiData, PengembalianData, CUInt(ukuranKompresiData), ukuranInputData)
* Gunakan fungsi ini untuk melakukan pengembalian data kompresi
Public Sub Decompress(input As Byte(), output As Byte(), ukuranInput As UInteger, ukuranOutput As UInteger) Dim nodes As TreeNode() = New TreeNode(MAX_TREE_NODES - 1) {} For counter As Integer = 0 To nodes.Length - 1 nodes(counter) = New TreeNode() Next Dim root As TreeNode, node As TreeNode Dim stream As New BitStream() Dim i As UInteger, jumlahNode As UInteger Dim buffer As Byte() If ukuranInput < 1 Then Return End If inisialisasiBitStream(stream, input) jumlahNode = 0 root = kembalikanTree(nodes, stream, jumlahNode) buffer = output For i = 0 To ukuranOutput - 1 node = root While node.Simbol < 0 If Convert.ToBoolean(bacaBit(stream)) Then node = node.ChildB Else node = node.ChildA End If End While buffer(i) = CByte(node.Simbol) Next End Sub
5. Dapatkan hasil pengembalian data dan ukuran data hasil hasil pengembalian data kompresi yang baru
Dim teksPengembalianData As String = System.Text.Encoding.[Default].GetString(PengembalianData) Dim ukuranPengembalianData As UInteger = CUInt(teksPengembalianData.Length)
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
bagaimana perlakuannya terhadap citra? bisa bantu?
Algoritma ini tentu saja dapat langsung diterapkan pada citra. Hasil kompresi citra akan mirip seperti contoh kasus pada algoritma ini, yaitu akan menjadi berbagai karakter yang tidak dapat terbaca, akan tetapi apabila dilihat dari ukurannya, maka seharusnya ukuran hasil kompresi citra akan menjadi kurang dari ukuran citra awal.