Studi Perbandingan Algoritma Huffman Dan LZW (Lempel Ziv Welch) Pada Pemampatan File Teks

(1)

STUDI PERBANDINGAN ALGORITMA HUFFMAN DAN LZW (LEMPEL ZIV WELCH) PADA PEMAMPATAN FILE TEKS

SKRIPSI

Diajukan untuk melengkapi tugas akhir dan memenuhi syarat mencapai gelar Sarjana Komputer

CANGGIH PRAMILO 041401010

PROGRAM STUDI S1 ILMU KOMPUTER DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA

MEDAN 2008


(2)

Medan, 24 November 2008

LEMBAR PENGESAHAN

STUDI PERBANDINGAN ALGORITMA HUFFMAN DAN LZW ( LEMPEL ZIV WELCH ) PADA PEMAMPATAN FILE TEKS

Oleh

Canggih Pramilo NIM. 041401010

Telah diperiksa dan disetujui untuk diseminarkan oleh :

Dosen Pembimbing I Dosen Pembimbing II

Syahriol Sitorus, S.Si, MIT Drs. Agus Salim Harahap, M.Si NIP. 132 174 687 NIP. 130 936 279


(3)

PERSETUJUAN

Judul : STUDI PERBANDINGAN ALGORITMA

HUFFMAN DAN LZW PADA PEMAMPATAN FILE TEKS

Kategori : SKRIPSI

Nama : CANGGIH PRAMILO

Nomor Induk Mahasiswa : 041401010

Program Studi : SARJANA (S1) ILMU KOMPUTER

Departemen : ILMU KOMPUTER

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN

ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Diluluskan di

Medan, Desember 2008 Komisi Pembimbing :

Pembimbing 2 Pembimbing 1

Drs. Agus Salim Harahap, M.Si Syahriol Sitorus, S.Si, MIT

NIP. 130 936 279 NIP. 132 174 687

Diketahui/Disetujui oleh Prog. Studi Ilmu Komputer S-1 Ketua,

Prof. Dr. Muhammad Zarlis NIP. 131 570 434


(4)

PENGHARGAAN

Syukur alhamdulillah penulis nyatakan kehadirat ALLAH SWT Yang Maha Pengasih dan Maha Penyayang, dengan limpahan rahmat dan karunia-Nya skripsi ini berhasil diselesaikan dalam waktu yang telah ditetapkan.

Ucapan terima kasih saya sampaikan kepada Bapak Syahriol Sitorus, S.Si, M.IT. dan Bapak Drs.Agus Salim Harahap, M.Si., selaku pembimbing pada penyelesaian skripsi ini yang telah memberikan panduan dan penuh kepercayaan kepada saya untuk menyempurnakan skripsi ini. Panduan ringkas, padat dan profesional yang telah diberikan kepada saya agar penulis dapatmenyelesaikan tugas ini. Ucapan terima kasih juga ditujukan kepada Ketua dan Sekretaris Departemen Prof.Dr.Muhammad Zarlis dan Bapak Syahriol Sitorus, S.Si, M.IT., Dekan dan Pembantu Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Sumatera Utara, semua dosen pada Departemen Ilmu Komputer FMIPA USU, pegawai di Ilmu Komputer USU, dan rekan-rekan kuliah. Akhirnya, tidak terlupakan kepada bapak, ibu dan semua ahli keluarga yang selama ini memberikan bantuan dan dorongan yang diperlukan. Semoga Tuhan Yang Maha Esa membalasnya.


(5)

PERNYATAAN

STUDI PERBANDINGAN ALGORITMA HUFFMAN DAN LZW (LEMPEL ZIV WELCH) PADA PEMAMPATAN FILE TEKS

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil kerja saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya

Medan, Desember 2008

CANGGIH PRAMILO 041401010


(6)

STUDY OF COMPARISON OF HUFFMAN AND LZW ALGORITHM IN COMPRESSION OF TEXT FILE

ABSTRACT

The aim of data compression is to reduce the file size before storing or transferring it in media storage. Huffman an LZW are two algorithm used to data compression process in this paper. These algorithms are implemented by using Visual C++ to compare the compression algorithms. The comparison is used in the case of ratio of compression and compression speed the text file of result of compression. The text file is tested upon 16 type of text file by various sizes. It can be concluded that in the Huffman algorithm yield the best file ratio compression than LZW algorithm. However, Huffman algorithm requires the brief compression time than LZW algorithm. There are several text files that are not suitable to be compressed by LZW algorithm, because the compressed file becomes same or bigger in size.


(7)

ABSTRAK

Pemampatan data bertujuan untuk mengurangi ukuran file sebelum menyimpan atau memindahkan data ke dalam media penyimpanan. Huffman dan LZW adalah dua algoritma yang digunakan untuk proses pemampatan pada tugas akhir ini. Pada tugas akhir ini dibuat perangkat lunak yang menggunakan bahasa pemrograman Visual C++ untuk membandingkan ke dua algoritma pemampatan tersebut. Perbandingan dilakukan dalam hal rasio pemampatan dan kecepatan proses file teks hasil pemampatan. File teks yang diuji adalah 16 tipe file teks dengan berbagai ukuran. Disimpulkan bahwa, secara rata-rata algoritma Huffman menghasilkan rasio file hasil pemampatan yang terbaik daripada algoritma LZW. Dan juga, secara rata-rata algoritma Huffman membutuhkan waktu pemampatan yang tersingkat daripada algoritma LZW. Terdapat beberapa file teks yang tidak tepat untuk dimampatkan dengan algoritma LZW karena dapat menghasilkan file hasil pemampatan yang berukuran sama atau lebih besar dari ukuran file sumber.


(8)

DAFTAR ISI

Halaman

Persetujuan ii

Pernyataan iii

Penghargaan iv

Abstrak v

Abstract vi

Daftar Isi vii

Daftar Tabel ix

Daftar Gambar x

Bab 1 Pendahuluan 1

1.1Latar Belakang 1

1.2Perumusan Masalah 2

1.3Batasan Masalah 2

1.4Tujuan Penelitian 3

1.5Manfaat Penelitian 3

1.6Metodologi Penelitian 3

1.7Sistematika Penulisan 4

Bab 2 Landasan Teori 6

2.1 Pengertian File Teks 6

2.1.1 Tipe Teks 7

2.1.2 Format Teks 7

2.2 Pohon (Tree) 8

2.3 Pohon Biner (Binary Tree) 9

2.4 Pengertian Pemampatan Data 10

2.5 Metode Pemampatan 11

2.6 Algoritma Huffman 12

2.6.1 Kode Prefix (Prefix Code) 13

2.6.2 Kode Huffman 14

2.7 Algoritma LZW 20

2.7.1 Kode LZW ( Lempel-Ziv-Welch ) 20

Bab 3 Analisis dan Perancangan Sistem 24

3.1 Analisis Algoritma 24

3.2 Karakteristik Algoritma Huffman dan LZW (Lempel Ziv Welch) 25

3.3 Analisis Pemampatan File Teks 26

3.3.1 Pemampatan File Teks dengan Algoritma Huffman 26 3.3.2 Pemampatan File Teks dengan Algoritma LZW 31 3.3.3 Penirmampatan File Teks dengan Algoritma Huffman 32 3.3.4 Penirmampatan File Teks dengan Algoritma LZW 33


(9)

3.4 Analisis Fungsional Sistem 34

3.4.1 DFD Level 0 ( Context Diagram ) 34

3.4.2 DFD Level 1 35

3.4.3 DFD Level 2 Untuk Proses Encoding (Pemampatan) 36 3.4.4 DFD Level 2 Untuk Proses Decoding (Penirmampatan) 38

Bab 4 Implementasi dan Pengujian 39

4.1 Lingkungan Implementasi 39

4.2 Perangkat Keras yang Digunakan 39

4.3 Perangkat Lunak yang Digunakan 39

4.4 Implementasi Antar Muka 40

4.5 Pengujian Sistem Kompresi Teks Sederhana 44

4.5.1 Analisis Ukuran File 45

4.5.2 Analisis Kecepatan Proses 51

Bab 5 Penutup 60

5.1 Kesimpulan 60

5.2 Saran 61

Daftar Pustaka 62

Lampiran A: Pembentukan Pohon Huffman 63

Lampiran B: Perbandingan Teks dengan Kamus 71 Lampiran C: Kode LZW yang Dicocokkan dengan Kamus 79


(10)

DAFTAR TABEL

Halaman Tabel 2.1 Frekuensi Kemunculan Karakter yang Telah Diurutkan 16 Tabel 2.2 Tabel Kode Huffman untuk Masing-Masing Karakter 19

Tabel 2.3 Proses Pemampatan LZW 22

Tabel 2.4 Proses Penirmampatan LZW 23

Tabel 3.1 Karakter yang telah Diurutkan Berdasarkan Frekuensinya 27

Tabel 3.2 Kode Huffman yang telah Terbentuk 29

Tabel 4.1 Hasil Pengujian Sistem 45

Tabel 4.2 Rasio Pemampatan 16 File (*.txt) dengan Algoritma Huffman dan LZW 46 Tabel 4.3 Rasio Pemampatan 16 File (*.doc) dengan Algoritma Huffman dan LZW 47 Tabel 4.4 Rasio Pemampatan 16 File (*.htm) dengan Algoritma Huffman dan LZW48 Tabel 4.5 Rasio Pemampatan 16 File (*.rtf) dengan Algoritma Huffman dan LZW 49 Tabel 4.6 Kecepatan Proses Pemampatan 16 File (*.txt) dengan Algoritma

Huffman dan LZW 51

Tabel 4.7 Kecepatan Proses Pemampatan 16 File (*.doc) dengan Algoritma

Huffman dan LZW 53

Tabel 4.8 Kecepatan Proses Pemampatan 16 File (*.htm) dengan Algoritma

Huffman dan LZW 55

Tabel 4.9 Kecepatan Proses Pemampatan 16 File (*.rtf) dengan Algoritma


(11)

DAFTAR GAMBAR

Halaman Gambar 2.1 Pohon Berakar dengan v1 Sebagai Akar 9

Gambar 2.2 Pohon Biner 9

Gambar 2.3 Pembentukan Pohon Huffman 18

Gambar 3.1 Pohon Huffman yang telah Terbentuk 28

Gambar 3.2 Diagram Level 0 34

Gambar 3.3 Diagram Level 1 35

Gambar 3.4 Diagram Level 2 untuk Proses Encoding (Pemampatan) 36 Gambar 3.5 Diagram Level 2 untuk Proses Decoding (Penirmampatan) 38

Gambar 4.1 Tampilan Halaman Utama 40

Gambar 4.2 File Teks yang akan Dimampatkan ( Compression ) 41 Gambar 4.3 Pemampatan File Teks dengan Algoritma Huffman 42 Gambar 4.4 Penirmampatan File Teks dengan Algoritma Huffman 42 Gambar 4.5 Pemampatan File Teks dengan Algoritma LZW 43 Gambar 4.6 Penirmampatan File Teks dengan Algoritma LZW 43

Gambar 4.7 Grafik Rasio Pemampatan File (*.txt) 46

Gambar 4.8 Grafik Rasio Pemampatan File (*.doc) 47

Gambar 4.9 Grafik Rasio Pemampatan File (*.htm) 48

