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