178
IMPLEMENTASI METODE LZ77 DAN LZ78 UNTUK
KOMPRESI FILE TEKS
Hariati Tarigan
Mahasiswa Teknik Informatika STMIK Budi Darma Jl. Sisingamangaraja No. 338 Simpang Limun, Medan
ABSTRAK
Kompresi data dilakukan untuk mereduksi ukuran data atau file. Dengan melakukan kompresi atau pemadatan data maka ukurannya akan lebih kecil sehingga dapat mengurangi waktu transmisi data dikirim, dan tidak banyak menghabiskan ruang media penyimpanan, untuk penghematan pemakaian terhadap media penyimpanan, seperti hard disk atau media-media penyimpanan data yang lainnya, sekaligus sebagai perangkat lunak untuk mengaktifkan program tersebut.Pada metode LZ77 proses kompresi dilakukan dengan mengetahui frekuensi kemunculan setiap simbol yang kemudian akan diurutkan secara descending order. Kemudian, akan dibuat sebuah table pembagian berdasarkan frekuensi kemunculan tersebut. Pada metode LZ78 tidak menggunakan tabel pembagian. Proses pengkodean dilakukan dengan mengurutkan frekuensi kemunculan setiap symbol secara descending order. Angka hasil pengurutan inilah yang akan dikodekan dengan n-1 diikuti oleh satu bit 0. Pada bit terakhir kode akan dimodifikasi yaitu berupa n-1 tanpa diikuti oleh satu bit 0.Dewasa ini ada banyak metode kompresi file teks , salah satunya adalah kompresi file teks dengan metode LZ77 dan LZ78. KompresiLZ77 dan LZ78 merupakan salah satu teknik yang mampu menghasilkan rasio kompresi yang baik pada data teksdimana frekuensi kemunculan tiap-tiap kata terbesar.Teknik kompresi LZ78 diperkenalkan oleh Abraham Lempel dan Jacob Ziv, teknik ini dengan cara membuat sebuah dictionary yang dapat menyimpan pola secara permanen selama proses pengkodean berlangsung
.
Kata Kunci : LZ77, LZ78, Kompresi, Dekompresi I. PENDAHULUAN
Di dalam dunia komputer dan internet, kompresi file digunakan dalam berbagai keperluan, misalnya membackup data dan transfer data. Untuk membackup data, tidak perlu menyalin semua file aslinya, dengan kompresi file terlebih dahulu, maka kapasitas tempat penyimpanan yang di perlukan menjadi lebih kecil. Jika data tersebut diperlukan, maka kembalikan lagi ke file aslinya (dekompresi
file). Selain berguna pada media penyimpanan data,
kompresi file dapat membantu memperkecil ukuran data yang ditransmisikan didalam suatu media jaringan, seperti internet sehingga waktu yang diperlukan akan menjadi lebih pendek dan kemungkinan pekerjaan download dan upload yang gagal akan menjadi lebih kecil.
Kompresi data dilakukan untuk mereduksi ukuran data atau file. Dengan melakukan kompresi atau pemadatan data maka ukurannya akan lebih kecil sehingga dapat mengurangi waktu transmisi data dikirim, dan tidak banyak menghabiskan ruang media penyimpanan, untuk penghematan pemakaian terhadap media penyimpanan, seperti hard disk atau media-media penyimpanan data yang lainnya, sekaligus sebagai perangkat lunak untuk mengaktifkan program tersebut.
Dewasa ini ada banyak metode kompresi file teks, salah satunya adalah kompresi file teks dengan metode LZ78. Kompresi LZ78 merupakan salah satu teknik yang mampu menghasilkan rasio kompresi yang baik pada data teks dimana frekuensi kemunculan tiap-tiap katakter besar. Teknik kompresi LZ78 diperkenalkan oleh Abraham Lempel dan Jacob Ziv, teknik ini dengan cara
membuat sebuah dictionary yang dapat menyimpan pola secara permanen selama proses pengkodean berlangsung. Pada penelitian sebelumnya metode LZ77 juga pernah dibahas pada penelitian yang berjudul “Implementasi Algoritma Kompresi LZ77 Pada Smartphone Blackberry”(Gunardi, 2011). Pada penelitian tersebut penulis mencoba menggunakan LZ77 pada Objek Smartphone Blackberry dalam melakukan kompresi file text.
II. LANDASAN TEORI A. File Teks
File teks merupakan file yang berisi
informasi-informasi dalam bentuk teks. Data yang berasal dari dokumen pengolah kata, angka yang digunakan dalam perhitungan, nama dan alamat dalam basis data merupakan contoh masukan data teks yang terdiri dari karakter, angka dan tanda baca. Masukan dan keluaran data teks direpresentasikan sebagai set karakter atau sistem kode yang dikenal oleh sistem komputer. Ada tiga macam set karakter yang umum digunakan untuk masukan dan keluaran pada komputer, yaitu ASCII, ABCDIC, dan Unicode. ASCII (American Code For
Information Interchange) merupakan suatu standar
internasional dalam kode huruf dan simbol seperti Hex dan Unicode tetapi ASCII lebih bersifat universal. ASCII digunakan oleh computer dan alat komunikasi lain yang menunjukkan teks. Kode ASCII memiliki komposisi bilangan biner sebanyak 8 bit, dimulai dari 00000000 hingga 11111111. Total kombinasi yang dihasilkan sebanyak 256, dimulai dari kode 0 hingga 155 dalam sistem bilangan desimal. EBCDIC (Extended Binary Codec Decimal
Interchange) merupakan set karakter yang
diciptakan oleh merk IBM. EBCDIC terdiri dari 256 karakter yang masing-masing berukuran 8 bit. Adanya keterbatasan pada kode ASCII dan EBCDIC, dibuat standar kode internasional baru yang merupakan kode 16 bit yang disebut Unicode. Unicode adalah suatu standar industri yang dirancang untuk mengizinkan teks dan simbol dari semua sistem tulisan di dunia untuk ditampilkan dan dimanipulasi secara konsisten oleh komputer ( Sudewa, Ida Bagus Adi, 2003).
A. Algoritma Lempel Ziv 78
Algoritma Lempel Ziv 78 (LZ78), dikembangkan 1 tahun setelah LZ77, yaitu pada tahun 1978. Oleh Abraham Lempel dan Zacob Ziv. Karena di publikasikan oleh pihak yang sama, algoritma ini juga di sebut dengan LZ2.
Pada Algoritma LZ78 Abraham Lempel dan Jacob Ziv mencoba mengatasi permasalahan yang ditemukan pada LZ77, yaitu berkaitan dengan kemampuan dalam menemukan pola karakter pada LZ77, Algoritma ini tidak dapat menemukan pola karakter, jika karakter tersebut sudah di lewatkan oleh history buffering. Untuk mengatasinya, algoritma LZ78 di kembangkan dengan cara membuat suatu dictionary yang dapat menyimpan pola secara permanen selama proses pengkodean berlangsung.
Token yang digunakan sebagai index untuk
menemukan pola tersebut, berkurang dari 3 menjadi 2 buah. Sebuah token dalam LZ78 berbentuk (f,c). Dimana f adalah pointer yang merujuk dictionary dimana pola yang ditemukan, dan c karakter pertama sesudah pola.
Dictionary pada LZ78 dapat dibayangkan
sebagai array. Pada saaat proses pengkodean dimulai array ini kosong. Sewaktu algoritma membaca sebuah karakter input, ia akan mencari dalam array, apakah karakter itu sudah ada pada
array atau tidak. Jika tidak ditemukan, karakter itu
akan di masukkan ke dalam array, dan dihasilkan token : (0,c), dimana c adalah karakter yang tidak ditemukan tersebut. Tetapi jika didalam array ditemukan, akan dibuat string yang berisikan karakter yang ditemukan tadi, disambung dengan karakter berikutnya dari input, dan kembali di cari didalam array, apakah pola ini ada atau tidak. Jika ada, string tadi ditambahkan kembali, sampai tidak ditemukan pola yang sesuai dengan string didalam
array. Lalu string ini akan dimasukkan ke dalam array, dan dihasilkan token : (f,c). Dimana f adalah
index dari array untuk pola string yang ditemukan, dan c adalah karakter terakhir dari string. Proses ini berlangsung terus menerus sampai akhir file. ( Ida Mangyi, 2006).
Berikut ini adalah langkah-langkah pengkodean dengan menggunakan algoritma LZ78: 1. Kamus selalu dimulai dengan index 0 dan
karakter null
2. Baca karakter pertama dalam teks, misal P 3. Jika karakter yang ditunjuk belum ada dalam
kamus, maka:
a. Masukkan P ke field kedua dalam kamus dan beri indexnya
b. Field pertama pada token diisi angka 0, sedangkan field kedua pada token diisi karakter ”P”.
4. Jika karakter yang ditunjuk sudah ada dalam kamus, maka :
a. Baca karakter selanjutnya, misal C b. Cari apakah dalam kamus sudah ada
karakter PC
c. Jika rangkaian karakter tersebut tidak ada dalam kamus, maka :
a. Masukkan rangkaian karakter di
field kedua dalam kamus dan beri index.
b. Field pertama pada token diisi index kamus tempat rangkain
karakter sebelum karakter terakhir berada, sedangkan field kedua diisi karakter terakhir dalam rangkaian karakter tersebut.
5. Baca karakter selanjutnya dan lakukan langkah 3 dan 4 sampai pointer berada pada larakter terakhir dalam string.
Berikut ini adalah algoritma untuk melakukan dekompresi pada serangkaian token-token tersebut : 1. Baca token pertama dari serangkaian token
token yang ada.
2. Cocokkan token tersebut dengan kamus yang telah terbentuk.
3. Ubah token menjadi karakter yang sesuai. 4. Baca token selanjutnya dan lakukan langkah 2
dan 3 sampai token habis.
Tabel 2.1 adalah contoh 7 langkah pertama dalam mengkodekan string input : “ABBCBCABABCAABCAAB”. Kumpulan token inilah yang menjadi file kompresi pada algoritma LZ78. Salah satu masalah yang ada pada algoritma LZ78, adalah jumlah index, atau besar dari
dictionary yang diperlukan. Dictionary ini akan
bertambah banyak dengan sangat cepat. Salah satu cara sederhana adalah dengan membuat batas maksimum pada jumlah dictionary. Dan jika batas ini tercapai algoritma tidak akan memasukkan karakter ke dalam dictionary lagi, tetapi hanya memakai dictionary yang sudah ada.
C. Algoritma LZ77
Perancangan algoritma LZ77, dirancang agar panjang dari history buffer dan lookahaead
buffer mendukung beberapa nilai tertentu. Sehingga
nanti dapat dianalisis berapa panjang buffer yang efisien untuk LZ77. Untuk panjang history buffer terdiri dari 511, 1023, 2047, 4095, dan 8191 karakter. Pemilihan panjang ini untuk mengalokasikan berapa banyak digit bit yang diperlukan untuk menyimpan nilai sub token
pertama dari output algoritma. Output algoritma LZ77 berupa token dengan bentuk (f, l,c). Dimana f adalah jumlah karakter dari ujung jendela history
buffer kepada karakter yang ditemukan. Untuk
panjang history buffer 1023, nilai maksimal sub
token c adalah 1023. Hal ini terjadi jika pola
karakter yang ditemukan berada pada awal history
buffer. Bilangan biner dari 1023 adalah 1111111111,
yang terdiri dari 9 digit. Dengan 9 digit, sub token pertama dapat bernilai 0-1023. Jika maksimum
history buffer adalah 4095, akan membutuhkan 12
digit. Panjang lookahead buffer terdiri diri 15, 31, 63, 127 dan 255 karakter. Nilai ini digunakan pada sub token kedua dari token output LZ77. Dimana l adalah jumlah panjang dari karakter dalam
lookahead buffer yang ditemukan cocok pada history buffer. l akan bernilai sama dengan panjang history buffer jika pola karakter yang ada pada lookahead buffer terdapat seluruhnya pada history buffer. Untuk sub token ketiga (c) adalah karakter
pertama setelah karakter yang sudah dikodekan. Karakter ini akan membutuhkan 8 digit bit. Karena akan dikonversi menjadi nilai ASCII pembentuknya. Algoritma diatas membutuhkan 3 buah input, yaitu
string yang akan dikodekan dengan panjang n
karakter (source ), panjang bit yang dibutuhkan untuk menyimpan buffer buffer (chbuffer) , dan panjang bit yang dibutuhkan untuk menyimpan
lookahead buffer (clbuffer)).
III. ANALISISA DAN PERANCANGAN
Analisa Kompresi Terhadap suatu File Teks Dengan LZ78
Analisa Kompresi File teks dengan algoritma LZ78 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
yang didukung adalah 2n, dengan n = 8, 9, 10, 11,
12, dan 13. Dengan n sebagai banyak bit yang diperlukan untuk menyimpan nilai maksimum dari
index dictionary. Jika menggunakan 10 bit, dictionary itu akan mempunyai 210 index. Sehingga
besar dictionary yang didukung ialah 256, 512, 1024, 2048, 4096, 8192, atau 16384. Index yang digunakan dimulai dari 0. Token dalam algoritma LZ78 terdiri dari dua bagian, berbentuk (f,c). Dengan f sebagai index pada dictionary tempat pola ditemukan, dan c karakter pertama yang ditemukan pada pola.
Untuk lebih memperjelas algoritma ini, langsung saja pada studi kasus berikut ini. File tersebut
berisikan karakter “
ada_berapa_data_yang_hilang”. Jika file ini akan dikompresi dengan menggunkan metode LZ78, maka file akan di dapat sebagai berikut :
Jumlah karakter asli : 27 byte Jumlah bit = Jumlah Karakter * 8
= 27 * 8
= 216 bit, yang terdapat dalam file asli
Gambar 1. Proses Kompresi Encoding Tabel 1. Pencarian Bit
Index Index-1 Bits Numbers of Significant bits 1 0 0 1 2 1 1 3 2 10 2 4 3 11 5 4 100 3 6 5 101 7 6 110 8 7 111 9 8 1000 4 10 9 1001 11 10 1010 12 11 1011 13 12 1100 14 13 1101 15 14 1110 16 15 1111 Pesan yang terkompres:
(0,a)(0,d)(1,_)(0,b)(0,e)(0,r)(1,p)(3,d)(1,t)(3,y)(1,n)( 0,_)(0,h)(0,i)(0,l)(11,g) Indeks 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Bits: (1+8) + ( 1+8) + (2+8) + (2+8) + (3+8) +(3+8) +(3+8)+ (3+8)+ (4+8) + (4+8) + (4+8) + (4+8) + (4+8) + (4+8) + (4+8) + (4+8)= 178 bit
Rasio Kompresi nya adalah :
𝑅𝑎𝑠𝑖𝑜 𝐾𝑜𝑚𝑝𝑟𝑒𝑠𝑖 = (𝑢𝑘𝑢𝑟𝑎𝑛 ℎ𝑎𝑠𝑖𝑙 𝑓𝑖𝑙𝑒 𝑘𝑜𝑚𝑝𝑟𝑒𝑠𝑖
𝑢𝑘𝑢𝑟𝑎𝑛 𝑓𝑖𝑙𝑒 𝑎𝑠𝑙𝑖 ) 𝑥 100%
𝑅𝑎𝑠𝑖𝑜 𝐾𝑜𝑚𝑝𝑟𝑒𝑠𝑖 = (178
216) 𝑥 100%
Sedangkan pohon (tree) dari kasus diatas dapat dilihat pada gambar 2.
Gambar 2. Proses Dekompresi LZ78 Sebuah string output hasil kompresi dari encoding adalah:
(0,a)(0,d)(1,_)(0,b)(0,e)(0,r)(1,p)(3,d)(1,t)(3,y)(1,n)( 0,_)(0,h)(0,i)(0,l)(11,g)
Gambar 3. Proses Kompresi Decoding Analisa Kompresi Terhadap suatu File Teks Dengan LZ77
Rancang tabel dari data diatas. Banyaknya index ditentukan dengan banyaknya jumlah karakter yang mau di encode. Disini ada 9 index pada karakter kakikakek
Search Buffer Look Ahead Buffer Encodi ng 9 8 7 6 5 4 3 2 1 Input Output Kakikak ek (0,0,k) k Akikake k Hasil Encode pertama (0,0,k)
Untuk dua output pertama bernilai 0 karena pada bagian seacrh buffer kita masih kosong, sedangkan karakter k karena karakter pertama yang akan digeser ke search buffer adalah huruf k, sehingga huruf k digeser ke index ke-1 maka output look-ahead buffer menjadi akikakek.
Search Buffer Look Ahead Encodi ng Buffer 9 8 7 6 5 4 3 2 1 Input Output Kakikak ek (0,0,k) k Akikake k (0,0,a) K a Kikakek
Hasil Encode kedua (0,0,a)
Karakter selanjutnya yang akan digeser ke search buffer adalah a, dan disini kita akan mencari karakter a tersebut ada tidak di index search buffer, ternyata tidak ada. Maka encodenya adalah 0 dan panjang karakter yang sama adalah 0 karakter. Jadi encodingnya (0,0,a) lalu huruf a digeser ke search buffer ke index ke-1 dan huruf k digeser ke index ke-2, output look-ahead buffernya jadi kikakek.
Search Buffer Look Ahead Buffer Encodi ng 9 8 7 6 5 4 3 2 1 Input Output kakikak ek (0,0,k) k akikake k (0,0,a) K a kikakek (2,1,1) k a K i kakek Hasil Encode ketiga (2,1,i)
Perhatikan tabel diatas karakter selanjutnya yang akan digeser ke search buffer adalah k, dan disini kita akan mencari karakter k tersebut ada tidak di index search buffer ternyata ada cek karakter selanjutnya yaitu i, ternyata tidak ada jadi hanya karakter k yang ada di search buffer. Ternyata ada pada diindex ke-2 dan panjang karakter yang sama adalah 1 karakter. Sehingga jadi encodingnya (karakter di L-AB ada di SB pada index ke-2, sepanjang 1 karakter jika karakter di L-AB ada di SB maka karakter selanjutanya yang gak ada di SB ) atau (2,1,i) terus karakter k i digeser ke search buffer ke index ke-2 dan karakter k a digeser ke index ke-4. output look-ahead buffernya jadi kakek.
Search Buffer Look Ahead Buffer Encodi ng 9 8 7 6 5 4 3 2 1 Input Output Kakikak ek (0,0,k) k Akikake k (0,0,a) K a Kikakek (2,1,1) k a K i Kakek (4,3,e) k a k I k A K e K
Hasil Encode keempat (4,3,e) Jadi karakter selanjutnya yang akan digeser ke search buffer adalah k cek di search buffer jika ada cek lagi karakter selanjutnya yaitu a ternyata ada lagi cek lagi yaitu karakter k lagi ternyata ada juga lanjut terus di cek lagi, karakter selanjutnya adalah e ada tidak di search buffer ternyata tidak ada yang ada setelah di cek yaitu karakter k a k. Itu adanya pada index keberapa pada search buffer ternyata pada index ke-4 . Sepanjang 3 karakter sehingga jadi encodingnya adalah (4,3,e) lalu karakter k a k e digeser ke search buffer ke index ke-4 dan karakter k a k i digeser ke index ke-8, output look-ahead buffernya jadi k
Search Buffer Look Ahead Buffer Encodi ng 9 8 7 6 5 4 3 2 1 Input Output Kakikak ek (0,0,k) k Akikake k (0,0,a) K a Kikakek (2,1,1) k A K i Kakek (4,3,e) k a k I k A K e K (8,1,-) k a k i K a K E k -
Terakhir hasil encode kelima (8,1) pada karakter selanjutnya yang akan di cek di search buffer adalah karakter k, ternyata ada di search buffer jika ada, cek karakter selanjutnya tetapi karakter selanjutnya sudah habis langsung saja ke karakter k yang ada di search buffer pada index ke-8 sepanjang 1 karakter, jadi hasil encodingnya adalah (8,1) lalu karakter k digeser ke search buffer ke index ke-1 dan karakter kakikake digeser ke index ke-9, output look-ahead buffernya tidak ada.
Jadi hasil encoding kakikakek menggunakan kompresi jenis LZ77 adalah (00k00a21143e81). IV. IMPLEMENTASI
Dalam proses kompresi dengan algoritma LZ77 maka langkah pertama yang harus dilakukan oleh user yaitu dengan memilih pilihan pada radio button pada pilihan LZ77 kemudian klik tombol browse untuk mencari file yang akan dikompres, dalam hal ini file yang akan dipilih yaitu file dengan extension *.txt. Setelah file terpilih maka langkah selanjutnya yaitu klik tombol kompres maka secara otomatis akan muncul kotak pesan yang menampilkan ukuran file sebelum dan sesudah dikompres dan setelah itu file hasil kompresi otomatis akan tersimpan. Adapun prosesnya dapat dilihat pada gambar 4.2 dan 4.3 dibawah ini.
Gambar 4. Proses Kompresi Dengan Algoritma LZ77
Gambar 5. Kotak Pesan Kompresi Algoritma LZ77 Proses Dekompresi Dengan LZ77
Dalam proses dekompresi dengan algoritma LZ77 maka langkah pertama yang harus dilakukan oleh user yaitu dengan memilih pilihan pada radio button pada pilihan LZ77 kemudian klik tombol browse untuk mencari file yang telah kompres sebelumnya, dalam hal ini file yang akan dipilih yaitu file dengan extension *.compress. Setelah file terpilih maka langkah selanjutnya yaitu klik tombol Dekompres maka secara otomatis akan muncul kotak pesan yang menampilkan ukuran file sebelum dan sesudah dekompres dan setelah itu file hasil dekompresi secara otomatis akan tersimpan. Adapun prosesnya dapat dilihat pada gambar 4.4 dan 4.5 dibawah ini.
Gambar 6. Proses Dekompresi Dengan Algoritma LZ77
Gambar 7. Kotak Pesan Dekompresi Algoritma LZ77
V. KESIMPULAN
Kesimpulan dari penelitian ini adalah:
1. Algoritma Kompresi data dapat digunakan untuk mengurangi penggunaan memory yang terlalu besar pada saat menyimpan data, juga untuk mempercepat proses pengiriman data. 2. Untuk Kompresi dalam bentuk Teks,
Algoritma LZ77 dan algoritma LZ78 .mampu memperkecil file aslinya
DAFTAR PUSTAKA
1. Hary Fernando,“Perbandingan dan Pengujian Beberapa Algoritma Pencocokan String,”. MakalahIF3051-2009-006,p.2,2009.
2. Harkenson,Darrel dan Harris,Greg A.2003. Introduction to Information Theory and Data Compression. Cetakan Kedua.New York: CRC Press LL.
3. Munir, Rinaldi.2004.Matematika Diskrit. Bandung: Informatika
4. Purnomo. Herry dan Zachrias,Theo 2005,Pengenalan Informatika Perspektif Teknik dan Lingkungan .Yogyakarta,Andi
5. Pu.Ida M,2006.2004.Fundamental Data Compression.Great Britain.
6. E-bookWinarno, Edy. (2015). VB.NET Untuk Skripsi. Jakarta: PT Elex Media Komputindo.