Gambar 4.10 Grafik Rasio Pemampatan File (*.rtf) 49 Gambar 4.11 Grafik Perbandingan Rasio Pemampatan 50 Gambar 4.12 Grafik Kecepatan Pemampatan File (*.txt) 52 Gambar 4.13 Grafik Kecepatan Pemampatan File (*.doc) 54 Gambar 4.14 Grafik Kecepatan Pemampatan File (*.htm) 56 Gambar 4.15 Grafik Kecepatan Pemampatan File (*.rtf) 58 Gambar 4.16 Grafik Perbandingan Kecepatan Pemampatan 59


(12)

STUDY OF COMPARISON OF HUFFMAN AND LZW ALGORITHM IN COMPRESSION OF TEXT FILE

ABSTRACT

The aim of data compression is to reduce the file size before storing or transferring it in media storage. Huffman an LZW are two algorithm used to data compression process in this paper. These algorithms are implemented by using Visual C++ to compare the compression algorithms. The comparison is used in the case of ratio of compression and compression speed the text file of result of compression. The text file is tested upon 16 type of text file by various sizes. It can be concluded that in the Huffman algorithm yield the best file ratio compression than LZW algorithm. However, Huffman algorithm requires the brief compression time than LZW algorithm. There are several text files that are not suitable to be compressed by LZW algorithm, because the compressed file becomes same or bigger in size.


(13)

ABSTRAK

Pemampatan data bertujuan untuk mengurangi ukuran file sebelum menyimpan atau memindahkan data ke dalam media penyimpanan. Huffman dan LZW adalah dua algoritma yang digunakan untuk proses pemampatan pada tugas akhir ini. Pada tugas akhir ini dibuat perangkat lunak yang menggunakan bahasa pemrograman Visual C++ untuk membandingkan ke dua algoritma pemampatan tersebut. Perbandingan dilakukan dalam hal rasio pemampatan dan kecepatan proses file teks hasil pemampatan. File teks yang diuji adalah 16 tipe file teks dengan berbagai ukuran. Disimpulkan bahwa, secara rata-rata algoritma Huffman menghasilkan rasio file hasil pemampatan yang terbaik daripada algoritma LZW. Dan juga, secara rata-rata algoritma Huffman membutuhkan waktu pemampatan yang tersingkat daripada algoritma LZW. Terdapat beberapa file teks yang tidak tepat untuk dimampatkan dengan algoritma LZW karena dapat menghasilkan file hasil pemampatan yang berukuran sama atau lebih besar dari ukuran file sumber.


(14)

BAB 1

PENDAHULUAN

1.1 LATAR BELAKANG

Kemajuan teknologi memicu kebutuhan informasi yang semakin besar. Sayangnya kebutuhan informasi yang besar ini berdampak pada kebutuhan storage (media penyimpanan) yang semakin besar pula. Informasi yang dimaksud adalah informasi yang berupa file text (file berisi tulisan biasa). Teks adalah kumpulan dari karakter – karakter atau string yang menjadi satu kesatuan. Teks yang memuat banyak karakter didalamnya selalu menimbulkan masalah pada media penyimpanan dan kecepatan waktu pada saat transmisi data.

Media penyimpanan yang terbatas, membuat semua orang mencoba berpikir untuk menemukan sebuah cara yang dapat digunakan untuk memampatkan data teks. pemampatan ialah proses pengubahan sekumpulan data menjadi suatu bentuk kode untuk menghemat kebutuhan tempat penyimpanan dan waktu untuk transmisi data .

Ada beberapa faktor yang sering menjadi pertimbangan dalam memilih suatu metode pemampatan yang tepat, yaitu kecepatan pemampatan, sumber daya yang dibutuhkan (memori, kecepatan PC), ukuran file hasil pemampatan, besarnya redundansi, dan kompleksitas algoritma. Tidak ada metode pemampatan yang paling efektif untuk semua jenis file. Dalam penelitian ini, diimplementasikan dua buah metode pemampatan, yaitu algoritma Huffman dan LZW yang masing-masing mewakili sebuah kategori teknik pengkodean, dalam bentuk sebuah perangkat lunak. Kedua metode ini diujikan untuk pemampatan dan penirmampatan tipe dan ukuran file text yang berbeda. Lalu dilakukan analisis statistik untuk membandingkan kinerja setiap metode berdasarkan dua faktor, yaitu rasio/perbandingan ukuran file hasil pemampatan terhadap file asli dan kecepatan pemampatannya.


(15)

1.2 Rumusan Masalah

Dari latar belakang di atas dapatlah dirumuskan beberapa masalah yang menjadi latar belakang penelitian ini, yaitu:

1. Bagaimana cara menerapkan algoritma huffman dan LZW dalam pemampatan data yang berupa data teks dan bagaimana proses encoding pada algoritma Huffman dan LZW untuk data yang akan dimampatkan dari ukuran yang besar menjadi ukuran yang lebih kecil serta bagaimana proses decoding pada algoritma Huffman dan LZW untuk data yang telah dimampatkan agar kembali ke ukuran semula .

2. Menghitung berapa kecepatan pemampatan pada masing-masing algoritma .

3. Berapa rasio/perbandingan ukuran file hasil pemampatan terhadap file asli .

1.3 Batasan masalah

Untuk memfokuskan pada tujuan penelitian maka penulis membatasi pembahasan penelitian ini. Adapun yang menjadi pembatasan masalah adalah sebagai berikut:

1. Data yang dimampatkan berupa text, tidak berupa image, video dan audio.

2. Operating System yang digunakan yaitu Windows XP.

3. File yang dimampatkan adalah file teks (*.txt), file rtf (*.rtf), file html (*.htm) dan file dokumen (*.doc) .

4. Rasio ( perbandingan ) yang dilakukan berdasarkan kecepatan pemampatan dan ukuran file hasil pemampatan terhadap ukuran semula .


(16)

1.4 Tujuan Penelitian

Tujuan dari penelitian ini adalah untuk mengetahui performansi dari masing-masing algoritma baik itu Algoritma Huffman dan Algoritma LZW dalam pemampatan teks serta mengetahui kelebihan dan kekurangan algoritma Huffman dan LZW

1.5 Manfaat Penelitian

Manfaat dari penelitian ini yaitu memahami dan mengetahui bagaimana memilih teknik pemampatan yang tepat, sehingga dapat bermanfaat juga untuk melakukan penyimpanan data dalam ruang penyimpanan yang terbatas .

1.6 Metode Penelitian

Penelitian ini dilakukan dengan beberapa tahapan yaitu :

1) Pembelajaran secara literatur

Metode ini dilaksanakan dengan melakukan studi kepustakaan melalui membaca buku-buku maupun artikel–artikel yang dapat mendukung penelitian.

2) Analisis Masalah

Mencari penyebab dan solusi permasalahan yang telah diidentifikasikan pada rurmusan masalah.

3) Perancangan

Pada tahap ini akan dilakukan perancangan program pemampatan data teks ( kompresi teks ) yang akan dibuat sesuai dengan analisis yang telah ada.


(17)

4) Implementasi aplikasi

Tahap ini adalah adalah tahap untuk menterjemahkan rancangan aplikasi ke dalam bentuk yang lebih nyata, dalam hal ini adalah bahasa pemrograman Visual C++.

5) Pengujian

Melakukan serangkaian ujicoba terhadap hasil dari implementasi aplikasi, dan memperbaiki jika masih terdapat kesalahan dan menarik kesimpulan dari analisis yang dilakukan.

6) Penyusunan laporan dalam bentuk skripsi

1.7 Sistematika Penulisan

Dalam penulisan tugas akhir ini, Penulis membagi sistematika penulisan menjadi 5 Bab, yang lebih jelasnya dapat dilihat di bawah ini :

BAB 1 : PENDAHULUAN

Berisi tentang latar belakang diambilnya judul Tugas Akhir “Studi Perbandingan Algoritma Huffman dan LZW (Lempel-Ziv-Welch) pada Pemampatan File Teks” , tujuan dari pembuatan Tugas Akhir ini, batasan masalah dalam perancangan aplikasi, dan sistematika penulisan Tugas Akhir yang menjelaskan secara garis besar susbstansi yang diberikan pada masing-masing bab.

BAB 2 : LANDASAN TEORI

Membahas tentang pengertian pemampatan data teks (file compression) secara umum, metode dan cara kerja dari algoritma Huffman dan LZW.


(18)

BAB 3 : ANALISIS DAN PERANCANGAN SISTEM

Berisi analisa dari algoritma Huffman dan LZW, karakteristik dan perancangan kode untuk algoritma Huffman dan LZW.

BAB 4 : IMPLEMENTASI DAN PENGUJIAN SISTEM

Bab ini menjelaskan bagaimana mengimplementasikan aplikasi dirancang dan dilanjutkan dengan menguji aplikasi yang dibangun dengan menggunakan bahasa pemrograman Visual C++.

BAB 5 : KESIMPULAN DAN SARAN


(19)

BAB 2

LANDASAN TEORI

2.1 Pengertian File Teks

Teks adalah kumpulan dari karakter – karakter atau string yang menjadi satu kesatuan. Teks yang memuat banyak karakter didalamnya selalu menimbulkan masalah pada media penyimpanan dan kecepatan waktu pada saat transmisi data. 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, Unicode, dan EBCDIC, ASCII (American Standard Code for Information Interchange) merupakan suatu standar internasional dalam kode huruf dan simbol seperti Hex, dan Unicode tetapi ASCII bersifat lebih universal. ASCII digunakan oleh komputer dan alat komunikasi lain untuk menunjukkan teks. Kode ASCII memiliki komposisi bilangan biner sebanyak 8 bit, dimulai dari 00000000 dan 11111111. Total kombinasi yang dihasilkan sebanyak 256, dimulai dari kode 0 hingga 255 dalam sistem bilangan desimal. Unicode adalah suatu standar industri yang dirancang untuk mengizinkan teks dan symbol dari semua sistem tulisan di dunia untuk ditampilkan dan dimanipulasi secara konsisten oleh komputer. EBCDIC (Extended Binary Code Decimal Interchange Code) merupakan set karakter yang diciptakan oleh komputer merk IBM. EBCDIC terdiri dari 256 karakter yang masing-masing berukuran 8 bit ( Sudewa, Ida Bagus Adi, 2003).


(20)

2.1.1 Tipe Teks

Tipe teks merupakan tipe dasar yang sudah sangat dikenal dalam kehidupan sehari-hari. Tipe teks terdiri dari tipe karakter (char) dan tipe string. Tipe karakter (char) terdiri atas satu huruf, angka, tanda baca, atau karakter khusus seperti “c”,”1”,”#” dan sebagainya. Tipe string terdiri atas nol atau lebih karakter seperti “teks” dan “algoritma” dan sebagainya (Purnomo, Herry et al, 2005, hal: 99).

2.1.2 Format Teks

Secara umum, format data teks dibagi menjadi dua bagian, yaitu (Purnomo, Herry et al, 2005, hal: 410) :

1. Teks terformat (formatted text)

Merupakan teks yang terformat dan mengandung styles. Format data dokumen Microsoft Word (*.doc) merupakan contoh format teks jenis ini yang paling popular.

2. Teks sederhana (plain text)

Format data teks (*.txt) merupakan contoh format teks yang paling populer.

Contoh format data teks di atas beserta perangkat lunak yang biasa digunakan diantaranya adalah (Purnomo, Herry et al, 2005, hal: 410):

1. Rich Text Format (*.rtf)

Format teks ini dikembangkan oleh Microsoft yang dapat dibaca oleh berbagai macam platform, seperti Windows, Linux, Mac OS, dan sebagainya.

