• Tidak ada hasil yang ditemukan

PERANCANGAN SISTEM

3.2 Perancangan Algoritma Kompresi

3.2.1.2 Algoritma LZ77 Decoding

Untuk proses decoding algoritma LZ77, input terdiri dari string karakter yang akan diproses (source). String ini pada dasarnya merupakan kumpulan dari token hasil proses encoding sebelumnya. Input selanjutnya adalah panjang bit yang dibutuhkan untuk menyimpan history buffer (chbuffer) , dan panjang bit yang dibutuhkan untuk menyimpan lookahead buffer (clbuffer).

Untuk mengukur kompleksitasnya, algoritma decoding LZ77 dirancang dalam bentuk flowchart seperti pada gambar 3.5. Lalu dari flowchart tersebut dikembangkan kedalam bentuk pseudo code seperti tabel 3.9.

Start

source ← baca string input;

bhbuffer ← baca batasan panjang history buffer;

blbuffer ← baca batasan panjang lookahead buffer; Konversi source ke bentuk token;

output ← “”;

x baca 1 token berikutnya dari source;

EOF token? Tidak

f ← sub token 1 dari token; l ← sub token 2 dari token;

c ← sub token 3 dari token;

outlen ← panjang string output;

output ← output + ambil sebanyak l karakter dari string

output dimulai pada karakter ke (outlen-f) + c;

Stop

Ya

Tampilkan output

Gambar 3.5 Flowchart Algoritma LZ77 Decoding

Tabel 3.9 Algoritma LZ77 Decoding

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 9 10 11 12 13

string source ← input dari user;

int chbuffer ← input dari user;

int clbuffer ← input dari user;

int ctoken ← chbuffer+clbuffer+8;

string stream_input ← string_to_bit_stream (source,ctoken);

int len ← strlen(stream_input);

int i ← 0; string shbuffer ← ""; string fulltoken ← ""; int sub_token1 ← 0; int sub_token2 ← 0; 1 1 1 1+1+1=3 (136n + 23)*2 1+1=2 1 1 1 1 1

Andre Pratama : Studi Perbandingan Kinerja Algoritma Kompresi Lempel Ziv 77, Lempel Ziv 78 Dan Lempel Ziv Welch Pada File Text, 2010.

42 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 int sub_token3 ← 0; string add ← ""; string output ← ""; int output_len ← 0; while i<len do fulltoken ← sub_str(stream_input,i,ctoken); sub_token1 ← bintodec(sub_str(fulltoken,0, chbuffer)); sub_token2 ← bintodec(sub_str(fulltoken, chbuffer,clbuffer)); sub_token3 ← chr(bintodec(sub_str (fulltoken,chbuffer+clbuffer,8)));

if (sub_token1==0) and (sub_token2==0) then

output ← output.sub_token3; else output_len ← strlen(output); add sub_str(output,(output_len-sub_token1),sub_token2); output ← output.add.sub_token3; end if i ← i + ctoken; end while if sub_token3 == chr(0) then output sub_str(output,0,strlen(output)-1); end if 1 1 1 1 n (1+6*(a+b+8)+8)n (1+12*13+23+6*b+ 8)*n=6bn+194n (1+12*8+23+6*a+8 )*n=6an+134n (1+12*8+23+6*8+8 +1)*n=177n (1+1)*n=2n (1+1)*n=2n (1+1)*n=2n (1+6*a+8+1)*n= 6an+10n (1+1+1)*n=3n (1+1)*n=2n 1+1=2 1+6*n*3+8+1+1= 18n+11 Total Kompleksitas

Setelah menyimpan input dari user pada 3 baris pertama, pada baris ke 4 dihitung berapa bit panjang yang diperlukan oleh sebuah token. Panjang token diperoleh dari panjang bit yang dibutuhkan oleh history buffer, ditambah dengan panjang bit yang dibutuhkan oleh lookahead buffer dan ditambah 8 (panjang bit 1 karakter ASCII). Fungsi stream_to_bit_stream pada baris ke 5 akan mengkonversi

string karakter menjadi bit stream pembentuknya. Baris 9-17 untuk menginisialisasi

beberapa variabel yang dibutuhkan dalam proses encoding.

Proses perulangan untuk mengkodekan token kembali menjadi string aslinya dimulai dari baris 19 sampai 39. Langkah pertama adalah mengkonversi kembali bit

stream menjadi token. Masing-masing sub token ini disimpan dalam variabel sub_token1, sub_token2 dan sub_token3. Selanjutnya dipersiapkan sebuah variabel output untuk menampung string akhir. Perulangan if digunakan untuk membagi proses

kedalam string output, tetapi jika sub_token1 dan sub_token2 tidak bernilai 0, maka tambahkan karakter baru sebanyak sub_token2 karakter, dimulai dari karakter ke- (panjang output - sub_token1) dari output saat ini, lalu ditambah 1 karakter dari

sub_token3. Untuk proses lebih jelasnya, diperlihatkan pada gambar 3.6.

token add output+add

... (0,0,e) (15,4,e) (11,2,d) ... e b bae ccd

cab babcdd ccbab cab babcdd ccbabe cab babcdd ccbabeb bae cab babcdd ccbabeb baeccd

Gambar 3.6 Proses Decoding Token Algoritma LZ77

Pada gambar 3.6 terlihat output berisi beberapa karakter, lalu token yang akan dikodekan selanjutnya adalah: (0,0,e),(2,4,c),(1,2,d). Dalam tiap pembacaan

token, variabel add akan menampung nilai sementara dari token. Pada saat token

