Anda di halaman 1dari 19

Lempel-Ziv-Welch (LZW) adalah universal kompresi lossless data algoritma yang

dibuat oleh Abraham Lempel , Jacob Ziv , dan Terry Welch . Buku ini diterbitkan oleh
Welch pada 1984 sebagai pelaksanaan penyempurnaan dari LZ78 algoritma Lempel dan
diterbitkan oleh Ziv pada tahun 1978. Algoritma ini dirancang untuk menjadi cepat untuk
mengimplementasikan tetapi biasanya tidak optimal karena hanya melakukan analisis
data yang terbatas.

Ide

Skenario dijelaskan pada tahun 1984 kertas Welch [1] menyandikan urutan dari data 8 bit
sebagai fixed-panjang 12-bit kode. Kode 0-255 mewakili urutan 1-karakter terdiri dari
karakter 8-bit yang sesuai, dan kode 256 melalui 4.095 diciptakan dalam kamus untuk
urutan yang dihadapi dalam data seperti yang dikodekan. Pada setiap tahap dalam
kompresi, byte input dikumpulkan ke urutan sampai karakter berikutnya akan membuat
rangkaian yang ada belum ada kode dalam kamus. Kode untuk urutan (tanpa karakter
yang) dipancarkan, dan kode baru (untuk urutan dengan karakter yang) ditambahkan ke
dalam kamus.

Idenya adalah dengan cepat disesuaikan dengan situasi yang lain. Dalam sebuah gambar
berdasarkan tabel warna, misalnya, alfabet karakter alam adalah himpunan indeks tabel
warna, dan pada 1980-an, banyak gambar yang tabel warna kecil (di urutan 16 warna).
Untuk seperti abjad dikurangi, 12-bit kode yang dihasilkan kompresi miskin kecuali
gambar itu besar, sehingga ide-lebar kode variabel diperkenalkan: kode biasanya mulai
sedikit lebih lebar dari simbol-simbol yang disandikan, dan sebagai kode setiap ukuran
habis digunakan, meningkatkan lebar kode oleh 1 bit, sampai beberapa maksimum yang
ditentukan (biasanya 12 bit).