2. Format data teks (*.txt)

Format data teks merupakan format teks yang digunakan untuk menyimpan huruf, angka, karakter, kontrol (tabulasi, pindah baris, dan sebagainya) atau simbol-simbol lain yang biasa digunakan dalam tulisan seperti titik, koma, tanda petik, dan


(21)

sebagainya. Satu huruf, angka, karakter, kontrol atau simbol pada arsip teks memakan tempat satu byte. Berbeda dengan jenis teks terformat yang satu huruf saja dapat memakan tempat beberapa byte untuk menyimpan format dari huruf tersebut seperti font, ukuran, tebal atau tidak dan sebagainya. Kelebihan dari format data teks ini adalah ukuran datanya yang kecil karena tiadanya fitur untuk memformat tampilan teks. Saat ini perangkat lunak yang paling banyak digunakan untuk memanipulasi format data ini adalah Notepad.

3. Hyper Text Markup Language (*.html atau *.htm)

Merupakan format teks standard untuk tampilan dokumen web.

4. Format data dokumen (*.doc)

Doc merupakan ekstensi arsip dokumen perangkat lunak Microsoft Word yang paling banyak digunakan dalam penulisan laporan, makalah dan sebagainya. Doc merupakan jenis teks terformat yang tidak hanya dapat mengatur tampilan teks seperti styles (font, ukuran huruf dan sebagainya), namun juga dapat menyisipkan gambar. Kekurangan format teks dokumen ini terletak pada ukuran datanya yang besar.

2.2 Pohon (Tree)

Secara sederhana tree dapat didefinisikan sebagai kumpulan elemen yang salah satu elemennya disebut root, dan sisa elemen yang lain (yang disebut node) terpecah menjadi sejumlah himpunan yang saling tidak berhubungan satu sama lain (disjoint), yang disebut dengan subtree. Node yang tidak mempunyai cabang disebut terminal node atau leaf, sedangkan node yang mempunyai cabang disebut branch node. Jumlah

node pada sebuah tree merupakan bilangan terbatas (finite number) (Muthohar, Fiqri, 2004).

Sebuah pohon berakar adalah pohon di mana sebuah node tertentu dirancang seperti akar


(22)

v1 v2 v3

v4 v5 v6 v7

Gambar 2.1 Pohon Berakar dengan v1 Sebagai Akar

Pohon secara luas digunakan dalam struktur data ilmu komputer seperti pohon biner, pohon perentang, tumpukan dan lain-lain.

2.3 Pohon Biner (Binary Tree)

Pohon biner merupakan kasus khusus pohon n-ary jika n = 2. Pohon biner adalah himpunan dengan jumlah terbatas yaitu m buah node (m ≥ 0), yang selain kosong (m = 0) hanya dapat berisi sebuah node root yang memiliki dua buah subtree yang masing-masing disebut sub binary tree kiri dan sub binary tree kanan. Jika m = 0 maka disebut empty binary tree (Muthohar, Fiqri, 2004).

Misalkan T adalah pohon biner dan vєV(T)adalah suatu titik cabang dalam T. Subpohon kiri v adalah pohon biner yang (Johnsonbaugh, Richard, 1998) :

1. Titik-titiknya adalah anak kiri v dan semua turunannya.

2. Garis-garisnya adalah garis-garis dalam E(T) yang menghubungkan titik-titik subpohon kiri v.

3. Anaknya adalah anak kiri v.

v

w x


(23)

Gambar di atas merupakan pohon biner dengan dua subpohon, yaitu subpohon kiri v dengan w sebagai akar dan subpohon kanan v dengan x sebagai akar.

2.4 Pengertian Pemampatan Data

Pemampatan (kompresi) adalah proses pengubahan sekumpulan data menjadi bentuk kode dengan tujuan untuk menghemat kebutuhan tempat penyimpanan dan waktu untuk transmisi data (Linawaty et al,2004, hal:7). Pemampatan hanya mungkin untuk dilakukan apabila data yang direpresentasikan dalam bentuk normal mengandung informasi yang tidak dibutuhkan. Ketika data tersebut sudah ditampilkan dalam format yang seminimal mungkin, maka data tersebut sudah tidak akan bisa dimampatkan lagi. File yang demikian disebut random file.

Pemampatan merupakan salah satu dari teori informasi yang diperkenalkan oleh Shannon yang bertujuan untuk menghilangkan redundansi dari sumber. Pemampatan bermanfaat dalam membantu mengurangi konsumsi sumber daya yang mahal, seperti ruang hard disk atau perpindahan data melalui internet.

Pemampatan data memiliki beberapa aplikasi, diantaranya (Munir, Rinaldi, 2004, hal: 166):

1. Pengiriman data (data transmission) pada saluran komunikasi data

Data yang telah dimampatkan membutuhkan waktu yang lebih singkat dibandingkan data yang tidak dimampatkan.

2. Penyimpanan data (data storing) di dalam media sekunder ( storage )

Data yang telah dimampatkan membutuhkan ruang pada media penyimpanan yang lebih sedikit dibandingkan dengan data yang tidak dimampatkan.


(24)

2.5 Metode Pemampatan

Metode pemampatan berdasarkan output ada 2 jenis, yaitu: 1. Metode Lossless

Pemampatan data yang menghasilkan file data hasil pemampatan yang dapat dikembalikan menjadi file data asli sebelum dimampatkan secara utuh tanpa perubahan apapun. Pemampatan data lossless bekerja dengan menemukan pola yang berulang di dalam pesan yang akan dimampatkan tersebut dan melakukan proses pengkodean pola tersebut secara efisien. Pemampatan ini juga dapat berarti proses untuk mengurangi redundancy. Pemampatan jenis ini ideal untuk pemampatan text. Algoritma yang termasuk dalam metode pemampatan

lossless diantaranya adalah teknik dictionary coding dan Huffman coding

(Fernando, Hary, 2004).

2. Metode Lossy

Pemampatan data yang menghasilkan file data hasil pemampatan yang tidak dapat dikembalikan menjadi file data sebelum dimampatkan secara utuh. Ketika data hasil pemampatan di-decode kembali, data hasil decoding tersebut tidak dapat dikembalikan menjadi sama dengan data asli tetapi ada bagian data yang hilang. Oleh karena itu, pemampatan jenis ini tidak baik untuk kompresi data yang kritis seperti data teks. Bentuk pemampatan ini sangat cocok untuk digunakan pada file-file gambar, suara, dan film. Contoh penggunaan pemampatan lossy adalah pada format file JPEG, MP3 dan MPEG . ( Nelson, Mark et al, 1996).

Efek pemampatan pada metode pemampatan losseless dapat diukur melalui sejumlah penyusutan suatu file asal dalam membandingkan ukuran dari jenis-jenis pemampatan, yaitu :

1. Rasio pemampatan, merupakan perbandingan ukuran file setelah pemampatan dengan file semula yang ditunjukkan dalam persentase (ditulis dalam %):


(25)

x 100% (2.1) 2. Kecepatan proses pemampatan (ditulis dalam satuan Kbyte/s):

Kecepatan Proses Pemampatan (2.2)

Ada beberapa kriteria yang sering menjadi pertimbangan dalam memilih suatu metode pemampatan yang tepat diantaranya kecepatan pemampatan, sumber daya yang dibutuhkan, kualitas, ukuran file, kompleksitas algoritma dan lain-lain (Munir, Rinaldi, 2004, hal: 166). Kualitas pemampatan dengan kebutuhan memori biasanya berbanding terbalik. Kualitas pemampatan yang bagus umumnya dicapai pada proses pemampatan yang menghasilkan pengurangan memori yang tidak begitu besar dan begitu juga sebaliknya.

2.6 Algoritma Huffman

Algoritma Huffman, yang dibuat oleh seorang mahasiswa MIT bernama David Huffman pada tahun 1952, merupakan salah satu metode paling lama dan paling terkenal dalam pemampatan teks. Algoritma Huffman menggunakan prinsip pengkodean yang mirip dengan kode Morse, yaitu tiap karakter (simbol) dikodekan hanya dengan rangkaian beberapa bit, dimana karakter yang sering muncul dikodekan dengan rangkaian bit yang pendek dan karakter yang jarang muncul dikodekan.dengan rangkaian bit yang lebih panjang. Berdasarkan tipe peta kode yang digunakan untuk mengubah pesan awal (isi data yang diinputkan) menjadi sekumpulan codeword, algoritma Huffman termasuk kedalam kelas algoritma yang menggunakan metode statik (Ida, Mengyi Pu, 2006).

Metoda statik adalah metoda yang selalu menggunakan peta kode yang sama, metoda ini membutuhkan dua fase (two-pass): fase pertama untuk menghitung probabilitas kemunculan tiap simbol dan menentukan peta kodenya, dan fase kedua untuk mengubah pesan menjadi kumpulan kode yang akan di transmisikan. Sedangkan berdasarkan teknik pengkodean simbol yang digunakan, algoritma


(26)

Huffman menggunakan metode symbolwise. Metoda symbolwise adalah metode yang menghitung peluang kemunculan dari setiap simbol dalam satu waktu, dimana simbol yang lebih sering muncul diberi kode lebih pendek dibandingkan simbol yang jarang muncul. Dalam tugas akhir ini algoritma Huffman yang dibahas yaitu algoritma Huffman yang menggunakan metode statik ( Ida, Mengyi Pu, 2006).

Pada awalnya David Huffman hanya menencoding karakter dengan hanya menggunakan pohon biner biasa, namun setelah itu David Huffman menemukan bahwa penggunaan algoritma greedy dapat membentuk kode prefiks yang optimal. Penggunaan algoritma greedy pada algoritma Huffman adalah pada saat pemilihan dua pohon dengan frekuensi terkecil dalam membuat pohon Huffman. Algoritma greedy ini digunakan pada pembentukan pohon Huffman agar meminimumkan total

cost yang dibutuhkan. Cost yang digunakan untuk menggabungkan dua buah pohon pada akar setara dengan jumlah frekuensi dua buah pohon yang digabungkan, oleh karena itu total cost pembentukan pohon Huffman adalah jumlah total seluruh penggabungan. penggabungan dua buah pohon dilakukan setiap langkah dan algoritma Huffman selalu memilih dua buah pohon yang mempunyai frekuensi terkecil untuk meminimumkan total cost (Wardoyo, Irwan et al, 2003, hal:1).

2.6.1 Kode Prefix (Prefix Code)

Kode Huffman pada dasarnya merupakan kode prefiks (prefix code). Kode prefiks adalah himpunan yang berisi sekumpulan kode biner, dimana pada kode prefik ini tidak ada kode biner yang menjadi awal bagi kode biner yang lain. Kode prefiks biasanya direpresentasikan sebagai pohon biner yang diberikan nilai atau label. Untuk cabang kiri pada pohon biner diberi label 0, sedangkan pada cabang kanan pada pohon biner diberi label 1. Rangkaian bit yang terbentuk pada setiap lintasan dari akar ke daun merupakan kode prefiks untuk karakter yang berpadanan (Hanif, Irfan, 2004, hal: 3).


(27)

2.6.2 Kode Huffman

Huffman memberikan sebuah algoritma untuk memangun sebuah kode Huffman dengan masukan string teks S={s1,s2,…,sn} dan frekuensi kemunculan karakter

F={f1,f2,…,fn}, dihasilkan keluaran berupa kode string biner C={c1,c2,…,cn} atau