(0,0,e) diproses, add akan berisi “e”, lalu ditambahkan pada output. Pada token (2,4,e), variabel add akan berisi 4 karakter yang diambil mulai dari karakter ke (17-15=4) dari

output saat ini, ditambah “e”. Sehingga add akan berisi “b bae”. Dan pada saat token

(11,2,d) diproses , variabel add akan berisi 2 karakter yang diambil mulai dari karakter ke (22-11=11) dari output ditambah “d”. Sehingga add akan berisi “ccd”.

Langkah pada baris 41-44 adalah proses untuk mengatasi masalah pada

token terakhir. Hal ini terjadi jika token terakhir berbentuk (x,x,null). Karakter null ini

didapat pada saat proses encoding (pembentukan token) sudah mencapai akhir file (EOF), sehingga tidak ada lagi karakter setelah pola karakter yang diproses sebagai pengisi sub_token3 . Pada proses pengkodean token, null ini akan ditambahkan pada

string output. Namun jika token terakhir adalah (x,x,not null), tidak ada masalah.

Untuk mengatasinya, jika sub_token3 sama dengan null (nilai ASCII dari null adalah 0), hapus 1 karakter terakhir dari string output.

...(0,0,e),(2,4,c),(1,2,d) 0123456789012345

token:

cab babcdd ccbab

Andre Pratama : Studi Perbandingan Kinerja Algoritma Kompresi Lempel Ziv 77, Lempel Ziv 78 Dan Lempel Ziv Welch Pada File Text, 2010.

44

Kompleksitas dari LZ77 decoding : 1. Baris 1-4 : pembacaan input, kompleksitas: 6.

2. Baris 6 : proses konversi dari bit stream ke string, kompleksitas: (136n + 23)*2 = 272n+46 (dengan asumsi 1 token = 2 karakter).

3. Baris 8-17 : inisialisasi variabel awal, kompleksitas: 11.

4. Baris 19-36 : proses membaca token dan menghasilkan string output, kompleksitas: 12an+6bn+6a+6b+581n.

5. Baris 41-44 : mengatasi masalah karakter terakhir, kompleksitas: 6n*3+13 = 18n+13 (dengan asumsi satu token akan menghasilkan 3 karakter).

Sehingga total kompleksitas algoritma LZ77 decoding adalah: 6+272n+46 +11+12an +6bn+6a+6b+581n +18n+13= 12an+6bn+6a+6b+871n+76 . Dengan notasi big O = O(an+bn). Dimana b adalah panjang bit yang diperluka n oleh history buffer, a adalah panjang bit yang dibutuhkan lookahead buffer, dan n jumlah token yang akan dikodekan.

3.2.2 Algoritma LZ78

Dasar teori untuk algoritma kompresi LZ78 telah dibahas pada bab sebelumnya. Untuk perancangan algoritma, besar dictionary akan dibatasi. Jika pada saat melakukan proses kompresi dictionary sudah penuh, maka proses selanjutnya hanya menggunakan pola yang ada di dalam dictionary tanpa menambahkan index baru ke dalam dictionary.

Besar dictionary tersebut akan dirancang supaya dapat mendukung beberapa nilai tertentu yang dapat dipilih. Besar dictionary yang didukung adalah 2n, dengan n = 8,9,10,11,12 dan 13. Dimana n merupakan banyak bit yang diperlukan untuk menyimpan nilai maksimum dari index dictionary. Jika menggunakan 10 bit,

dictionary itu akan mempunyai 1024 (210) buah index. Sehingga besar dictionary yang didukung adalah 256, 512, 1024, 2048, 4096, 8192, atau16384. Index array yang digunakan dimulai dari 0, jadi index maksimum = besar dictionary - 1.

Token dalam algoritma LZ78 terdiri dari 2 bagian, berbentuk (f,c). Dimana f

pertama sesudah pola. Token ini nantinya akan dikonversi menjadi bit stream seperti gambar x.x. Banyak bit yang diperlukan untuk f tergantung pada input awal, jika besar

dictionary ditentukan 2048, maka akan diperlukan 11 bit untuk f. Sedangkan untuk c

akan membutuhkan 8 bit, yaitu nilai ASCII dari karakter tersebut.

Output token: (856,c) (507,K)

Bit Stream:

Gambar 3.7 Konversi Token Ke Bit Stream Algoritma LZ78

Semakin besar dictionary yang digunakan, akan semakin banyak pula bit yang dibutuhkan untuk membentuk sebuah token. Namun, kemungkinan banyaknya pola yang tersimpan juga akan semakin besar sehingga file akhir menjadi lebih kecil. Dengan menggunakan beberapa nilai dictionary nantinya akan dapat dianalisis kelemahan dan kelebihan menggunakan dictionary yang besar atau kecil.

Bit stream ini lalu akan di konversi menjadi karakter ASCII dengan fungsi bit_stream_to_string(). Dalam implementasinya nanti, kumpulan karakter ASCII

tersebut akan disimpan ke dalam sebuah file akhir.

Dalam proses encoding, fungsi stream_to_ bit_string() akan mengubah kembali string karakter ini kedalam bentuk bit stream semula, dan dibentuk token yang sama dengan pada proses encoding. Gambar 3.8 memperlihatkan konversi bit

stream ke bentuk token untuk algoritma LZ78.

Bit Stream:

Token: (856,c) (507,,K)

Gambar 3.8 Konversi bit stream ke token algoritma LZ78 1101011000 01100011 0111111011 01001011

Andre Pratama : Studi Perbandingan Kinerja Algoritma Kompresi Lempel Ziv 77, Lempel Ziv 78 Dan Lempel Ziv Welch Pada File Text, 2010.

46

Dokumen terkait