perbaikan lebih lanjut termasuk memesan kode untuk menandakan bahwa kode tabel
harus bersih (kode "jelas", biasanya nilai pertama segera setelah nilai untuk karakter
alfabet individu), dan kode untuk menunjukkan akhir data (a "berhenti kode ", biasanya
satu lebih besar dari kode yang jelas. Kode jelas memungkinkan meja yang akan
reinitialized setelah mengisi, yang memungkinkan pengkodean beradaptasi dengan
perubahan pola dalam data masukan. Smart encoders dapat memantau efisiensi kompresi
dan menghapus tabel ketika tabel yang ada tidak lagi sesuai masukan sumur.

Karena kode ini ditambahkan dalam cara yang ditentukan oleh data, decoder meniru
bangunan meja karena melihat kode yang dihasilkan. Sangat penting bahwa encoder dan
decoder setuju pada berbagai LZW yang digunakan: ukuran alfabet, lebar maksimum
kode, apakah variabel-lebar encoding yang digunakan, ukuran awal kode, apakah akan
menggunakan yang jelas dan berhenti kode (dan apa nilai-nilai mereka). Kebanyakan
format yang mempekerjakan LZW membangun informasi ini ke dalam format spesifikasi
atau memberikan bidang eksplisit bagi mereka dalam header kompresi untuk data.

[ edit ] Encoding [ sunting ] Encoding


kamus diinisialisasikan untuk mengandung string karakter tunggal yang sesuai dengan
semua karakter masukan mungkin (dan tidak ada yang lain kecuali kode yang jelas dan
berhenti jika mereka sedang digunakan). Algoritma ini bekerja dengan pemindaian
melalui string masukan untuk substring berturut-turut lagi sampai menemukan salah satu
yang tidak ada di kamusKetika seperti sebuah string ditemukan, indeks untuk string
kurang karakter terakhir (yaitu substring terpanjang yang ada di kamus) adalah diambil
dari kamus dan dikirim ke output, dan string baru (termasuk karakter terakhir)
ditambahkan ke dalam kamus dengan kode yang tersedia berikutnyaKarakter masukan
terakhir ini kemudian digunakan sebagai titik awal berikutnya untuk memindai substring.

Dengan cara ini, string berturut-turut lagi terdaftar dalam kamus dan dibuat tersedia
untuk pengkodean berikutnya sebagai nilai output tunggal. Algoritma ini bekerja lebih
baik pada data dengan pola berulang, sehingga bagian awal pesan akan melihat kompresi
sedikit. Sebagai pesan tumbuh, Namun, rasio kompresi cenderung asimtotik untuk
maksimum. [2]

[ edit ] Decoding [ sunting ] Pengkodean

Decoding algoritma ini bekerja dengan membaca nilai dari masukan dikode dan
menghasilkan string yang sesuai dari kamus diinisialisasi. Pada saat yang sama
memperoleh nilai berikutnya dari input, dan menambah kamus Rangkaian tali hanya
output dan karakter pertama dari string yang diperoleh decoding nilai input berikutnya.
decoder kemudian hasil untuk nilai input berikutnya (yang sudah dibaca sebagai nilai
"selanjutnya" pada lulus sebelumnya) dan mengulangi proses sampai tidak ada masukan
lebih, di mana nilai masukan titik akhir decode tanpa tambahan lagi ke dalam kamus.

Dengan cara ini decoder membangun suatu kamus yang identik dengan yang digunakan
oleh encoder, dan menggunakannya untuk membaca sandi nilai-nilai input berikutnya.
Jadi kamus penuh tidak perlu dikirim dengan data terprogram; hanya kamus awal berisi
string karakter tunggal cukup (dan biasanya ditentukan sebelumnya dalam encoder dan
decoder bukannya secara eksplisit dikirim dengan data yang disandikan.)

[ edit ] Variable-width codes [ sunting kode Variabel-lebar]

Jika kode variabel-lebar sedang digunakan, encoder dan decoder harus berhati-hati untuk
mengubah lebar pada titik-titik yang sama pada data disandikan, atau mereka akan setuju
tentang di mana batas-batas antara kode individu jatuh di sungai Dalam versi standar,
encoder akan meningkatkan lebar dari p p + 1 ketika urutan ω + s ditemui yang tidak di
dalam tabel (sehingga kode harus ditambahkan untuk itu) tetapi kode yang tersedia
berikutnya dalam tabel adalah 2 p (kode pertama membutuhkan + p 1 bit). encoder yang
memancarkan kode untuk ω pada p lebar (karena yang tidak memerlukan kode + p 1 bit),
dan kemudian meningkatkan lebar kode sehingga kode selanjutnya akan dipancarkan p +
1 bit lebar.

decoder selalu satu kode di belakang gedung encoder di meja, maka pada saat melihat
kode untuk ω, itu akan menghasilkan sebuah entri untuk kode 2 p - 1. Karena ini adalah
titik di mana encoder akan meningkatkan kode lebar, decoder harus meningkatkan lebar
di sini juga: pada titik di mana ia menghasilkan kode terbesar yang akan cocok bit p.

Sayangnya beberapa implementasi awal dari algoritma encoding meningkatkan lebar


kode dan kemudian memancarkan ω pada lebar baru dan bukan lebar lama, sehingga
untuk decoder sepertinya perubahan lebar satu kode terlalu dini. Hal ini disebut "Awal
Ubah"; itu menimbulkan kebingungan sehingga Adobe sekarang memungkinkan kedua
versi dalam PDF file, tetapi mencakup bendera eksplisit dalam header dari masing-
masing-kompresi LZW sungai untuk mengindikasikan apakah Awal Perubahan sedang
digunakan. Sebagian besar format file grafis tidak menggunakan Dini Ubah.

Ketika meja dibersihkan sebagai respons terhadap kode yang jelas, baik encoder dan
decoder mengubah lebar kode setelah kode yang jelas kembali ke kode awal lebar,
dimulai dengan segera setelah kode kode yang jelas.

Contoh

Contoh berikut menggambarkan algoritma LZW dalam aksi, yang menunjukkan status
output dan kamus pada setiap tahap, baik dalam encoding dan decoding data. Contoh ini
telah dibangun untuk memberikan kompresi yang wajar pada pesan yang sangat singkat.
Dalam data teks yang sebenarnya, pengulangan umumnya kurang menonjol, sehingga
masukan lagi aliran biasanya diperlukan sebelum kompresi membangun efisiensi.

plaintext yang akan dikodekan (dari abjad hanya menggunakan huruf kapital) adalah:

TOBEORNOTTOBEORTOBEORNOT#

The # adalah marker digunakan untuk menunjukkan bahwa akhir pesan tersebut telah
tercapai. Ada demikian 26 simbol dalam abjad plaintext (ibukota 26 huruf A sampai Z),
plus kode berhenti #. Kami sewenang-wenang menetapkan nilai-nilai ini 1 sampai 26,
dan 0. (Rasa Sebagian besar LZW akan menempatkan kode alfabet berhenti setelah data,
tapi tidak ada dalam algoritma dasar yang hanya membutuhkan. The encoder dan decoder
harus setuju apa nilai itu.)

komputer akan membuat ini sebagai string dari bit . kode Lima-bit yang diperlukan untuk
memberikan kombinasi ini cukup untuk mencakup seperangkat nilai-nilai 27. Kamus
diinisialisasi dengan nilai 27. Sebagai kamus tumbuh, kode perlu bertumbuh dalam lebar
untuk menampung entri tambahan. sebuah-bit kode 5 menghasilkan 2 5 = 32
kemungkinan kombinasi bit, sehingga ketika kata kamus 33 dibuat, algoritma harus
beralih pada titik itu dari string 5 bit-bit untuk string 6 (untuk semua nilai aturan,
termasuk orang-orang yang sebelumnya output dengan hanya lima bit). Perhatikan bahwa
sejak nol semua kode 00000 digunakan, dan diberi label "0", catatan kamus 33 akan
diberi label 32. (Sebelumnya output yang dihasilkan tidak terpengaruh oleh perubahan
kode-lebar, tetapi sekali nilai 6-bit yang dihasilkan dalam kamus, itu menurut pikiran
dapat menjadi kode berikutnya dipancarkan, sehingga output yang lebar untuk bergeser
setelah 6 bit untuk mengakomodasi itu. )
Kamus awal, kemudian, akan terdiri dari entri berikut:

# = 00.000 = 0
A = 00001 = 1 A = 00.001 = 1
B = 00010 B = 00.010
C = 00011 C = 00.011
. .
. .
. .
Z = 11010 = 26 Z = 11.010 = 26

Encoding

Buffer input karakter dalam urutan ω sampai ω + karakter berikutnya adalah tidak ada di
kamus. Memancarkan kode untuk ω, dan menambahkan ω + karakter berikutnya ke
dalam kamus. Mulai buffering lagi dengan karakter berikutnya.

Current Next Output Extended


Sequence Char Code Bits Dictionary
------- ---- --- ------ ----------
NULL T
T O 20 = 10100 27: TO <-- 27 = first available code
after 0 through 26
O B 15 = 01111 28: OB
B E 2 = 00010 29: BE
E O 5 = 00101 30: EO
O R 15 = 01111 31: OR
R N 18 = 10010 32: RN <-- 32 requires 6 bits, so for
next output use 6 bits
N O 14 = 001110 33: NO
O T 15 = 001111 34: OT
T T 20 = 010100 35: TT
TO B 27 = 011011 36: TOB
BE O 29 = 011101 37: BEO
OR T 31 = 011111 38: ORT
TOB E 36 = 100100 39: TOBE
EO R 30 = 011110 40: EOR
RN O 32 = 100000 41: RNO
OT # 34 = 100010 <--- # stops the algorithm;
send the cur seq
0 = 000000 and the stop code

Unencoded length = 25 symbols * 5 bits/symbol = 125 bits


Encoded length = (6 codes * 5 bits/code) + (11 codes * 6 bits/code) =
96 bits.
Menggunakan LZW telah disimpan 29 bit dari 125, mengurangi pesan dengan hampir
22%. Jika pesan itu lagi, maka kata-kata kamus akan mulai untuk mewakili lagi dan lagi
bagian teks, sehingga kata-kata ulang yang akan dikirim sangat kompak.

[ edit ] Decoding [ sunting ] Pengkodean

Untuk decode an-dikompresi arsip LZW, kita perlu tahu sebelumnya yang digunakan
awal kamus, tetapi entri tambahan dapat direkonstruksi karena mereka selalu hanya
concatenations entri sebelumnya.

Input Output New Dictionary Entry


Bits Code Sequence Full Conjecture
------ ---- -------- -------- ----------
10100 = 20 T 27: T?
01111 = 15 O 27: TO 28: O?
00010 = 2 B 28: OB 29: B?
00101 = 5 E 29: BE 30: E?
01111 = 15 O 30: EO 31: O?
10010 = 18 R 31: OR <--- 32: R? ----- created code 31 (last
to fit in 5 bits);
001110 = 14 N 32: RN 33: N? so start using 6 bits
001111 = 15 O 33: NO 34: O?
010100 = 20 T 34: OT 35: T?
011011 = 27 TO 35: TT 36: TO?
011101 = 29 BE 36: TOB <--- 37: BE? ---- 36 = TO + 1st symbol
(B) of
011111 = 31 OR 37: BEO 38: OR? next coded sequence
received (BE)
100100 = 36 TOB 38: ORT 39: TOB?
011110 = 30 EO 39: TOBE 40: EO?
100000 = 32 RN 40: EOR 41: RN?
100010 = 34 OT 41: RNO 42: OT?
000000 = 0 #

Pada setiap tahap, decoder menerima kode X; itu terlihat X di meja dan output urutan χ
itu kode, dan dugaan χ +? as the entry the encoder just added — because the encoder
emitted X for χ precisely because χ + ? sebagai entri encoder hanya menambahkan -
karena encoder yang dipancarkan X untuk χ justru karena χ +? was not in the table, and
the encoder goes ahead and adds it. tidak ada di meja, dan encoder berjalan ke depan dan
tambahnya. But what is the missing letter? Tapi apa surat hilang? It is the first letter in
the sequence coded by the next code Z that the decoder receives. Ini adalah huruf pertama
dalam urutan kode dengan kode berikutnya Z bahwa decoder menerima. So the decoder
looks up Z, decodes it into the sequence ω and takes the first letter z and tacks it onto the
end of χ as the next dictionary entry. Jadi decoder menengadah Z, menerjemahkan ke
dalam urutan ω dan mengambil huruf pertama z dan paku payung itu ke akhir χ sebagai
entri kamus berikutnya.

This works as long as the codes received are in the decoder's dictionary, so that they can
be decoded into sequences. Ini bekerja selama kode diterima di decoder kamus, sehingga
mereka dapat diterjemahkan ke dalam urutan. What happens if the decoder receives a
code Z that is not yet in its dictionary? Apa yang terjadi jika decoder menerima kode Z
yang belum di kamus? Since the decoder is always just one code behind the encoder, Z
can be in the encoder's dictionary only if the encoder just generated it, when emitting the
previous code X for χ. Sejak decoder selalu hanya satu kode di belakang encoder, Z bisa
dalam kamus encoder encoder hanya jika hanya dihasilkan itu, ketika memancarkan kode
sebelumnya X untuk χ. Thus Z codes some ω that is χ + ?, and the decoder can determine
the unknown character as follows: Jadi kode Z beberapa ω yang χ +, dan? Decoder dapat
menentukan karakter yang tidak diketahui sebagai berikut:

1. The decoder sees X and then Z. decoder itu melihat X dan kemudian Z.
2. It knows X codes the sequence χ and Z codes some unknown sequence ω. Ia tahu
kode X tersebut χ urutan dan kode Z beberapa ω urutan diketahui.
3. It knows the encoder just added Z to code χ + some unknown character, Ia tahu
encoder hanya ditambahkan ke kode χ Z + beberapa karakter yang tidak
diketahui,
4. and it knows that the unknown character is the first letter z of ω. dan ia tahu
bahwa karakter yang tidak diketahui adalah huruf pertama dari ω z.
5. But the first letter of ω (= χ + ?) must then also be the first letter of χ. Tapi huruf
pertama dari ω (= χ +) kemudian harus juga menjadi huruf pertama dari χ?.
6. So ω must be χ + x, where x is the first letter of χ . Jadi harus ω χ + x, di mana x
adalah huruf pertama dari χ.
7. So the decoder figures out what Z codes even though it's not in the table, Jadi
decoder angka kode Z apa walaupun tidak di meja,
8. and upon receiving Z, the decoder decodes it as χ + x, and adds χ + x to the table
as the value of Z. dan setelah menerima Z, decoder menerjemahkan sebagai χ + x,
dan menambahkan χ + x ke meja sebagai nilai Z.

This situation occurs whenever the encoder encounters input of the form cScSc , where c
is a single character, S is a string and cS is already in the dictionary, but cSc is not. Situasi
ini terjadi ketika encoder pertemuan-pertemuan masukan dari cScSc bentuk, di mana c
adalah karakter tunggal, S adalah string dan CS sudah dalam kamus, tetapi CSC tidak.
The encoder emits the code for cS , putting a new code for cSc into the dictionary.
encoder yang memancarkan kode untuk CS, menempatkan kode baru untuk CSC ke
dalam kamus. Next it sees cSc in the input (starting at the second c of cScSc ) and emits
the new code it just inserted. Berikutnya melihat CSC pada input (dimulai dari c kedua
cScSc) dan memancarkan kode baru itu hanya disisipkan. The argument above shows that
whenever the decoder receives a code not in its dictionary, the situation must look like
this. Argumen di atas menunjukkan bahwa setiap kali menerima kode decoder tidak
dalam kamus, situasi harus terlihat seperti ini.

Although input of form cScSc might seem unlikely, this pattern is fairly common when
the input stream is characterized by significant repetition. Meskipun bentuk input cScSc
mungkin tampak tidak mungkin, pola ini cukup umum bila input stream dicirikan oleh
pengulangan signifikan. In particular, long strings of a single character (which are
common in the kinds of images LZW is often used to encode) repeatedly generate
patterns of this sort. Secara khusus, string panjang karakter tunggal (yang umum dalam
jenis-jenis gambar LZW sering digunakan untuk menyandikan) berulang kali
menghasilkan pola-pola semacam in

coding lebih lanjut

The simple scheme described above focuses on the LZW algorithm itself. Skema
sederhana yang dijelaskan di atas berfokus pada algoritma LZW sendiri. Many
applications apply further encoding to the sequence of output symbols. Banyak aplikasi
yang diterapkan lebih lanjut pengkodean dengan urutan simbol output. Some package the
coded stream as printable characters using some form of Binary-to-text encoding ; this
will increase the encoded length and decrease the compression frequency. Beberapa paket
aliran dikodekan sebagai karakter yang dapat dicetak menggunakan beberapa bentuk -ke-
teks pengkodean biner ; ini akan meningkatkan panjang disandi dan menurunkan
frekuensi kompresi. Conversely, increased compression can often be achieved with an
adaptive entropy encoder . Sebaliknya, peningkatan kompresi sering dapat dicapai
dengan encoder entropi adaptif. Such a coder estimates the probability distribution for
the value of the next symbol, based on the observed frequencies of values so far.
Programmer seperti perkiraan distribusi probabilitas untuk nilai simbol berikutnya,
berdasarkan nilai-nilai frekuensi yang diamati selama ini. A standard entropy encoding
such as Huffman coding or arithmetic coding then uses shorter codes for values with
higher probabilities. Sebuah entropi standar pengkodean seperti Huffman coding atau
pengkodean aritmatika kemudian menggunakan kode yang lebih pendek untuk nilai-nilai
dengan probabilitas yang lebih tinggi.

[ edit ] Uses [ sunting ] Penggunaan

When it was introduced, LZW compression provided the best compression ratio among
all well-known methods available at that time. Ketika diperkenalkan, kompresi LZW
memberikan rasio kompresi yang terbaik di antara semua metode yang terkenal tersedia
pada waktu itu. It became the first widely used universal data compression method on
computers. Ini menjadi yang pertama banyak digunakan metode universal Kompresi data
pada komputer. A large English text file can typically be compressed via LZW to about
half its original size. Sebuah besar Inggris file teks biasanya dapat dikompresi melalui
LZW sekitar setengah ukuran aslinya.

LZW was used in the program compress , which became a more or less standard utility in
Unix systems circa 1986. LZW yang digunakan dalam program compress , yang menjadi
standar utilitas atau kurang lebih di Unix sistem sekitar tahun 1986. It has since
disappeared from many distributions, for both legal and technical reasons, but as of 2008
at least FreeBSD includes both compress and uncompress as a part of the distribution. Ia
telah menghilang dari banyak distribusi, dan teknis baik untuk alasan hukum, tetapi
sebagai tahun 2008 setidaknya FreeBSD meliputi baik kompres dan uncompress sebagai
bagian dari distribusi tersebut. Several other popular compression utilities also used
LZW, or closely related methods. Beberapa lainnya utilitas kompresi LZW populer juga
digunakan, atau metode erat kaitannya.
LZW became very widely used when it became part of the GIF image format in 1987.
LZW menjadi sangat banyak digunakan ketika menjadi bagian dari GIF format gambar
pada tahun 1987. It may also (optionally) be used in TIFF and PDF files. Ini juga
mungkin (opsional) digunakan dalam TIFF dan PDF file. (Although LZW is available in
Adobe Acrobat software, Acrobat by default uses the DEFLATE algorithm for most text
and color-table-based image data in PDF files.) (Meskipun LZW tersedia dalam Adobe
Acrobat perangkat lunak, Acrobat secara default menggunakan Deflate algoritma untuk
sebagian besar teks dan tabel berbasis data citra-warna dalam file PDF.)

[ edit ] Patents [ sunting ] Paten

Various patents have been issued in the United States and other countries for LZW and
similar algorithms. Berbagai paten telah diterbitkan di Amerika Serikat dan negara-
negara lain untuk LZW dan algoritma yang sama. LZ78 was covered by US Patent
4,464,650 by Lempel, Ziv, Cohn, and Eastman, assigned to Sperry Corporation , later
Unisys Corporation, filed on August 10, 1981. LZ78 ditutupi oleh Paten AS 4.464.650
oleh Lempel, Ziv, Cohn, dan Eastman, ditugaskan untuk Sperry Corporation , kemudian
Unisys Corporation, diajukan pada tanggal 10 Agustus 1981. Two US patents were
issued for the LZW algorithm: US Patent 4,814,746 by Victor S. Miller and Mark N.
Wegman and assigned to IBM , originally filed on June 1, 1983, and US Patent 4,558,302
by Welch, assigned to Sperry Corporation, later Unisys Corporation, filed on June 20,
1983. Dua paten AS diterbitkan untuk algoritma LZW: Paten AS 4.814.746 oleh Victor
S. Miller dan Mark N. Wegman dan ditugaskan untuk IBM , awalnya diajukan pada
tanggal 1 Juni 1983, dan Hak Paten AS 4.558.302 oleh Welch, ditugaskan untuk Sperry
Corporation, kemudian Unisys Corporation, diajukan pada tanggal 20 Juni 1983. On June
20, 2003, this patent on the LZW algorithm expired [1] . Pada tanggal 20 Juni 2003,, ini
paten pada algoritma LZW berakhir [1] .

US Patent 4,558,302 received a lot of negative press after LZW compression was used in
the GIF image format (see Graphics Interchange Format#Unisys and LZW patent
enforcement ). Paten AS 4.558.302 menerima banyak pers negatif setelah kompresi LZW
yang digunakan dalam format gambar GIF (lihat Graphics Interchange Format # Unisys
dan penegakan paten LZW ).
Algoritma LZW merupakan algoritma kompresi yang bersifat lossless dan menggunakan
metode dictionary. Algoritma ini ditemukan oleh Lemple, Ziv, dan Welch pada tahun
1984.Secara umum algoritma kompresi LZW akan membentuk dictionary selama proses
kompresinya belangsung kemudian setelah selesai maka dictionary tersebut tidak ikut
disimpan dalam file yang telah terkompresi. Prisinp kompresi akan terjadi ketika besar bit
untuk dictionary yang telah ditentukan menggantikan deretan karakter atau string yang
terbentuk sedangkan dalam proses dekompresinya untuk memperoleh hasil yang sama
dengan file sebelum dikompresi LZW akan membuat kembali dictionary selama proses
dekompresinya berlangsung.

LZW Kompresi

Prinsip umum kerja algoritma LZW adalah mengecek setiap karakter yang muncul
kemudian menggabungkan dengan karakter selanjutnya menjadi sebuah string jika string
baru tersebut tidak berada dalam dictionary atau belum diindekkan maka string baru
tersebut akan diindekkan ke dalam dictionary. Dibawah merupakan pseudocode kompresi
algoritma LZW.

Langkat pengkompresian LZW

1. Inisialisasi input stream yang mengandung karakter-karekter dasar.

2. Membaca karakter dari input stream jika EOF maka menuju langkah 5.

3. Gabungkan karater awal dengan karakter yang dibaca selanjutnya menjadi sebuah
string.

4. jika string baru ini tidak ada dalam dictionary maka

• Buat indek baru untuk string baru tersebut.

• Menuju Langkah 2.

5. Jika string yang terbentuk telah mempunyai indek di dalam dictionary maka

• Gabungkan karakter sebelumnya dengan karakter yang dibaca atau string yang telah
terbentuk menjadi sebuah string baru.
• Menuju langkah 2.

6. Tulis output kode.

Dictionary

Dictionary melakukan inisialisasi untuk pertama kalinya terhadap karakterkarakter dasar


huruf alphabet. Pembacaan input stream dilakukan per-byte karena setiap byte memiliki
alamat yang unik dalam memory, secara default dictionary menyediakan 256 pointer awal
yang dimulai dari 0-255 untuk pengkodean ASCII sedangkan jumlah pointer untuk string
yang terbentuk setelah membaca input stream dapat ditentukan dari besarnya bit yang
dipakai yang dapat dirumuskan dengan rumus 2^n - 256 dimana n menyatakan jumlah bit
yang dipakai dan 256 menyatakan karakter-karakter ASCII yang telah diinisialisasi.
Indek untuk string baru yang terbentuk diperoleh dari nilai selanjutnya yang tersedia
didalam memory.

Code Words

Code word merupakan kode yang bersifat unik yang mewakili karakter atau string baru
yang terbentuk setiap kali algoritma LZW memproses inputan, seperti yang telah
disebutkan sebelumnya jumlah dari string-string yang terdapat dalam dictionary
ditentukan dari besarnya bit dictionary yang dipakai dimana code word mewakili setiap
string-string tersebut, semakin banyak string yang dihasilkan maka semakin besar pula
bit dictionary yang dibutuhkan untuk memberikan indek bagi setiap string yang
dihasilkan. Sebagai contoh representasi code word dalam dictionary dengan besar 9 bit
untuk karakter “A” yang mempunyai nilai 63 adalah 001000001, selain itu jika code
word mempunyai nilai 245 dalam dictionary-nya maka kode binernya adalah 011110101,
dengan menggunakan 9 bit untuk ukuran dictionary maka dimungkinkan terdapat 512 –
256 = 256 code word untuk masing-masing string hasil dari kombinasi karakter yang
dihasilkan dictionary LZW selain 256 karakter ASCII. Ketika sebuah nilai n bit telah
ditentukan sebagai dictionary maka selama indek masih tersedia untuk string baru yang
terbentuk maka selama itu pula indek tetap menggunakan format dengan besar n bit akan
tetapi jika jumlah dari string baru yang terbentuk melebihi jumlah indek dalam
dictionary maka akan terjadi transisi besar bit yang dipakai untuk merepresentasikan
indek baru yang dari semula menggunakan n bit menjadi n + 1 bit atau inisialisai dengan
bit lain agar kmampu menampung string baru.

Pencarian dan Penginputan String

Proses penambahan indek dari string baru yang terbentuk akan dilakukan jika dictionary
tidak penuh dan string tersebut belum ada di dictionary. Pencarian tempat bagi indek
pada indek-indek array yang masih kosong diperlukan untuk menentukan tempat yang
sesuai bagi indek untuk string baru yang terbentuk. Cara pencarian array based dictionary
sesuai dengan pendekatan brute force dimulai dari indek pertama hingga indek terakhir
dari string yang telah ada di dictionary.

LZW Dekompresi

Dalam Proses Dekompresi, algoritma LZW tidak menyimpan string table yang berisi
indek-indek dari setiap code word yang dihasilkan dalam proses kompresi ke momory
akan tetapi menggunakan beberapa informasi yang telah disimpan sebelumnya antara lain
256 karakter ASCII, karakter pertama dari inputan dan code word terakhir. Dibawah
merupakan pseudocode dekompresi algoritma LZW.

Langkah Dekompresi LZW

1. Menginisialisai seluruh dictionary yang mengandung karakter-karekter ASCII.

2. Baca kode (huruf atau code word) pertama dari hasil kompresi LZW kemudian
outputkan karakter yang dibaca kemudian simpan kode ke variable w

3. Baca kode selanjutnya

4. Copy kode yang dibaca ke varible entry


5. Outputkan kode (karakter)

6. Gabungkan value dari variable w dengan karakter pertama dari entry kemudian simpan
sebagai dictionary

7. Isi variable w dengan value dari variable entry.

8. Kembali ke langkah 3

Contoh Kasus

Input string : TES_TEA_EAT_MEET_SLEEP

bit dictionary : 9 bit

Total awal bit disimpan tanpa kompresi = Total input * bit dictionary

= 22 * 9

= 198 bit

Besar file setelah dikompresi = Total output * bit dictionary

= 19 * 9
= 171 bit

Input stream: TES_<256>A_EAT_MEE<265>SL<268>P

Algoritma LZW dikembangkan oleh Terry A.Welch dari metode kompresi sebelumnya
yang ditemukan oleh Abraham Lempel dan Jacob Ziv pada tahun 1977. Algortima ini
menggunakan teknik dictionary dalam kompresinya. Dimana string karakter digantikan
oleh kode table yang dibuat setiap ada string yang masuk. Tabel dibuat untuk referensi
masukan string selanjutnya. Ukuran tabel dictionary pada algoritma LZW asli adalah
4096 sampel atau 12 bit, dimana 256 sampel pertama digunakan untuk table karakter
single (Extended ASCII), dan sisanya digunakan untuk pasangan karakter atau string
dalam data input.

Algoritma LZW melakukan kompresi dengan mengunakan kode table 256 hingga 4095
untuk mengkodekan pasangan byte atau string. Dengan metode ini banyak string yang
dapat dikodekan dengan mengacu pada string yang telah muncul sebelumnya dalam teks.
Berikut adalah algoritma kompresi LZW secara singkat:

w = NIL
while (baca karakter k)
{
If wk ada di tabel dictionary then
w=wk
else
add wk ke dictionary;
output kode =w;
w=k;
}

Algoritma LZW melakukan pembacaan satu karakter k pada satu waktu. Karakter k
dipasangkan dengan karakter sebelumnya yaitu w, setiap pasangan

karakter ini dimasukkan ke dalam tabel. Lalu dibaca lagi karakter k, jika pasangan w dan
k ada di dalam tabel maka w diisi oleh wk dan output kode adalah w, demikian
seterusnya hingga aliran data habis.

Gambar 2.4 Flowchart Algoritma LZW


Proses Kompresi

Sebagai contoh dari penerapan Algoritma LZW, berikut diberikan sebuah kata
“Rain/in/Spain”. Isi dictionary pada awal proses diisi dengan data kosong, karakter R
disimpan pada variable k. Kemudian data berikut yaitu “a” disimpan pada k. Lalu w + k
dibandingkan pada tabel, jika tidak ada maka diberikan output
yang disimpan oleh w yaitu “R”, selanjutnya w + k ditambahkan ke dalam tabel sehingga
table berisi “Ra” dan diberi kode. Ulangi hingga karaketer terakhir.

Sehingga didapat output text yang berbentuk “Rain/258/Sp257n”.


Dari perbandingan input dan output dapat diketahui bahwa terjadi pemampatan yaitu dari
text “Rain/in/Spain” adalah 13 x 8 bit=104 bit; “Rain/258/Sp257n” adalah (9x 8bit) +
(2x9bit)=100 bit. Ini adalah contoh sederhana, apabila data berukuran lebih besar dan
mempunyai redundansi yang besar juga maka hasil pemampatan juga jauh lebih kecil dan
rasio kompresi bertambah besar.

Proses Dekompresi
Proses dekompresi data pada algoritma LZW tidak jauh berbeda dengan proses
kompresinya. Pada dekompresi LZW, juga dibuat tabel dictionary dari data input
kompresi, sehingga tidak diperlukan penyertaan tabel dictionary ke dalam data kompresi.
Berikut algoritma dekompresi LZW:

baca karakter k;
output k;
w = k;
while (baca karakter k)
{
entry= dictionary entry untuk k
ouput entry
add w+entry[0] ke dictionary;
w=entry;
}

Untuk melakukan dekompresi, tidak diperlukan tabel terdahulu pada proses kompresi
data, dan tabel tidak perlu diikutkan dalam data kompresi, dekompresi membuat sendiri
tabelnya. Jika ada masukan data karakter k,maka output kode adalah k, selanjutnya nilai
w diisi dengan karakter k. Ada satu variable tambahan yaitu entry yang digunakan untuk
mengambil satu karakter dari k untuk dijadikan dictionary. Jika entry berisi 2 byte maka
diambil byte pertama saja untuk kemudian ditambahkan dengan w kemudian dimasukkan
dalam dictionary. Sebagai contoh digunakan data hasil kompresi pada contoh sebelumnya
yaitu:
Rain/258/Sp257n, maka jika diilustrasikan dalam tabel :

Dari tabel diatas dapat dilihat bahwa simbol dictionary yang dihasilkan oleh algoritma
dekompresi sama dengan dictionary yang dihasilkan oleh kompresi, dan output
dekompresi adalah data seperti input sebelum data dikompresi yaitu:Rain/in/Spain

AHMAD FITRIANSAH_111010095
ANALISIS PERBANDINGAN KINERJA ALGORITMA KOMPRESI LZW,
HUFFMAN DAN DEFLATE PADA BERBAGAI JENIS FILE
IT TELKOM
Kompresi Data Dengan Algoritma LZW
June 16th, 2010 • Related • Filed Under

LZW Data Compression

Untuk algoritma kompresi data dengan metode LZW dapat dijelaskan bahwa, Algoritma
LZW merupakan algoritma kompresi yang bersifat lossless dan menggunakan metode
dictionary. Algoritma ini ditemukan oleh Lemple, Ziv, dan Welch pada tahun
1984.Secara umum algoritma kompresi LZW akan membentuk dictionary selama proses
kompresinya belangsung kemudian setelah selesai maka dictionary tersebut tidak ikut
disimpan dalam file yang telah terkompresi. Prisinp kompresi akan terjadi ketika besar bit
untuk dictionary yang telah ditentukan menggantikan deretan karakter atau string yang
terbentuk sedangkan dalam proses dekompresinya untuk memperoleh hasil yang sama
dengan file sebelum dikompresi LZW akan membuat kembali dictionary selama proses
dekompresinya berlangsung.

Sehingga dapat dijelaskan bahwa Prinsip umum kerja algoritma LZW adalah mengecek
setiap karakter yang muncul kemudian menggabungkan dengan karakter selanjutnya
menjadi sebuah string jika string baru tersebut tidak berada dalam dictionary atau belum
diindekkan maka string baru tersebut akan diindekkan ke dalam dictionary. Dibawah
merupakan pseudocode kompresi algoritma LZW.

a= NIL

while (ada inputan kemudian baca sebuah karakter x)

if (ax ada dalam kamus)

then a = ax

else

add ax to the dictionary

output indek untuk a

a=x

Dari algoritma LZW dapat dijelaskan bahwa :

1. Inisialisasi input stream yang mengandung karakter-karekter dasar.


2. Membaca karakter dari input stream jika EOF maka menuju langkah 5.
3. Gabungkan karater awal dengan karakter yang dibaca selanjutnya menjadi sebuah
string.
4. jika string baru ini tidak ada dalam dictionary maka
o Buat indek baru untuk string baru tersebut.
o Menuju Langkah 2.
5. Jika string yang terbentuk telah mempunyai indek di dalam dictionary maka
o Gabungkan karakter sebelumnya dengan karakter yang dibaca atau string
yang telah terbentuk menjadi sebuah string baru.
o Menuju langkah 2.
6. Tulis output kode.

Untuk contoh dari algoritma diatas dapat dibuat implementasi pada contoh dibawah ini :

Input string : TES_TEA_EAT_MEET_SLEEP

bit dictionary : 9 bit

Total awal bit disimpan tanpa kompresi = Total input * bit dictionary = 22 * 9 = 198 bit

Besar file setelah dikompresi = Total output * bit dictionary = 19 * 9 = 171 bit

Input stream: TES_<256>A_EAT_MEE<265>SL<268>P.


Jadi dapat ditarik sebuah kesimpulan mengenai algoritma kompresi data menggunakan
LZW ialah :

“Kecepatan kompresi algoritma LZW secara signifikan berkurang pada file UNIX, file
executable, file gambar, file multimedia, dan file hasil kompresi tetapi dibandingkan
beberapa algoritma yang ada, data kompresi dengan algoritma LZW memiliki waktu
yang tersingkat.

Dapat disimpulkan lagi dari penjelasan algoritma diatas, Proses penambahan indek dari
string baru yang terbentuk akan dilakukan jika dictionary tidak penuh dan string tersebut
belum ada di dictionary. Pencarian tempat bagi indek pada indek-indek array yang masih
kosong diperlukan untuk menentukan tempat yang sesuai bagi indek untuk string baru
yang terbentuk. Cara pencarian array based dictionary sesuai dengan pendekatan brute
force dimulai dari indek pertama hingga indek terakhir dari string yang telah ada di
dictionary.

Anda mungkin juga menyukai