disebut kode Huffman (Liliana et al, 2003, hal:4).

Algoritma Pemampatan Huffman:

1. Baca file text yang akan dimampatkan (file asal).

2. Hitung frekuensi dari setiap karakter yang ada. Jenis karakter dan frekuensinya disimpan sebagai tree dalam sebuah list.

3. Selama list masih mempunyai node lebih dari satu maka

a. Urutkan list berdasarkan frekuensinya, secara ascending.

b. Buat tree baru, kaki kiri diisi dengan node pertama list dan kaki kanannya diisi dengan node kedua list. Karakter yang disimpan berupa “a“ dan frekuensinya merupakan jumlahan dari frekuensi kedua kakinya.

4. Sebelum hasil pemampatan disimpan dalam file hasil, maka simpan terlebih dahulu tree huffman nya. Pertama simpan jumlah karakter keseluruhan. Kemudian telusuri tree secara preorder, kaki kiri diberi kode “0“ dan kaki kanan diberi kode “1“. Setelah sampai pada leaf maka simpan karakter pada leaf tersebut baru kemudian simpan deretan kode yang dihasilkan. Setiap kode disimpan dengan dibatasi “a“. Setelah tree selesai disimpan, untuk membatasi penyimpanan tree dengan hasil kompresi, disisipkan “A“.

5. Telusuri tree secara preorder, kaki kiri diberi kode “0“ dan kaki kanan diberi kode “1“. Setelah sampai pada leaf maka deretan kode yang didapat digunakan untuk mengkodekan karakter pada leaf tersebut. Setelah penelusuran selesai maka akan didapat daftar karakter dan kode binernya.

6. Baca setiap karakter pada file asal. Ubah menjadi kode biner. Setelah semua dikodekan, setiap 8 kode dicari desimalnya (ASCII) kemudian simpan kembali sebagai karakter baru.


(28)

Tabel karakter-karakter yang diurutkan berdasarkan frekuensi kemunculan karakter tersebut berhubungan dengan distribusi probabilitas atau distribusi peluang. Distribusi probabilitas ini berhubungan pada kemungkinan penempatan akar atau subpohon baru yang telah terbentuk. Probabilitas untuk masing-masing karakter adalah frekuensi karakter tersebut dibagi jumlah frekuensi keseluruhan.

Untuk proses penirmampatan (decompression) merupakan kebalikan dari proses pemampatan (compression), Decompression berarti menyusun kembali data dari string biner menjadi sebuah karakter kembali. Decompression dapat dilakukan dengan dua cara, yang pertama dengan menggunakan tabel dan yang kedua dengan menggunakan algoritma penirmampatan (decompression).

Algoritma penirmampatan

1. Baca sebuah bit dari string biner. 2. Mulai dari akar

3. Untuk setiap bit pada langkah 1, lakukan traversal pada cabang yang bersesuaian.

4. Ulangi langkah 1, 2 dan 3 sampai bertemu daun. Kodekan rangkaian bit yang telah dibaca dengan karakter di daun.

5. Ulangi dari langkah 1 sampai semua bit di dalam string habis.

Contoh 2.1

Diberikan string “piagam penghargaan” sebagai masukan pada pemampatan file teks. Masukan ini terdiri dari karakter-karakter abjad S={p, i, a, g, m, e, n, h, r, spasi} dengan frekuensi kemunculan karakter F={2, 1, 5, 3, 1, 1, 2, 1, 1, 1}. Apabila string tersebut menggunakan koe ASCII untuk mengkodekan setiap karakter, maka representasi 18 karakter membutuhkan 18 x 8 = 144 bit atau 18 bytes. Untuk meminimumkan jumlah bit yang dibutuhkan, panjang kode untuk setiap karakter sedapat mungkin diperpendek, terutama untuk setiap karakter yang frekuensi kemunculannya besar. Jadi, bagaimana memperoleh jumlah minimum bit apabila digunakan algoritma Huffman untuk menghasilkan kode yang merepresentasikan setiap karakter.


(29)

Dengan menggunakan algoritma Huffman untuk mengkodekan setiap karakter dapat diperoleh kode Huffman sebagai berikut :

Masukan : 18 karakter yang telah diurutkan dan table frekuensi Keluaran : Kode Huffman

1. Pengurutan karakter berdasarkan frekuensi kemunculannya. Karakter pada data diurutkan di dalam tabel secara menaik (ascending order).

Tabel 2.1 Frekuensi Kemunculan Karakter yang Telah Diurutkan

Karakter Frekuensi

spasi 1

r 1

h 1

e 1

m 1

i 1

p 2

n 2

g 3

a 5

Jumlah 18

2. Pembentukan pohon Huffman

Setiap karakter digambarkan sebagai daun. Gabungkan dua daun yang mempunyai frekuensi kemunculan karakter paling kecil untuk membentuk sebuah akar kemudian akar diurutkan kembali. Akar merupakan jumlah frekuensi dua daun atau subpohon penyusunnya. Iterasi ini dilakukan hingga terbentuk satu buah pohon biner. Beri label 0 dan 1 pada setiap sisi pohon biner. Sisi kiri diberi label 0 dan sisi kanan diberi label 1.


(30)

Pengurutan kembali akar yang baru terbentuk berhubungan dengan distribusi probabilitas. Pada contoh ini, ada lebih dari satu kemungkinan tempat yang tersedia pada penggabungan karakter “spasi” dan “r” dengan frekuensi 2. Untuk mencegah penggabungan akar baru terlalu cepat maka akar ditempatkan pada posisi terendah. Jadi, akar baru “spasi” dan “r” ditempatkan sesudah karakter “a”.

Pembentukan pohon biner dari string “piagam penghargaan” adalah :

h=1 e=1 m=1 i=1

p=2 n=2

g=3 a=5 2

spasi=1 r=1 7.

2 2

4

8 4

8

h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 1.

h=1 e=1

m=1 i=1 p=2 n=2 g=3 a=5 2

spasi=1 r=1

2. 2

h=1 e=1 m=1 i=1

p=2 n=2 g=3 a=5 2

spasi=1 r=1

3. 2 2

h=1 e=1

m=1 i=1 p=2 n=2

g=3 a=5 2

spasi=1 r=1

4. 2 2 4

h=1 e=1

m=1 i=1 p=2 n=2 g=3 a=5

2 spasi=1 r=1

5. 2 2 4 8

h=1 e=1

m=1 i=1 2 p=2 n=2 g=3 a=5

spasi=1 r=1 6.

2


(31)

h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 8. 2 2 4 8 4 8 16 h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 9. 2 2 4 8 4 8 16 18 h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 0 2 2 4 8 4 8 16 18 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

Gambar 2.3 Pembentukan Pohon Huffman

Keterangan gambar :

: akar yang dibentuk dari dua daun atau subpohon penyusunnya : daun yang terdiri dari karakter dan frekuensinya


(32)

3. Kode Huffman yang diperoleh dari pohon Huffman yang telah terbentuk adalah :

Tabel 2.2 Tabel Kode Huffman untuk Masing-Masing Karakter Karakter Frekuensi

(f)

Kode Huffman Panjang Kode ( shf )

Total Panjang ( f x shf )

Spasi 1 10110 5 5

r 1 10111 5 5

h 1 10100 5 5

e 1 10101 5 5

m 1 00 2 2

i 1 01 2 2

p 2 1000 4 8

n 2 1001 4 8

g 3 110 3 9

a 5 111 3 15

Total 18 34 64

Dengan demikian, jumlah bilangan bit yang dibutuhkan oleh algoritma Huffman untuk merepresentasikan string “piagam penghargaan” adalah 64 bit. String tersebut dimampatkan dengan rasio sebesar :

x 100% x 100%

= 44,4%

Dengan demikian string “piagam penghargaan” dimampatkan menjadi rangkaian bit : 1000011111101110010110100010101100111010100111101111101111111001

Untuk proses penirmampatan (decompression) atau menyusun kembali data dari kode biner menjadi sebuah string asli dapat digunakan tabel kode Huffman yang


(33)

telah terbentuk atau menggunakan algoritma penirmampatan. Pada proses penirmampatan, rangkaian bit biner

1000011111101110010110100010101100111010100111101111101111111001 Dimulai dengan membaca bit pertama yaitu “1”, tidak terdapat bit “1” pada tabel kode Huffman. Lalu baca bit berikutnya, sehingga menjadi “10”, tidak terdapat juga bit “10”, kemudian baca lagi bit berikutnya, sehingga menjadi “100”, tidak terdapat juga bit “100”, kemudian baca lagi bit berikutnya, sehingga menjadi “1000”. Rangkaian bit “1000” ini ditemukan pada tabel kode Huffman yaitu bit yang merepresentasikan karakter “p”. Proses ini terus dilakukan hingga tidak terdapat lagi bit biner.

2.7 Algoritma LZW (Lempel Ziv Welch)

Algoritma Lempel-Ziv-Welch (LZW) menggunakan teknik adaptif dan berbasiskan “kamus” Pendahulu LZW adalah LZ77 dan LZ78 yang dikembangkan oleh Jacob Ziv dan Abraham Lempel pada tahun 1977 dan 1978. Terry Welch mengembangkan teknik tersebut pada tahun 1984. LZW banyak dipergunakan pada UNIX, GIF, V.42 untuk modem ( Cormen et al, 2001).

Algoritma ini melakukan kompresi dengan menggunakan dictionary, di mana fragmen-fragmen teks digantikan dengan indeks yang diperoleh dari sebuah “kamus”. Prinsip sejenis juga digunakan dalam kode Braille, di mana kode-kode khusus digunakan untuk merepresentasikan kata-kata yang ada. Pendekatan ini bersifat

adaptif dan efektif karena banyak karakter dapat dikodekan dengan mengacu pada

string yang telah muncul sebelumnya dalam teks. Prinsip kompresi tercapai jika referensi dalam bentuk pointer dapat disimpan dalam jumlah bit yang lebih sedikit dibandingkan string aslinya (Dobb, 1989).

2.7.1 Kode LZW ( Lempel-Ziv-Welch )

Berikut yang akan dibahas pada subbab ini adalah algoritma pemampatan LZW . Algoritma pemampatan LZW :


(34)

1. Dictionary diinisialisasi dengan semua karakter dasar yang ada : {‘A’..’Z’,’a’..’z’,’0’..’9’}.

2. P = karakter pertama dalam stream karakter. 3. C = karakter berikutnya dalam stream karakter. 4. Apakah string (P + C) terdapat dalam dictionary ?

• Jika ya, maka P =P + C (gabungkan P dan C menjadi string baru). • Jika tidak, maka :

i. Output sebuah kode untuk menggantikan string P.

ii. Tambahkan string (P + C) ke dalam dictionary dan berikan nomor/kode berikutnya yang belum digunakan dalam dictionary untuk string tersebut. iii. P = C.

5. Apakah masih ada karakter berikutnya dalam stream karakter ? • Jika ya, maka kembali ke langkah 2.

• Jika tidak, maka output kode yang menggantikan string P, lalu terminasi proses (stop).

Isi dictionary pada awal proses diset dengan tiga karakter dasar yang ada. Kolom posisi menyatakan posisi sekarang dari stream karakter dan kolom karakter

menyatakan karakter yang terdapat pada posisi tersebut. Kolom dictionary

