Algoritma
Lempel-Ziv merupakan suatu variable-to-fixed length code. Secara mendasar, ada
dua versi dari algoritma ini yang biasanya terdapat dalam literatur: versi
teoritis dan versi praktek. Secara teoritikal, kedua versi tersebut menunjukkan
cara kerja yang sama. Bagaimanapun juga, bukti dari optimalitas asymptotic dari
versi teoritikal lebih mudah. Dalam prakteknya, versi praktek lebih mudah
diimplementasi dan sedikit lebih efisien. Berikut ini merupakan algoritma versi
praktek yang dijelaskan dalam buku oleh Gersho dan Gray dan dalam paper oleh
Ide
dasar adalah menguraikan input sequence menjadi blok yang tidak saling menimpa
dari panjang yang berbeda sementara membentuk suatu “kamus” dari blok tersebut.
- Inisialisasi “kamus” yang terdiri dari semua blok dengan panjang satu karakter (D = {a, b})
- Lakukan pencarian untuk blok yang paling panjang W yang mana muncul pada kamus
- Encode W dengan indeksnya dalam kamus
- Tambahkan W diikuti dengan simbol pertama dari blok berikutnya dari kamus tersebut
- Lakukan
lagi langkah ke-2
Contoh berikut mengilustrasikan bagaimana cara kerja dari encoding Lempel-Ziv.
- Secara teoritikal, ukuran dari kamus dapat berkembang secara besar menuju tak berhingga
- Dalam prakteknya, ukuran kamus terbatas. Sekali limit tersebut dicapai, tidak ada lagi entri yang ditambahkan. Welch merekomendasikan sebuah kamus dengan ukuran 4096. Ini berkorespondensi dengan 12 bit per indeks.
- Panjang dari indeks boleh beragam. Sebagai contoh, dalam blok ke-n, ukuran kamusnya adalah n + 1 (asumsi bahwa limit tidak pernah dicapai). Oleh karena itu, dapat dilakukan encoding pada blok indeks n menggunakan [log2(n +1)] bit (dibulatkan hingga integer terdekat). Sebagai contoh, indeks pertama dapat direpresentasikan dengan 1 bit, kedua dan ketiga oleh tiap 2 bit, keempat, kelima, keenam, dan ketujuh tiap 3 bit, dan seterusnya. Ini merupakan versi variable-variable length dari algoritma Lempel-Ziv
- Untuk ukuran kamus yang maksimum yaitu 2m, variable-length encoding dari indeks menghemat dengan tepat hingga 2m−1 bit dibandingkan dengan fixed-length encoding.
- Contoh di atas, seperti kebanyakan contoh ilustrasi pada literatur, tidak menghasilkan kompresi yang sebenarnya. Sebenarnya, lebih bit yang dipakai untuk merepresentasi indeks daripada data asli. Ini disebabkan oleh panjang dari input data dalam contoh yang terlalu pendek.
- Dalam prakteknya, algoritma Lempel-Ziv bekerja dengan baik (sesuai dengan kompresi aktual) hanya ketika input data cukup besar dan ada cukup redundansi dalam data.
- Proses dekompresi bekerja dengan urutan yang terbalik. Decode mengetahui simbol terakhir yang paling baru di entri kamus adalah simbol pertama dari penguraian blok berikutnya. Pengetahuan ini dipakai untuk memecahkan kembali konflik yang mungkin ada pada decoder.
- Banyak program populer (seperti Unix Compress dan Uncompress, Gzip, dan GunZip, dan Windows Winzip) berdasarkan pada algoritma Lempel-Ziv.
- Nama “Ziv-Lempel” lebih tepat daripada “Lempel-Ziv”
- Tabel berikut ini membandingkan versi Adaptif dari Huffman Code (diimplementasikan pada program Unix “compact”) dan Algoritma Lempel-Ziv (pada program Unix “compress”).
Tabel Perbandingan Algoritma Huffman vs Lempel-Ziv |
Teks file yang memiliki ukuran besar dalam
distribusi statistikal teks Inggris (terdiri atas tujuh buku klasik dengan dua
puluh tujuh alphabet Inggris) mempunyai rasio kompresi 36,3% (ukuran data asli
5.086.936 byte, ukuran setelah dikompresi 1.846.919 byte, menggunakan program
“Gzip” Linux). Korespondensi dengan hasil tersebut adalah laju kompresi 2,9
bits/character − dibandingkan dengan entropy rate 2,3 bits/character yang
diprediksi oleh Shannon. Kehilangan optimalitas ini dikarenakan oleh ukuran
dari kamus.
No comments:
Post a Comment