Implementasi Algoritma Huffman Analisis Perbandingan Kinerja Algoritma Shannon-Fano, Arithmetic Coding, Dan Huffman Pada Kompresi Berkas Teks Dan Berkas Citra Digital

73

4.3 Implementasi Algoritma Huffman

4.3.1 Kompresi algoritma Huffman Misalkan kata yang akan dimampatkan adalah “ilkom”. Maka dilakukan pendataan karakter dari “ilkom” yang dijabarkan pada Tabel 4.17. Tabel 4.17 Pendataan Karakter Huffman Karakter Frekuensi i 1 l 1 k 1 o 1 m 1 Jumlah karakter 5 Dilakukan proses pengurutan dari frekuensi pada Tabel 4.17 secara menaik yang dijabarkan pada Tabel 4.18. Tabel 4.18 Pengurutan Frekuensi Huffman I Karakter Frekuensi i 1 l 1 k 1 o 1 m 1 Dilakukan penggabungan antara dua frekuensi terkecil i dan l sebagai α dan dibentuk menjadi tree seperti pada Gambar 4.8. α 2 i 1 l 1 Gambar 4.8 Tree α Sehingga tabel frekuensi Huffman menjadi seperti Tabel 4.19. Universitas Sumatera Utara 74 Tabel 4.19 Frekuensi Huffman I Karakter Frekuensi α i,l 2 k 1 o 1 m 1 Dilakukan proses pengurutan dari frekuensi pada Tabel 4.19 secara menaik yang dijabarkan pada Tabel 4.20. Tabel 4.20 Pengurutan Frekuensi Huffman II Karakter Frekuensi k 1 o 1 m 1 α i,l 2 Dilakukan penggabungan antara dua frekuensi terkecil k dan o sebagai β dan dibentuk menjadi tree seperti pada Gambar 4.9. β 2 k 1 o 1 Gambar 4.9 Tree β Sehingga tabel frekuensi Huffman menjadi seperti Tabel 4.21. Tabel 4.21 Frekuensi Huffman II Karakter Frekuensi β k,o 2 m 1 α i,l 2 Dilakukan proses pengurutan dari frekuensi pada Tabel 4.21 secara menaik yang dijabarkan pada Tabel 4.22. Universitas Sumatera Utara 75 Tabel 4.22 Pengurutan Frekuensi Huffman III Karakter Frekuensi m 1 α i,l 2 β k,o 2 Dilakukan penggabungan antara dua frekuensi terkecil m dan αi,l sebagai γ dan dibentuk menjadi tree seperti pada Gambar 4.10. γ 3 m 1 α 2 i 1 l 1 Gambar 4.10 Tree γ Sehingga tabel frekuensi Huffman menjadi seperti Tabel 4.21. Tabel 4.23 Frekuensi Huffman III Karakter Frekuensi γ m,α 3 β k,o 2 Dilakukan proses pengurutan dari frekuensi pada Tabel 4.23 secara menaik yang dijabarkan pada Tabel 4.24. Tabel 4.24 Pengurutan Frekuensi Huffman IV Karakter Frekuensi β k,o 2 γ m,α 3 Dilakukan penggabungan antara dua frekuensi terkecil m dan αi,l sebagai δ dan dibentuk menjadi tree seperti pada Gambar 4.11. Universitas Sumatera Utara 76 β 2 k 1 o 1 γ 3 m 1 α 2 i 1 l 1 δ 5 Gambar 4.11 Tree δ Dengan penggabungan dua karakter terakhir seperti di atas, maka proses penggabungan selesai dilakukan dan dilanjutkan dengan pemberian label biner 0 untuk karakter kiri node kiri dan label biner 1 untuk karakter kanan node kanan seperti Gambar 4.12. β 2 k 1 o 1 1 γ 3 m 1 1 α 2 i 1 l 1 1 δ 5 1 Gambar 4.12 Huffman’s Tree Dilakukan pendataan Huffman’s Code dalam Codebook Huffman yang dijabarkan pada Tabel 4.25. Universitas Sumatera Utara 77 Tabel 4.25 Codebook Huffman Karakter Huffman’s Code i 110 l 111 k 00 o 01 m 10 Berdasarkan Huffman’s Code yang telah didapatkan, maka label biner dari setiap karakter disusun persis posisinya seperti pada kata asli dan diperoleh bit 110111000110. Kemudian bit tersebut diubah menjadi karakter ASCII sehingga menjadi 11011100 sebagai Ü, dan bit 0110 ditambahkan beberapa biner 0 di depannya agar menjadi 8 bit sehingga menjadi 00000110 sebagai –. Untuk pembeda antara biner yang asli dan biner yang mendapatkan penambahan bit, diberikan satu bilangan desimal sebelum karakter terakhir yang merupakan banyaknya bit asli pada karakter terakhir. Dalam contoh ini, bilangan desimal yang diberikan adalah 4. Maka kata “ilkom” direpresentasikan sebagai Ü4–. 4.3.2 Dekompresi algoritma Huffman Pada proses dekompresi, dibutuhkan Codebook Huffman seperti pada Tabel 4.25 untuk pengembalian karakter ASCII asli dari data yang akan diproses. Berdasarkan contoh kata “ilkom” yang telah dimampatkan menjadi “Ü4–”, maka akan didapatkan biner dari karakter ASCII pertama, yaitu “Ü” sebagai 11011100; ditemukan bilangan biner 4 yang menandakan banyaknya bit pada karakter yang diikutinya, yaitu sebagai 0110. Maka biner yang akan didekompresi adalah 110111000110. Dicocokkan setiap bit yang ada dengan Codebook Huffman pada tabel 4.21 di atas. Dari bit pertama sampai bit ketiga yaitu 110, didapatkan karakter yang direpresentasikannya adalah “i”; dari bit keempat sampai bit keenam yaitu 111, didapatkan karakter yang direpresentasikannya adalah “l”; dari bit ketujuh dan bit kedelapan yaitu 00, didapatkan karakter yang direpresentasikannya adalah “k”; dari bit kesembilan dan bit kesepuluh yaitu 01, didapatkan karakter yang direpresentasikannya adalah “o”; dan dari bit kesebelas dan bit keduabelas atau terakhir yaitu 10, didapatkan karakter yang direpresentasikannya adalah “m”. Maka kata yang direpresentasikan oleh biner 111001001000 adalah “ilkom”. Universitas Sumatera Utara 78 4.3.3 Kompleksitas waktu algoritma Huffman Tabel 4.26 menunjukkan algoritma Huffman pada proses kompresi dalam pseudocode beserta waktu eksekusinya Tn untuk setiap baris. Tabel 4.26 Kompleksitas Waktu Kompresi Algoritma Huffman Baris Pseudocode Tn 1 find_lowesthufftree[] mytree, int index 2 { 3 banding 4 { 5 bool kosong = true; 6 int index = 0; 7 int sum = 0; 8 } 9 10 banding[0] = new banding; 11 banding[1] = new banding; 12 13 array tchar[String g_char, String g_code, int g_count]; 14 15 for int i=0; iindex; i++ 2n+n 16 { 17 output tchar[i].g_char,tchar[i].g_code; 18 if mytree[i].sum = 0 n 19 { 20 if result[0].kosong nn 21 { 22 result[0].index = mytree[i].index; n 23 result[0].sum = mytree[i].sum; n 24 result[0].kosong = false; n 25 } 26 else if mytree[i].sum result[0].sum nn 27 { 28 result[0].sum = mytree[i].sum; n 29 result[0].index = mytree[i].index; n 30 } 31 } 32 } 33 34 for int i=0; iindex; i++ 2n+n 35 Universitas Sumatera Utara 79 Baris Pseudocode Tn 36 { 37 if mytree[i].sum = 0 mytree[i].index = result[0].index n 38 { 39 if result[1].kosong nn 40 { 41 result[1].index = mytree[i].index; n 42 result[1].sum = mytree[i].sum; n 43 result[1].kosong = false; n 44 } 45 else if mytree[i].sum result[1].sum nn 46 { 47 result[1].sum = mytree[i].sum; n 48 result[1].index = mytree[i].index; n 49 } 50 } 51 } 52 53 int[3] out; 54 out[0] = result[0].index; n 55 out[1] = result[1].index; n 56 57 if result[0].kosong || result[1].kosong n 58 { 59 out[2] = 1; n 60 } 61 else n 62 { 63 out[2] = 0; n 64 } 65 returnout; 66 } 67 68 the_huffmanhufftree[] mytree,int i_mytree 69 { 70 int[3] lowest; 71 lowest = find_lowestmytree,i_mytree; 72 73 if lowest[2] == 0 n 74 { 75 for int i=0; imytree[lowest[0].i_char_index; i++ 2n+nn Universitas Sumatera Utara 80 Baris Pseudocode Tn 76 { 77 mytree[lowest[0].char_index[i]]. add_code0; nn 78 output tchar[i].g_char,tchar[i].g_code; 79 } 80 81 for int i=0; imytree[lowest[1].i_char_index; i++ 2n+nn 82 { 83 mytree[lowest[1]]. char_index[i].add_code1; nn 84 output tchar[i].g_char,tchar[i].g_code; 85 } 86 } 87 } Berdasarkan Tabel 4.26 maka total waktu eksekusi dari proses kompresi algoritma Huffman adalah: Tn = 19 × n + 4 × 2n + n 6 × nn = 12n 2 + 25n Big-O = n 2 . Tabel 4.27 menunjukkan algoritma Huffman pada proses dekompresi dalam pseudocode beserta waktu eksekusinya Tn untuk setiap baris. Universitas Sumatera Utara 81 Tabel 4.27 Kompleksitas Waktu Dekompresi Algoritma Huffman Baris Pseudocode Tn 1 decode 2 { 3 String bin, biner; 4 array tree[String g_char, String g_code]; 5 6 int binLength = bin.length; 7 n 8 char[] binCharAt = bin.toCharArray; n 9 10 Stringbuffer bf; 11 biner = ; 12 13 for int i=0; ibinLength; i++ 2n+n 14 { 15 biner += binCharAt[i]; n 16 17 for int j=0; jtree.length; j++ 2nn-1 18 { 19 output biner+ , +tree[j].g_code; 20 if biner.equalstree[j].g_code n-2 n-1 21 { 22 output karakter : + tree[j].g_char; 23 bf.appendtree[j].g_char; n-2 n-1 24 output string : +bf; 25 biner = ; 26 } 27 } 28 } 29 } Berdasarkan Tabel 4.27 maka total waktu eksekusi dari proses dekompresi algoritma Huffman adalah: Tn = 3 × n + 2n + n + 2nn-1 + 2 × n-2n-1 = 4n 2 – 2n + 4 Big-O = n 2 Universitas Sumatera Utara 82

4.4 Implementasi Aplikasi Kompresi Berkas