menyatakan string baru yang sudah ditambahkan ke dalam dictionary dan nomor indeks untuk string tersebut ditulis dalam kurung siku. Kolom output menyatakan kode output yang dihasilkan oleh langkah kompresi (Linawati et al, 2004, hal: 10).

Algoritma penirmampatan LZW :

1. Dictionary diinisialisasi dengan semua karakter dasar yang ada : {‘A’..’Z’,’a’..’z’,’0’..’9’}. 2. CW = kode pertama dari stream kode (menunjuk ke salah satu karakter dasar).

3. Lihat dictionary dan output string dari kode tersebut (string.CW) ke stream karakter. 4. PW = CW; CW = kode berikutnya dari stream kode.

5. Apakah string.CW terdapat dalam dictionary ? ฀Jika ada, maka :

i. output string.CW ke stream karakter ii. P = string.PW


(35)

iii. C = karakter pertama dari string.CW

iv. tambahkan string (P+C) ke dalam dictionary ฀Jika tidak, maka :

i. P = string.PW

ii. C = karakter pertama dari string.PW

iii. output string (P+C) ke stream karakter dan tambahkan string tersebut ke dalam dictionary (sekarang berkorespondensi dengan CW);

6. Apakah terdapat kode lagi di stream kode ? ฀Jika ya, maka kembali ke langkah 4. ฀Jika tidak, maka terminasi proses (stop). Contoh 2.2

String “ABBABABAC” akan dikompresi dengan LZW. Isi dictionary pada awal proses diset dengan tiga karakter dasar yang ada: “A”, “B”, dan “C”. Tahapan proses kompresi ditunjukkan pada Tabel di bawah ini.

Tabel 2.3 Proses Pemampatan LZW

Langkah Posisi Karakter Dictionary Output

1 1 A [4] A B [1]

2 2 B [5] B B [2]

3 3 B [6] B A [2]

4 4 A [7] A B A [4]

5 6 A [8] A B A C [7]

6 9 C --- [3]

Steam karakter: a b b ab aba c

Kode output : [1] [2] [2] [4] [7] [3]

Frasa baru yang 4 5 6 7 8 ditambahkan ke = = = = = dictionary ab bb ba aba abac


(36)

Proses penirmampatan pada LZW dilakukan dengan prinsip yang sama seperti proses kompresi. Pada awalnya, dictionary diinisialisasi dengan semua karakter dasar yang ada. Lalu pada setiap langkah, kode dibaca satu per satu dari stream kode, dikeluarkan string dari dictionary yang berkorespondensi dengan kode tersebut, dan ditambahkan string baru ke dalam dictionary. Tahapan proses dekompresi ini ditunjukkan pada Tabel di bawah ini (Linawati et al, 2004, hal: 11).

Tabel 2.4 Proses Penirmampatan LZW

Langkah Kode Output Dictionary

1 [1] A ---

2 [2] B [4] A B

3 [2] B [5] B B

4 [4] A B [6] B A

5 [7] A B A [7] A B A

6 [3] C [8] A B A C

Hasil Penirmampatan: A B B A B A B A C


(37)

BAB 2

LANDASAN TEORI

2.1 Pengertian File Teks

Teks adalah kumpulan dari karakter – karakter atau string yang menjadi satu kesatuan. Teks yang memuat banyak karakter didalamnya selalu menimbulkan masalah pada media penyimpanan dan kecepatan waktu pada saat transmisi data. 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, Unicode, dan EBCDIC, ASCII (American Standard Code for Information Interchange) merupakan suatu standar internasional dalam kode huruf dan simbol seperti Hex, dan Unicode tetapi ASCII bersifat lebih universal. ASCII digunakan oleh komputer dan alat komunikasi lain untuk menunjukkan teks. Kode ASCII memiliki komposisi bilangan biner sebanyak 8 bit, dimulai dari 00000000 dan 11111111. Total kombinasi yang dihasilkan sebanyak 256, dimulai dari kode 0 hingga 255 dalam sistem bilangan desimal. Unicode adalah suatu standar industri yang dirancang untuk mengizinkan teks dan symbol dari semua sistem tulisan di dunia untuk ditampilkan dan dimanipulasi secara konsisten oleh komputer. EBCDIC (Extended Binary Code Decimal Interchange Code) merupakan set karakter yang diciptakan oleh komputer merk IBM. EBCDIC terdiri dari 256 karakter yang masing-masing berukuran 8 bit ( Sudewa, Ida Bagus Adi, 2003).


(38)

2.1.1 Tipe Teks

Tipe teks merupakan tipe dasar yang sudah sangat dikenal dalam kehidupan sehari-hari. Tipe teks terdiri dari tipe karakter (char) dan tipe string. Tipe karakter (char) terdiri atas satu huruf, angka, tanda baca, atau karakter khusus seperti “c”,”1”,”#” dan sebagainya. Tipe string terdiri atas nol atau lebih karakter seperti “teks” dan “algoritma” dan sebagainya (Purnomo, Herry et al, 2005, hal: 99).

2.1.2 Format Teks

Secara umum, format data teks dibagi menjadi dua bagian, yaitu (Purnomo, Herry et al, 2005, hal: 410) :

1. Teks terformat (formatted text)

Merupakan teks yang terformat dan mengandung styles. Format data dokumen Microsoft Word (*.doc) merupakan contoh format teks jenis ini yang paling popular.

2. Teks sederhana (plain text)

Format data teks (*.txt) merupakan contoh format teks yang paling populer.

Contoh format data teks di atas beserta perangkat lunak yang biasa digunakan diantaranya adalah (Purnomo, Herry et al, 2005, hal: 410):

1. Rich Text Format (*.rtf)

Format teks ini dikembangkan oleh Microsoft yang dapat dibaca oleh berbagai macam platform, seperti Windows, Linux, Mac OS, dan sebagainya.

2. Format data teks (*.txt)

Format data teks merupakan format teks yang digunakan untuk menyimpan huruf, angka, karakter, kontrol (tabulasi, pindah baris, dan sebagainya) atau simbol-simbol lain yang biasa digunakan dalam tulisan seperti titik, koma, tanda petik, dan


(39)

sebagainya. Satu huruf, angka, karakter, kontrol atau simbol pada arsip teks memakan tempat satu byte. Berbeda dengan jenis teks terformat yang satu huruf saja dapat memakan tempat beberapa byte untuk menyimpan format dari huruf tersebut seperti font, ukuran, tebal atau tidak dan sebagainya. Kelebihan dari format data teks ini adalah ukuran datanya yang kecil karena tiadanya fitur untuk memformat tampilan teks. Saat ini perangkat lunak yang paling banyak digunakan untuk memanipulasi format data ini adalah Notepad.

3. Hyper Text Markup Language (*.html atau *.htm)

Merupakan format teks standard untuk tampilan dokumen web.

4. Format data dokumen (*.doc)

Doc merupakan ekstensi arsip dokumen perangkat lunak Microsoft Word yang paling banyak digunakan dalam penulisan laporan, makalah dan sebagainya. Doc merupakan jenis teks terformat yang tidak hanya dapat mengatur tampilan teks seperti styles (font, ukuran huruf dan sebagainya), namun juga dapat menyisipkan gambar. Kekurangan format teks dokumen ini terletak pada ukuran datanya yang besar.

2.2 Pohon (Tree)

Secara sederhana tree dapat didefinisikan sebagai kumpulan elemen yang salah satu elemennya disebut root, dan sisa elemen yang lain (yang disebut node) terpecah menjadi sejumlah himpunan yang saling tidak berhubungan satu sama lain (disjoint), yang disebut dengan subtree. Node yang tidak mempunyai cabang disebut terminal node atau leaf, sedangkan node yang mempunyai cabang disebut branch node. Jumlah

node pada sebuah tree merupakan bilangan terbatas (finite number) (Muthohar, Fiqri, 2004).

Sebuah pohon berakar adalah pohon di mana sebuah node tertentu dirancang seperti akar


(40)

v1 v2 v3

v4 v5 v6 v7

Gambar 2.1 Pohon Berakar dengan v1 Sebagai Akar

Pohon secara luas digunakan dalam struktur data ilmu komputer seperti pohon biner, pohon perentang, tumpukan dan lain-lain.

2.3 Pohon Biner (Binary Tree)

Pohon biner merupakan kasus khusus pohon n-ary jika n = 2. Pohon biner adalah himpunan dengan jumlah terbatas yaitu m buah node (m ≥ 0), yang selain kosong (m = 0) hanya dapat berisi sebuah node root yang memiliki dua buah subtree yang masing-masing disebut sub binary tree kiri dan sub binary tree kanan. Jika m = 0 maka disebut empty binary tree (Muthohar, Fiqri, 2004).

Misalkan T adalah pohon biner dan vєV(T)adalah suatu titik cabang dalam T. Subpohon kiri v adalah pohon biner yang (Johnsonbaugh, Richard, 1998) :

1. Titik-titiknya adalah anak kiri v dan semua turunannya.

2. Garis-garisnya adalah garis-garis dalam E(T) yang menghubungkan titik-titik subpohon kiri v.

3. Anaknya adalah anak kiri v.

v

w x


(41)

Gambar di atas merupakan pohon biner dengan dua subpohon, yaitu subpohon kiri v dengan w sebagai akar dan subpohon kanan v dengan x sebagai akar.

2.4 Pengertian Pemampatan Data

Pemampatan (kompresi) adalah proses pengubahan sekumpulan data menjadi bentuk kode dengan tujuan untuk menghemat kebutuhan tempat penyimpanan dan waktu untuk transmisi data (Linawaty et al,2004, hal:7). Pemampatan hanya mungkin untuk dilakukan apabila data yang direpresentasikan dalam bentuk normal mengandung informasi yang tidak dibutuhkan. Ketika data tersebut sudah ditampilkan dalam format yang seminimal mungkin, maka data tersebut sudah tidak akan bisa dimampatkan lagi. File yang demikian disebut random file.

Pemampatan merupakan salah satu dari teori informasi yang diperkenalkan oleh Shannon yang bertujuan untuk menghilangkan redundansi dari sumber. Pemampatan bermanfaat dalam membantu mengurangi konsumsi sumber daya yang mahal, seperti ruang hard disk atau perpindahan data melalui internet.

Pemampatan data memiliki beberapa aplikasi, diantaranya (Munir, Rinaldi, 2004, hal: 166):

1. Pengiriman data (data transmission) pada saluran komunikasi data

Data yang telah dimampatkan membutuhkan waktu yang lebih singkat dibandingkan data yang tidak dimampatkan.

2. Penyimpanan data (data storing) di dalam media sekunder ( storage )

Data yang telah dimampatkan membutuhkan ruang pada media penyimpanan yang lebih sedikit dibandingkan dengan data yang tidak dimampatkan.


(42)

2.5 Metode Pemampatan

Metode pemampatan berdasarkan output ada 2 jenis, yaitu: 1. Metode Lossless

Pemampatan data yang menghasilkan file data hasil pemampatan yang dapat dikembalikan menjadi file data asli sebelum dimampatkan secara utuh tanpa perubahan apapun. Pemampatan data lossless bekerja dengan menemukan pola yang berulang di dalam pesan yang akan dimampatkan tersebut dan melakukan proses pengkodean pola tersebut secara efisien. Pemampatan ini juga dapat berarti proses untuk mengurangi redundancy. Pemampatan jenis ini ideal untuk pemampatan text. Algoritma yang termasuk dalam metode pemampatan

lossless diantaranya adalah teknik dictionary coding dan Huffman coding

(Fernando, Hary, 2004).

2. Metode Lossy

Pemampatan data yang menghasilkan file data hasil pemampatan yang tidak dapat dikembalikan menjadi file data sebelum dimampatkan secara utuh. Ketika data hasil pemampatan di-decode kembali, data hasil decoding tersebut tidak dapat dikembalikan menjadi sama dengan data asli tetapi ada bagian data yang hilang. Oleh karena itu, pemampatan jenis ini tidak baik untuk kompresi data yang kritis seperti data teks. Bentuk pemampatan ini sangat cocok untuk digunakan pada file-file gambar, suara, dan film. Contoh penggunaan pemampatan lossy adalah pada format file JPEG, MP3 dan MPEG . ( Nelson, Mark et al, 1996).

Efek pemampatan pada metode pemampatan losseless dapat diukur melalui sejumlah penyusutan suatu file asal dalam membandingkan ukuran dari jenis-jenis pemampatan, yaitu :

1. Rasio pemampatan, merupakan perbandingan ukuran file setelah pemampatan dengan file semula yang ditunjukkan dalam persentase (ditulis dalam %):


(43)

x 100% (2.1) 2. Kecepatan proses pemampatan (ditulis dalam satuan Kbyte/s):

Kecepatan Proses Pemampatan (2.2)

Ada beberapa kriteria yang sering menjadi pertimbangan dalam memilih suatu metode pemampatan yang tepat diantaranya kecepatan pemampatan, sumber daya yang dibutuhkan, kualitas, ukuran file, kompleksitas algoritma dan lain-lain (Munir, Rinaldi, 2004, hal: 166). Kualitas pemampatan dengan kebutuhan memori biasanya berbanding terbalik. Kualitas pemampatan yang bagus umumnya dicapai pada proses pemampatan yang menghasilkan pengurangan memori yang tidak begitu besar dan begitu juga sebaliknya.

2.6 Algoritma Huffman

Algoritma Huffman, yang dibuat oleh seorang mahasiswa MIT bernama David Huffman pada tahun 1952, merupakan salah satu metode paling lama dan paling terkenal dalam pemampatan teks. Algoritma Huffman menggunakan prinsip pengkodean yang mirip dengan kode Morse, yaitu tiap karakter (simbol) dikodekan hanya dengan rangkaian beberapa bit, dimana karakter yang sering muncul dikodekan dengan rangkaian bit yang pendek dan karakter yang jarang muncul dikodekan.dengan rangkaian bit yang lebih panjang. Berdasarkan tipe peta kode yang digunakan untuk mengubah pesan awal (isi data yang diinputkan) menjadi sekumpulan codeword, algoritma Huffman termasuk kedalam kelas algoritma yang menggunakan metode statik (Ida, Mengyi Pu, 2006).

Metoda statik adalah metoda yang selalu menggunakan peta kode yang sama, metoda ini membutuhkan dua fase (two-pass): fase pertama untuk menghitung probabilitas kemunculan tiap simbol dan menentukan peta kodenya, dan fase kedua untuk mengubah pesan menjadi kumpulan kode yang akan di transmisikan. Sedangkan berdasarkan teknik pengkodean simbol yang digunakan, algoritma


(44)

Huffman menggunakan metode symbolwise. Metoda symbolwise adalah metode yang menghitung peluang kemunculan dari setiap simbol dalam satu waktu, dimana simbol yang lebih sering muncul diberi kode lebih pendek dibandingkan simbol yang jarang muncul. Dalam tugas akhir ini algoritma Huffman yang dibahas yaitu algoritma Huffman yang menggunakan metode statik ( Ida, Mengyi Pu, 2006).

Pada awalnya David Huffman hanya menencoding karakter dengan hanya menggunakan pohon biner biasa, namun setelah itu David Huffman menemukan bahwa penggunaan algoritma greedy dapat membentuk kode prefiks yang optimal. Penggunaan algoritma greedy pada algoritma Huffman adalah pada saat pemilihan dua pohon dengan frekuensi terkecil dalam membuat pohon Huffman. Algoritma greedy ini digunakan pada pembentukan pohon Huffman agar meminimumkan total

cost yang dibutuhkan. Cost yang digunakan untuk menggabungkan dua buah pohon pada akar setara dengan jumlah frekuensi dua buah pohon yang digabungkan, oleh karena itu total cost pembentukan pohon Huffman adalah jumlah total seluruh penggabungan. penggabungan dua buah pohon dilakukan setiap langkah dan algoritma Huffman selalu memilih dua buah pohon yang mempunyai frekuensi terkecil untuk meminimumkan total cost (Wardoyo, Irwan et al, 2003, hal:1).

2.6.1 Kode Prefix (Prefix Code)

Kode Huffman pada dasarnya merupakan kode prefiks (prefix code). Kode prefiks adalah himpunan yang berisi sekumpulan kode biner, dimana pada kode prefik ini tidak ada kode biner yang menjadi awal bagi kode biner yang lain. Kode prefiks biasanya direpresentasikan sebagai pohon biner yang diberikan nilai atau label. Untuk cabang kiri pada pohon biner diberi label 0, sedangkan pada cabang kanan pada pohon biner diberi label 1. Rangkaian bit yang terbentuk pada setiap lintasan dari akar ke daun merupakan kode prefiks untuk karakter yang berpadanan (Hanif, Irfan, 2004, hal: 3).


(45)

2.6.2 Kode Huffman

Huffman memberikan sebuah algoritma untuk memangun sebuah kode Huffman dengan masukan string teks S={s1,s2,…,sn} dan frekuensi kemunculan karakter

F={f1,f2,…,fn}, dihasilkan keluaran berupa kode string biner C={c1,c2,…,cn} atau

disebut kode Huffman (Liliana et al, 2003, hal:4).

Algoritma Pemampatan Huffman:

1. Baca file text yang akan dimampatkan (file asal).

2. Hitung frekuensi dari setiap karakter yang ada. Jenis karakter dan frekuensinya disimpan sebagai tree dalam sebuah list.

3. Selama list masih mempunyai node lebih dari satu maka

a. Urutkan list berdasarkan frekuensinya, secara ascending.

b. Buat tree baru, kaki kiri diisi dengan node pertama list dan kaki kanannya diisi dengan node kedua list. Karakter yang disimpan berupa “a“ dan frekuensinya merupakan jumlahan dari frekuensi kedua kakinya.

4. Sebelum hasil pemampatan disimpan dalam file hasil, maka simpan terlebih dahulu tree huffman nya. Pertama simpan jumlah karakter keseluruhan. Kemudian telusuri tree secara preorder, kaki kiri diberi kode “0“ dan kaki kanan diberi kode “1“. Setelah sampai pada leaf maka simpan karakter pada leaf tersebut baru kemudian simpan deretan kode yang dihasilkan. Setiap kode disimpan dengan dibatasi “a“. Setelah tree selesai disimpan, untuk membatasi penyimpanan tree dengan hasil kompresi, disisipkan “A“.

5. Telusuri tree secara preorder, kaki kiri diberi kode “0“ dan kaki kanan diberi kode “1“. Setelah sampai pada leaf maka deretan kode yang didapat digunakan untuk mengkodekan karakter pada leaf tersebut. Setelah penelusuran selesai maka akan didapat daftar karakter dan kode binernya.

6. Baca setiap karakter pada file asal. Ubah menjadi kode biner. Setelah semua dikodekan, setiap 8 kode dicari desimalnya (ASCII) kemudian simpan kembali sebagai karakter baru.


(46)

Tabel karakter-karakter yang diurutkan berdasarkan frekuensi kemunculan karakter tersebut berhubungan dengan distribusi probabilitas atau distribusi peluang. Distribusi probabilitas ini berhubungan pada kemungkinan penempatan akar atau subpohon baru yang telah terbentuk. Probabilitas untuk masing-masing karakter adalah frekuensi karakter tersebut dibagi jumlah frekuensi keseluruhan.

Untuk proses penirmampatan (decompression) merupakan kebalikan dari proses pemampatan (compression), Decompression berarti menyusun kembali data dari string biner menjadi sebuah karakter kembali. Decompression dapat dilakukan dengan dua cara, yang pertama dengan menggunakan tabel dan yang kedua dengan menggunakan algoritma penirmampatan (decompression).

Algoritma penirmampatan

1. Baca sebuah bit dari string biner. 2. Mulai dari akar

3. Untuk setiap bit pada langkah 1, lakukan traversal pada cabang yang bersesuaian.

4. Ulangi langkah 1, 2 dan 3 sampai bertemu daun. Kodekan rangkaian bit yang telah dibaca dengan karakter di daun.

5. Ulangi dari langkah 1 sampai semua bit di dalam string habis.

Contoh 2.1

Diberikan string “piagam penghargaan” sebagai masukan pada pemampatan file teks. Masukan ini terdiri dari karakter-karakter abjad S={p, i, a, g, m, e, n, h, r, spasi} dengan frekuensi kemunculan karakter F={2, 1, 5, 3, 1, 1, 2, 1, 1, 1}. Apabila string tersebut menggunakan koe ASCII untuk mengkodekan setiap karakter, maka representasi 18 karakter membutuhkan 18 x 8 = 144 bit atau 18 bytes. Untuk meminimumkan jumlah bit yang dibutuhkan, panjang kode untuk setiap karakter sedapat mungkin diperpendek, terutama untuk setiap karakter yang frekuensi kemunculannya besar. Jadi, bagaimana memperoleh jumlah minimum bit apabila digunakan algoritma Huffman untuk menghasilkan kode yang merepresentasikan setiap karakter.


(47)

Dengan menggunakan algoritma Huffman untuk mengkodekan setiap karakter dapat diperoleh kode Huffman sebagai berikut :

Masukan : 18 karakter yang telah diurutkan dan table frekuensi Keluaran : Kode Huffman

1. Pengurutan karakter berdasarkan frekuensi kemunculannya. Karakter pada data diurutkan di dalam tabel secara menaik (ascending order).

Tabel 2.1 Frekuensi Kemunculan Karakter yang Telah Diurutkan

Karakter Frekuensi

spasi 1

r 1

h 1

e 1

m 1

i 1

p 2

n 2

g 3

a 5

Jumlah 18

2. Pembentukan pohon Huffman

Setiap karakter digambarkan sebagai daun. Gabungkan dua daun yang mempunyai frekuensi kemunculan karakter paling kecil untuk membentuk sebuah akar kemudian akar diurutkan kembali. Akar merupakan jumlah frekuensi dua daun atau subpohon penyusunnya. Iterasi ini dilakukan hingga terbentuk satu buah pohon biner. Beri label 0 dan 1 pada setiap sisi pohon biner. Sisi kiri diberi label 0 dan sisi kanan diberi label 1.


(48)

Pengurutan kembali akar yang baru terbentuk berhubungan dengan distribusi probabilitas. Pada contoh ini, ada lebih dari satu kemungkinan tempat yang tersedia pada penggabungan karakter “spasi” dan “r” dengan frekuensi 2. Untuk mencegah penggabungan akar baru terlalu cepat maka akar ditempatkan pada posisi terendah. Jadi, akar baru “spasi” dan “r” ditempatkan sesudah karakter “a”.

Pembentukan pohon biner dari string “piagam penghargaan” adalah :

h=1 e=1 m=1 i=1

p=2 n=2

g=3 a=5 2

spasi=1 r=1 7.

2 2

4

8 4

8

h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 1.

h=1 e=1

m=1 i=1 p=2 n=2 g=3 a=5 2

spasi=1 r=1

2. 2

h=1 e=1 m=1 i=1

p=2 n=2 g=3 a=5 2

spasi=1 r=1

3. 2 2

h=1 e=1

m=1 i=1 p=2 n=2

g=3 a=5 2

spasi=1 r=1

4. 2 2 4

h=1 e=1

m=1 i=1 p=2 n=2 g=3 a=5

2 spasi=1 r=1

5. 2 2 4 8

h=1 e=1

m=1 i=1 2 p=2 n=2 g=3 a=5

spasi=1 r=1 6.

2


(49)

h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 8. 2 2 4 8 4 8 16 h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 9. 2 2 4 8 4 8 16 18 h=1 e=1 m=1 i=1 p=2 n=2 g=3 a=5 2 spasi=1 r=1 0 2 2 4 8 4 8 16 18 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

Gambar 2.3 Pembentukan Pohon Huffman

Keterangan gambar :

: akar yang dibentuk dari dua daun atau subpohon penyusunnya : daun yang terdiri dari karakter dan frekuensinya


(50)

3. Kode Huffman yang diperoleh dari pohon Huffman yang telah terbentuk adalah :

Tabel 2.2 Tabel Kode Huffman untuk Masing-Masing Karakter Karakter Frekuensi

(f)

Kode Huffman Panjang Kode ( shf )

Total Panjang ( f x shf )

Spasi 1 10110 5 5

r 1 10111 5 5

h 1 10100 5 5

e 1 10101 5 5

m 1 00 2 2

i 1 01 2 2

p 2 1000 4 8

n 2 1001 4 8

g 3 110 3 9

a 5 111 3 15

Total 18 34 64

Dengan demikian, jumlah bilangan bit yang dibutuhkan oleh algoritma Huffman untuk merepresentasikan string “piagam penghargaan” adalah 64 bit. String tersebut dimampatkan dengan rasio sebesar :

x 100% x 100%

= 44,4%

Dengan demikian string “piagam penghargaan” dimampatkan menjadi rangkaian bit : 1000011111101110010110100010101100111010100111101111101111111001

Untuk proses penirmampatan (decompression) atau menyusun kembali data dari kode biner menjadi sebuah string asli dapat digunakan tabel kode Huffman yang


(51)

telah terbentuk atau menggunakan algoritma penirmampatan. Pada proses penirmampatan, rangkaian bit biner

1000011111101110010110100010101100111010100111101111101111111001 Dimulai dengan membaca bit pertama yaitu “1”, tidak terdapat bit “1” pada tabel kode Huffman. Lalu baca bit berikutnya, sehingga menjadi “10”, tidak terdapat juga bit “10”, kemudian baca lagi bit berikutnya, sehingga menjadi “100”, tidak terdapat juga bit “100”, kemudian baca lagi bit berikutnya, sehingga menjadi “1000”. Rangkaian bit “1000” ini ditemukan pada tabel kode Huffman yaitu bit yang merepresentasikan karakter “p”. Proses ini terus dilakukan hingga tidak terdapat lagi bit biner.

2.7 Algoritma LZW (Lempel Ziv Welch)

Algoritma Lempel-Ziv-Welch (LZW) menggunakan teknik adaptif dan berbasiskan “kamus” Pendahulu LZW adalah LZ77 dan LZ78 yang dikembangkan oleh Jacob Ziv dan Abraham Lempel pada tahun 1977 dan 1978. Terry Welch mengembangkan teknik tersebut pada tahun 1984. LZW banyak dipergunakan pada UNIX, GIF, V.42 untuk modem ( Cormen et al, 2001).

Algoritma ini melakukan kompresi dengan menggunakan dictionary, di mana fragmen-fragmen teks digantikan dengan indeks yang diperoleh dari sebuah “kamus”. Prinsip sejenis juga digunakan dalam kode Braille, di mana kode-kode khusus digunakan untuk merepresentasikan kata-kata yang ada. Pendekatan ini bersifat

adaptif dan efektif karena banyak karakter dapat dikodekan dengan mengacu pada

string yang telah muncul sebelumnya dalam teks. Prinsip kompresi tercapai jika referensi dalam bentuk pointer dapat disimpan dalam jumlah bit yang lebih sedikit dibandingkan string aslinya (Dobb, 1989).

2.7.1 Kode LZW ( Lempel-Ziv-Welch )

Berikut yang akan dibahas pada subbab ini adalah algoritma pemampatan LZW . Algoritma pemampatan LZW :


(52)

1. Dictionary diinisialisasi dengan semua karakter dasar yang ada : {‘A’..’Z’,’a’..’z’,’0’..’9’}.

2. P = karakter pertama dalam stream karakter. 3. C = karakter berikutnya dalam stream karakter. 4. Apakah string (P + C) terdapat dalam dictionary ?

• Jika ya, maka P =P + C (gabungkan P dan C menjadi string baru). • Jika tidak, maka :

i. Output sebuah kode untuk menggantikan string P.

ii. Tambahkan string (P + C) ke dalam dictionary dan berikan nomor/kode berikutnya yang belum digunakan dalam dictionary untuk string tersebut. iii. P = C.

5. Apakah masih ada karakter berikutnya dalam stream karakter ? • Jika ya, maka kembali ke langkah 2.

• Jika tidak, maka output kode yang menggantikan string P, lalu terminasi proses (stop).

Isi dictionary pada awal proses diset dengan tiga karakter dasar yang ada. Kolom posisi menyatakan posisi sekarang dari stream karakter dan kolom karakter

menyatakan karakter yang terdapat pada posisi tersebut. Kolom dictionary

menyatakan string baru yang sudah ditambahkan ke dalam dictionary dan nomor indeks untuk string tersebut ditulis dalam kurung siku. Kolom output menyatakan kode output yang dihasilkan oleh langkah kompresi (Linawati et al, 2004, hal: 10).

Algoritma penirmampatan LZW :

1. Dictionary diinisialisasi dengan semua karakter dasar yang ada : {‘A’..’Z’,’a’..’z’,’0’..’9’}. 2. CW = kode pertama dari stream kode (menunjuk ke salah satu karakter dasar).

3. Lihat dictionary dan output string dari kode tersebut (string.CW) ke stream karakter. 4. PW = CW; CW = kode berikutnya dari stream kode.

5. Apakah string.CW terdapat dalam dictionary ? ฀Jika ada, maka :

i. output string.CW ke stream karakter ii. P = string.PW


(53)

iii. C = karakter pertama dari string.CW

iv. tambahkan string (P+C) ke dalam dictionary ฀Jika tidak, maka :

i. P = string.PW

ii. C = karakter pertama dari string.PW

iii. output string (P+C) ke stream karakter dan tambahkan string tersebut ke dalam dictionary (sekarang berkorespondensi dengan CW);

6. Apakah terdapat kode lagi di stream kode ? ฀Jika ya, maka kembali ke langkah 4. ฀Jika tidak, maka terminasi proses (stop). Contoh 2.2

String “ABBABABAC” akan dikompresi dengan LZW. Isi dictionary pada awal proses diset dengan tiga karakter dasar yang ada: “A”, “B”, dan “C”. Tahapan proses kompresi ditunjukkan pada Tabel di bawah ini.

Tabel 2.3 Proses Pemampatan LZW

Langkah Posisi Karakter Dictionary Output

1 1 A [4] A B [1]

2 2 B [5] B B [2]

3 3 B [6] B A [2]

4 4 A [7] A B A [4]

5 6 A [8] A B A C [7]

6 9 C --- [3]

Steam karakter: a b b ab aba c

Kode output : [1] [2] [2] [4] [7] [3]

Frasa baru yang 4 5 6 7 8 ditambahkan ke = = = = = dictionary ab bb ba aba abac


(54)

Proses penirmampatan pada LZW dilakukan dengan prinsip yang sama seperti proses kompresi. Pada awalnya, dictionary diinisialisasi dengan semua karakter dasar yang ada. Lalu pada setiap langkah, kode dibaca satu per satu dari stream kode, dikeluarkan string dari dictionary yang berkorespondensi dengan kode tersebut, dan ditambahkan string baru ke dalam dictionary. Tahapan proses dekompresi ini ditunjukkan pada Tabel di bawah ini (Linawati et al, 2004, hal: 11).

Tabel 2.4 Proses Penirmampatan LZW

Langkah Kode Output Dictionary

1 [1] A ---

2 [2] B [4] A B

3 [2] B [5] B B

4 [4] A B [6] B A

5 [7] A B A [7] A B A

6 [3] C [8] A B A C

Hasil Penirmampatan: A B B A B A B A C


(55)

BAB 4

IMPLEMENTASI DAN PENGUJIAN

4.1Lingkungan Implementasi

Implementasi perangkat lunak sistem pemampatan ini dilakukan dalam lingkungan berbasis Windows. Sistem operasi yang digunakan adalah Microsoft Windows XP.

4.2 Perangkat Keras yang Digunakan

Implementasi perangkat lunak dilakukan dengan menggunakan komputer yang memiliki spesifikasi perangkat keras sebagai berikut :

1. Prosesor Intel Core 2 Duo 1.73 GHz 2. RAM 1 GB

3. Harddisk 80 GB

4. Monitor LCD 14” dengan resolusi layar 1024 x 768 pixel

4.3 Perangkat Lunak yang Digunakan

Perangkat lunak yang digunakan untuk melakukan implementasi perangkat lunak adalah Visual C++ . Perangkat lunak ini dipilih karena memberikan kemudahan dalam pembuatan antarmuka grafis.


(56)

4.4 Implementasi Antar Muka

Untuk memudahkan penggunaannya, perangkat lunak sistem ini dilengkapi dengan antarmuka grafis, yang memiliki elemen-elemen sebagai berikut :

1. Tampilan Halaman Utama

Tampilan utama menampilkan menu run untuk memilih algoritma yang akan kita gunakan untuk melakukan pemampatan dan penirmampatan teks, serta menu exit untuk keluar dari aplikasi.

Gambar 4.1 Tampilan Halaman Utama

2. Tampilan Halaman Hasil

Halaman hasil menampilkan kotak teks untuk masukan file asli, file yang akan dimampatkan dan file yang akan dinirmampatkan. Masukan tidak dapat diketikkan langsung pada kotak teks, melainkan harus dipilih dengan menggunakan dialog yang dibuka dengan mengklik tombol “Browse” yang terletak disamping kotak teks yang ingin diisi. Masukan untuk original file

adalah nama file asli berupa ekstensi file (*.txt), (*.doc), (*.rtf) dan (*.htm). Masukan untuk compress file adalah nama file yang akan dimampatkan dan berkestensikan (*.huff) atau (*.lzw). Masukan untuk Decompress To File


(57)

adalah nama file yang telah dinirmampatkan dan berekstensikan (*.huff.file asli) atau (*.lzw.file asli). Dan tampilan informasi yang berisikan source size

yang merupakan ukuran file asli dalam satuan byte, destination size yang merupakan ukuran file yang telah dimampatkan atau dinirmampatkan dalam satuan byte, ratio yang merupakan persentasi file yang telah dimampatkan atau dinirmampatkan dengan simbol %, time spent yang merupakan waktu yang dibutuhkan untuk melakukan pemampatan atau penirmampatan teks dalam satuan second. Dan tampilan informasi ini juga menampilkan kotak teks yang akan terisi secara otomatis apabila kita mengklik tombol “compress” atau “decompress”. Sedangkan tampilan tombol “compress” adalah tombol yang akan melakukan proses pemampatan data teks dan tampilan tombol “decompress” adalah tombol yang akan melakukan proses penirmampatan data teks.


(58)

Gambar 4.3 Pemampatan File Teks dengan Algoritma Huffman


(59)

Gambar 4.5 Pemampatan File Teks dengan Algoritma LZW


(60)

File yang telah dimampatkan dapat dikembalikan seperti file semula atau file asal dengan melakukan proses penirmampatan atau mengembalikan file hasil pemampatan menjadi file asal.

4.5 Pengujian Sistem Kompresi Teks Sederhana

Pengujian adalah elemen kritis dari jaminan kualitas perangkat lunak dan merepresentasikan kajian pokok dari spesifikasi, desain, dan pengkodean. Pentingnya pengujian perangkat lunak dan implikasinya yang mengacu pada kualitas perangkat lunak tidak dapat terlalu ditekan karena melibatkan sederetan aktivitas produksi di mana peluang terjadinya kesalahan manusia sangat besar dan arena ketidakmampuan manusia untuk melakukan dan berkomunikasi dengan sempurna maka pengembangan perangkat lunak diiringi dengan aktivitas jaminan kualitas.

Sasaran utama dalam pengujian adalah untuk mendapatkan serangkaian pengujian yang memiliki kemungkinan tertinggi di dalam pengungkapan kesalahan pada perangkat lunak. Dalam penelitian ini penulis menggunakan teknik pengujian

black box.

Teknik pengujian black-box berfokus pada domain informasi dari perangkat lunak, dengan melakukan test case dengan mempartisi domain input dari suatu program dengan cara yang memberikan cakupan pengujian yang mendalam.

Test case dilakukan dengan memberikan suatu atau seperangkat input dan harapan akan hasil tertentu. Atau mungkin saja test case terdiri atas urutan langkah tertentu dengan suatu hasil. Langkah, input dan output yang diharapkan dapat kita tulis dalam suatu dokumen. Dokumen ini juga perlu menyimpan hasil yang didapatkan (Shodiq, Amri, 2007). Berikut hasil pengujian sistem yang ditunjukkan dalam tabel 4.1.


(61)

Tabel 4.1 Hasil Pengujian Sistem No Test case Input Output yang

diharapkan

Output yang

didapatkan Cek 1 Menu Run Pilih Algoritma yang akan

digunakan

Algoritma yang terpilih

Algoritma yang

terpilih OK

2 Browse Original File

File teks asli

(*.htm), (*.doc), (*.rtf), (*.txt)

File teks asli File teks asli OK

3 Browse

Compress File File yang dimampatkan (*.huff), (*.lzw) File yang dimampatkan File yang

dimampatkan OK

4 Browse

Decompress File File yang dinirmampatkan (*.huff.file_asli), (*.lzw.file_asli) File yang dinirmampatkan File yang

dinirmampatkan OK

5 Compress Button File yang akan dimampatkan Informasi File yang dimampatkan Informasi File yang dimampatkan OK

6 Decompress Button

File yang akan dinirmampatkan Informasi File yang dinirmampatkan Informasi File yang dinirmampatkan OK

Setelah algoritma Huffman dan algoritma LZW diimplementasikan ke dalam bahasa pemrograman, 16 tipe file teks diuji untuk dilakukan proses pemampatan. Program diuji pada file teks (*.txt), file dokumen (*.doc dan *.rtf) dan file HTML (*.htm) dimana masing-masing tipe file dengan ukuran yang berbeda-beda. Dari pengujian tersebut diperoleh ukuran file hasil pemampatan, rasio dan waktu yang dibutuhkan selama proses komputasi. Hasil-hasil pengujian yang diperoleh akan digunakan untuk membandingkan kinerja ke dua algoritma.

4.5.1 Analisis Ukuran File

Pengujian terhadap 16 file teks berdasarkan ukuran file terhadap aplikasi pemampatan dilakukan untuk mengetahui seberapa besar pengaruh faktor ukuran berkas terhadap rasio pemampatan. Untuk melakukan pengujian, dipilih sejumlah file dengan ukuran dan tipe file teks yang berbeda-beda, kemudian dilakukan proses pemampatan dan hasil analisisnya ditampilkan dalam bentuk tabel dan grafik.


(1)

int nBitsPerSample = *(pSrc+sizeof(DWORD)); pDes = (BYTE*)malloc(nDesLen+1);

*pDes = *(pSrc+sizeof(DWORD)+1);

int nMaxSamples = 1 << nBitsPerSample;

int nSample, nSrcIndex = ((sizeof(DWORD)+1)<<3) + nBitsPerSample;

vector<CBuffer *> dictionary;

CBuffer node(pDes, 2), *pNodeSample;

int nDesIndex = 1, nDesIndexSave = 0, nSampleLen; while(nDesIndex < nDesLen)

{

nSample = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7) & (nMaxSamples-1);

nSrcIndex += nBitsPerSample;

if(dictionary.size() == nMaxSamples-256) ClearDictionary(dictionary);

if(nSample >= 256)

if(nSample-256 < (int)dictionary.size()) {

nDesIndexSave = nDesIndex;

pNodeSample = dictionary.at(nSample-256); nSampleLen = pNodeSample->m_nLength+1; memcpy(pDes+nDesIndex, pNodeSample->m_pBuffer, pNodeSample->m_nLength); nDesIndex += pNodeSample->m_nLength; }

else {

nSampleLen = nDesIndex-nDesIndexSave+2; memcpy(pDes+nDesIndex, pDes+nDesIndexSave, nDesIndex-nDesIndexSave);

nDesIndex += nDesIndex-nDesIndexSave;

*(pDes+nDesIndex++) = *(pDes+nDesIndexSave); nDesIndexSave += nSampleLen-2;

} else

nDesIndexSave = nDesIndex, *(pDes+nDesIndex++) = (BYTE)nSample, nSampleLen = 2;

dictionary.push_back(new CBuffer(node)); node.m_pBuffer += node.m_nLength-1; node.m_nLength = nSampleLen;

}

ClearDictionary(dictionary); return true;


(2)

lzw_dialog.cpp

#include "stdafx.h" #include "mfc3.h"

#include "lzw_dialog.h" #include ".\lzw_dialog.h" #include "LZW.h"

#include "String.h" #include <fcntl.h> #include <sys/stat.h> #include <io.h>

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

IMPLEMENT_DYNAMIC(lzw_dialog, CDialog) lzw_dialog::lzw_dialog(CWnd* pParent)

: CDialog(lzw_dialog::IDD, pParent) {

m_nBitsPerSample=12; }

lzw_dialog::~lzw_dialog() {

}

long filesize(LPCSTR input) {

FILE * pFile; long size;

char * file = (char *) input; pFile = fopen (file,"rb"); fseek (pFile, 0, SEEK_END); size=ftell(pFile);

fclose (pFile);

return size; }

void lzw_dialog::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT1, m_strPTFile); DDX_Text(pDX, IDC_EDIT2, m_strCTFile); DDX_Text(pDX, IDC_EDIT4, m_strDPTFile); }


(3)

BEGIN_MESSAGE_MAP(lzw_dialog, CDialog)

ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4) END_MESSAGE_MAP()

void lzw_dialog::Compress(LPCSTR lpcsSrcFile, LPCSTR lpcsDesFile, bool bCompress, int nBitsPerSample = 12)

{

int nFile = _open(lpcsSrcFile, _O_RDONLY|_O_BINARY, 0); int nFileLength = _filelength(nFile);

BYTE *pFileBuffer = new BYTE[nFileLength]; _read(nFile, pFileBuffer, nFileLength); _close(nFile);

BYTE *pDes; int nDesLen;

DWORD dw = ::GetTickCount(); if(bCompress)

CompressLZW(pFileBuffer, nFileLength, pDes, nDesLen, nBitsPerSample);

else

DecompressLZW(pFileBuffer, nFileLength, pDes, nDesLen); dw = ::GetTickCount() - dw;

float time = (float)dw / 1000.00; delete pFileBuffer;

_unlink(lpcsDesFile);

nFile = _open(lpcsDesFile, _O_CREAT|_O_BINARY|_O_WRONLY, _S_IREAD|_S_IWRITE);

_write(nFile, pDes, nDesLen); _close(nFile);

free(pDes);

long src_size = filesize(lpcsSrcFile); long dst_size = filesize(lpcsDesFile); CString str;

str.Format("%d byte", src_size);

CWnd* editSourceSize = GetDlgItem(IDC_EDIT5); editSourceSize->SetWindowText(str);

str.Format("%d byte", dst_size);

CWnd* editDestSize = GetDlgItem(IDC_EDIT6); editDestSize->SetWindowText(str);

double ratio = ((double)dst_size / (double)src_size) * 100.00; str.Format("%.2f %", ratio);

CWnd* editRatio = GetDlgItem(IDC_EDIT7); editRatio->SetWindowText(str);


(4)

str.Format("%f s", time);

CWnd* editTime = GetDlgItem(IDC_EDIT8); editTime->SetWindowText(str);

}

void lzw_dialog::OnBnClickedButton1() {

UpdateData(TRUE);

CFileDialog dlg(TRUE, "", m_strPTFile, OFN_EXPLORER, "All Files (*.*) | *.*; ||", this);

dlg.m_ofn.lpstrTitle = "Choose file to be enCompressed"; if(dlg.DoModal() != IDOK)

return;

m_strPTFile = dlg.GetPathName(); this->

UpdateData(FALSE); }

void lzw_dialog::OnBnClickedButton3() {

UpdateData(TRUE);

CFileDialog dlg(FALSE, "", m_strCTFile, OFN_EXPLORER, "All Files (*.*) | *.*; ||", this);

dlg.m_ofn.lpstrTitle = "Choose file to be decompressed"; if(dlg.DoModal() != IDOK)

return;

m_strCTFile = dlg.GetPathName(); UpdateData(FALSE);

}

void lzw_dialog::OnBnClickedButton2() {

UpdateData(TRUE);

Compress(m_strPTFile, m_strCTFile, true, m_nBitsPerSample+12); }

void lzw_dialog::OnBnClickedButton5() {

}

void lzw_dialog::OnBnClickedButton6() {

UpdateData(TRUE);

CFileDialog dlg(FALSE, "", m_strDPTFile, OFN_EXPLORER, "All Files (*.*) | *.*; ||", this);

dlg.m_ofn.lpstrTitle = "Choose decompressed file"; if(dlg.DoModal() != IDOK)

return;

m_strDPTFile = dlg.GetPathName(); UpdateData(FALSE);

}


(5)

{

UpdateData(TRUE);

Compress(m_strCTFile, m_strDPTFile, false); }

MainFrm.cpp

#include "stdafx.h" #include "mfc3.h" #include "MainFrm.h" #ifdef _DEBUG

#define new DEBUG_NEW #endif

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_WM_CREATE() END_MESSAGE_MAP()

static UINT indicators[] = {

ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };

CMainFrame::CMainFrame() {

}

CMainFrame::~CMainFrame() {

}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {

if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

return 0; }

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {

cs.style &= ~FWS_ADDTOTITLE;


(6)

if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;

return TRUE; }

#ifdef _DEBUG

void CMainFrame::AssertValid() const {

CFrameWnd::AssertValid(); }

void CMainFrame::Dump(CDumpContext& dc) const {

CFrameWnd::Dump(dc); }