• Tidak ada hasil yang ditemukan

STUDI PERBANDINGAN KINERJA ALGORITMA KOMPRESI LEMPEL ZIV 77, LEMPEL ZIV 78 DAN LEMPEL ZIV WELCH PADA FILE TEXT SKRIPSI ANDRE PRATAMA

N/A
N/A
Protected

Academic year: 2021

Membagikan "STUDI PERBANDINGAN KINERJA ALGORITMA KOMPRESI LEMPEL ZIV 77, LEMPEL ZIV 78 DAN LEMPEL ZIV WELCH PADA FILE TEXT SKRIPSI ANDRE PRATAMA"

Copied!
130
0
0

Teks penuh

(1)

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

STUDI PERBANDINGAN KINERJA ALGORITMA KOMPRESI

LEMPEL ZIV 77, LEMPEL ZIV 78

DAN LEMPEL ZIV WELCH

PADA FILE TEXT

SKRIPSI

ANDRE PRATAMA

051401030

PROGRAM STUDI S1 ILMU KOMPUTER

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

UNIVERSITAS SUMATERA UTARA

MEDAN

2009

(2)

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

STUDI PERBANDINGAN KINERJA ALGORITMA KOMPRESI LEMPEL ZIV 77, LEMPEL ZIV 78

DAN LEMPEL ZIV WELCH PADA FILE TEXT

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar Sarjana Komput er

ANDRE PRATAMA 051401030

PROGRAM STUDI S1 ILMU KOMPUTER DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA

MEDAN 2009

(3)

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

ii PERSETUJUAN

Judul : STUDI PERBANDINGAN KINERJA ALGORITMA

KOMPRESI LEMPEL ZIV 77, LEMPEL ZIV 78 DAN LEMPEL ZIV WELCH PADA FILE TEXT

Kategori : SKRIPSI

Nama : ANDRE PRATAMA

Nomor Induk Mahasiswa : 051401030

Program Studi : SARJANA (S1) ILMU KOMPUTER

Departemen : ILMU KOMPUTER

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN

ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Diluluskan di

Medan, 17 November 2009 Komisi Pembimbing :

Pembimbing 2 Pembimbing 1

Syahril Efendi, S.Si, MIT Syahriol Sitorus, S.Si, MIT NIP. 196711101996021001 NIP. 197103101997031004

Diketahui/Disetujui oleh

Program Studi S1 Ilmu Komputer Ketua,

Prof. Dr. Muhammad Zarlis NIP. 195707011986011003

(4)

STUDI PERBANDINGAN KINERJA ALGORITMA KOMPRESI LEMPEL ZIV 77, LEMPEL ZIV 78

DAN LEMPEL ZIV WELCH PADA FILE TEXT

SKRIPSI

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

Medan, 17 November 2009

Andre Pratama 051401030

(5)

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

iv PENGHARGAAN

Alhamdulillah, puji syukur saya sampaikan kehadirat Allah SWT, yang telah memberikan rahmat dan hidayah-Nya serta segala sesuatunya dalam hidup, sehingga saya dapat menyelesaikan penyusunan skripsi ini, sebagai syarat untuk memperoleh gelar Sarjana Komputer, Program Studi S1 Ilmu Komputer Universitas Sumatera Utara. Shalawat beriring salam saya persembahkan kepada Nabi Besar Muhammad SAW.

Ucapan terima kasih saya sampaikan kepada bapak Syahriol Sitorus, S.Si, MIT sebagai Dosen Pembimbing I dan Bapak Syahril Efendi, S.Si, MIT sebagai Dosen Pembimbing II yang telah memberikan bimbingan, saran, dan masukan kepada saya untuk menyempurnakan kajian ini. Panduan ringkas, padat dan profesional telah diberikan kepada saya sehingga saya dapat menyelesaikan tugas ini. Selanjutnya kepada Dosen Penguji Bapak Prof. Dr. Muhammad Zarlis dan Ibu Maya Silvi Lydia, B.Sc.,M.Sc atas saran dan kritikan yang sangat berguna bagi saya. Ucapan terima kasih juga ditujukan kepada Ketua dan Sekretaris Program Studi S1 Ilmu Komputer, Bapak Prof. Dr. Muhammad Zarlis dan Bapak Syariol Sitorus, S.Si,MIT, Dekan dan Pembantu Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Sumatera Utara, semua dosen serta pegawai di Program Studi S1 Ilmu Komputer FMIPA USU.

Skripsi ini terutama saya persembahkan untuk kedua orang tua dan keluarga saya yang telah memberikan dukungan dan motivasi, ayahanda Alfi Syahrir dan ibunda Maryati yang selalu sabar dalam mendidik saya. Untuk kedua adik saya, Friska Lestari dan Velya Ramadhani yang selalu memberikan dorongan kepada saya selama menyelesaikan skripsi ini. Kepada teman-teman terbaik yang selalu memberikan dukungan, Qori Mutia, Jerry Rahmat, Sarmedi Sitohang, Muhammad Andri, Lipantri Mashur Gultom, Hery Wibowo, Silvina Irwanti, Fadlan, Zulkarnain Lubis, dan Muhammad Husli Khairi. Untuk teman-teman sekelas dan satu angkatan yang sedang berjuang tanpa patah semangat dan tiada pupus harapan. Terima kasih pula kepada semua pihak-pihak yang tidak dapat saya sebutkan satu persatu, terima kasih atas ide, saran, dan kerjasama yang baik.

Saya menyadari bahwa skripsi ini masih jauh dari kesempurnaan, oleh karena itu saya menerima saran dan kritik yang bersifat membangun demi kesempurnaan skripsi ini. Sehingga dapat bermanfaat bagi kita semuanya.

(6)

ABSTRAK

Meningkatnya penggunaan komputer dalam kegiatan sehari-hari, secara tidak langsung juga membuat kebutuhan akan penyimpanan data semakin meningkat. Semakin besar data, semakin besar ruang yang dibutuhkan dan semakin lama waktu yang diperlukan untuk mengirimkan data. Untuk mengatasinya, telah dikembangkan berbagai algoritma kompresi yang digunakan untuk memampatkan data. Diantaranya, terdapat 3 algoritma kompresi yang menggunakan metoda dictionary : LZ77, LZ78 dan LZW. Ketiga algoritma dibandingkan untuk mengetahui algoritma mana yang memiliki kinerja tertinggi dalam memampatkan file text. Parameter kinerja diukur dari kompleksitas algoritma, rasio kompresi, dan berapa lama waktu yang diperlukan untuk proses kompresi. File yang diuji meliputi *.txt, *.doc, *.rtf, dan *.html. Setelah dianalisis dan diimplementasikan ke dalam program PHP, diperoleh bahwa algoritma LZ77 memiliki kompleksitas tertinggi. Algoritma LZW unggul dalam rasio kompresi file *.txt. Untuk file *.doc, *.rtf, dan *.html rasio kompresi terbaik diperoleh algoritma LZ77, tetapi algoritma LZ77 memerlukan waktu paling lama untuk hampir semua file uji.

(7)

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

vi

STUDY OF PERFORMANCE COMPARISON LEMPEL ZIV 77, LEMPEL ZIV 78 AND LEMPEL ZIV WELCH

COMPRESSION ALGORITHM ON TEXT FILE

ABSTRACT

The increasing use of computers in daily activities, indirectly also makes the need for increased data storage. The bigger the data, the greater the space required and the longer time required to transmit data. To overcome this problem, has been developed a variety of compression algorithm used to compress the data. Among them, there are 3 compression algorithm that uses dictionary method: LZ77, LZ78 and LZW. All three algorithms is compared to determine which algorithm has the highest performance to compress text file. Performance is measured by complexity of the algorithm, compression ratio, and how much time is needed in compression process. Files that are tested include *. txt, *. doc, *. rtf, and *. html. Having analyzed and implemented into a PHP program, LZ77 algorithm has the highest complexity. LZW algorithm has the best compression ratio in *. txt files. For *. doc, *. rtf, and *. html file, the best compression ratio is obtained by LZ77 algorithm, but the LZ77 algorithm takes the longest time for almost all test files.

(8)

DAFTAR ISI Halaman Persetujuan ii Pernyataan iii Penghargaan iv Abstrak v Abstract vi

Daftar Isi vii

Daftar Tabel ix Daftar Gambar xi Bab 1 Pendahuluan 1 1.1 Latar Belakang 1 1.2 Rumusan Masalah 2 1.3 Batasan Masalah 2 1.4 Tujuan Penelitian 2 1.5 Manfaat Penelitian 3 1.6 Diagram Konsepsi 3 1.7 Metodologi Penelitian 4 1.8 Sistematika Penulisan 5

Bab 2 Landasan Teori 6

2.1 Definisi dan Klasifikasi Algoritma Kompresi Data 6

2.2 Algoritma Lempel Ziv 77 8

2.3 Algoritma Lempel Ziv 78 11

2.4 Algoritma Lempel Ziv Welch 14

2.5 Kompleksitas Algoritma dan Notasi O-besar (big O) 16

Bab 3 Perancangan Sistem 24

3.1 Perancangan Fungsi 24

3.1.1 Perancangan Fungsi Dasar 24

3.1.1.1 Fungsi Konversi Bilangan Desimal ke Bilangan Biner 25 3.1.1.2 Fungsi Konversi Bilangan Biner ke Bilangan Desimal 26

3.1.1.3 Fungsi Pemotongan String 27

3.1.1.4 Fungsi Zero Left Pad 27

3.1.1.5 Fungsi Zero Right Pad 28

3.1.2 Perancangan Fungsi Khusus 29

3.1.2.1 Fungsi Bit Stream to String 29

3.1.2.2 Fungsi String to Bit Stream 31

3.2 Perancangan Algoritma Kompresi 32

3.2.1 Algoritma LZ77 32 3.2.1.1 Algoritma LZ77 Encoding 34 3.2.1.2 Algoritma LZ77 Decoding 40 3.2.2 Algoritma LZ78 44 3.2.2.1 Algoritma LZ78 Encoding 46 3.2.2.2 Algoritma LZ78 Decoding 51 3.2.3 Algoritma LZW 55

(9)

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

viii

Algoritma LZW Encoding 57

3.2.3.2 Algoritma LZW Decoding 62

3.3 Pengukuran Kecepatan Algoritma 66

3.4 Pengukuran Rasio Kompresi 68

3.5 Perancangan Aplikasi 68

3.5.1 Data Flow Diagram dan Kamus Data 68

3.5.1.1 Data Flow Diagram Proses Kompresi 69 3.5.1.2 Data Flow Diagram Proses Dekompresi 71

3.5.1.3 Kamus Data 73

3.5.2 Perancangan Interface 74

3.6 Implementasi Sistem 81

3.6.1 Halaman Home 81

3.6.2 Halaman Upload File Kompresi 82

3.6.3 Halaman Pilih Algoritma Kompresi 83

3.6.4 Halaman Pengaturan Parameter Kompresi LZ77 83 3.6 5 Halaman Pengaturan Parameter Kompresi LZ78 86

3.6.6 Halaman Bandingkan Algoritma 87

3.6.7 Halaman Upload File Dekompresi 89

3.6.8 Halaman Pengaturan Parameter Dekompresi 89

Bab 4 Analisa dan Pengujian Sistem 91

4.1 Analisa Perbandingan Kompleksitas Algoritma 91

4.1.1 Kompleksitas Proses Kompresi 91

4.1.2 Kompleksitas Proses Dekompresi 92

4.2 Pengujian Implementasi Algoritma dan Analisa Hasil 93

4.2.1 Perangkat Pengujian 94

4.2.2 File Pengujian 94

4.2.3 Pengujian Parameter Algoritma 97

4.2.3.1 Pengujian Parameter Algoritma LZ77 97 4.2.3.2 Pengujian Parameter Algoritma LZ78 100 4.2.3.3 Pengujian Parameter Algoritma LZW 101

4.2.4 Pengujian Algoritma 103

4.2.4.1 Pengujian File Plain Text ASCII (*.txt) 103 4.2.4.2 Pengujian File Microsoft Word Document (*.doc) 105 4.2.4.3 Pengujian File Rich Text Format (*.rtf) 108 4.2.4.4 Pengujian File hipertext markup language (*.htm/*.html) 110

Bab 5 Kesimpulan dan Saran 114

5.1 Kesimpulan 114

5.2 Saran 115

(10)

DAFTAR TABEL

Halaman

Tabel 2.1 Algoritma Dasar LZ77 Encoding 9

Tabel 2.2 Algoritma Dasar LZ77 Decoding 11

Tabel 2.3 Contoh Cara Kerja Algoritma LZ78 12

Tabel 2.4 Algoritma Dasar LZ78 Encoding 13

Tabel 2.5 Algoritma Dasar LZ78 Decoding 13

Tabel 2.6 Algoritma Dasar LZW Encoding 14

Tabel 2.7 Contoh Cara Kerja Algoritma LZW 15

Tabel 2.8 Algoritma Dasar LZW Decoding 16

Tabel 2.9 Perbandingan Pertumbuhan Kompleksitas (Growth Rates) 17

Tabel 2.10 Algoritma Konversi Suhu 19

Tabel 2.11 Algoritma Bilangan Ganjil atau Genap 20

Tabel 2.12 Algoritma Perulangan Sederhana 20

Tabel 2.13 Algoritma Perulangan Sederhana 20

Tabel 2.14 Perbandingan Pertumbuhan Kompleksitas 22 Tabel 3.1 Algoritma Fungsi Konversi Bilangan Desimal ke Bilangan Biner 25 Tabel 3.2 Algoritma Fungsi Konversi Bilangan Biner ke Bilangan Desimal 26

Tabel 3.3 Algoritma Fungsi Pemotongan String 27

Tabel 3.4 Algoritma Fungsi Zero Left Pad 28

Tabel 3.5 Algoritma Fungsi Zero Right Pad 29

Tabel 3.6 Algoritma Fungsi Bit stream to String 30 Tabel 3.7 Algoritma Fungsi String to Bit Stream 31

Tabel 3.8 Algoritma LZ77 Encoding 35

Tabel 3.9 Algoritma LZ77 Decoding 41

Tabel 3.10 Algoritma Fungsi Dalam Array LZ78 47

Tabel 3.11 Algoritma Fungsi Cari Array LZ78 47

Tabel 3.12 Algoritma LZ78 Encoding 48

Tabel 3.13 Algoritma LZ78 Decoding 53

Tabel 3.14 Algoritma Dalam Array LZW 57

Tabel 3.15 Algoritma Cari Array LZW 58

Tabel 3.16 Algoritma LZW Encoding 60

Tabel 3.17 Algoritma LZW Decoding 64

Tabel 3.18 Spesifikasi Proses DFD Kompresi Level 0 69 Tabel 3.19 Spesifikasi Proses DFD Kompresi Level 1 70 Tabel 3.20 Spesifikasi Proses DFD Dekompresi Level 0 71 Tabel 3.21 Spesifikasi Proses DFD Dekompresi Level 0 72

Tabel 3.22 Kamus Data 73

Tabel 4.1 Perbandinga n Kompleksitas Kompresi 1 91 Tabel 4.2 Perbandinga n Kompleksitas Kompresi 2 92 Tabel 4.3 Perbandingan Kompleksitas Dekompresi 1 92 Tabel 4.4 Perbandingan Kompleksitas Dekompresi 2 93

Tabel 4.5 File Uji Plain Text ASCII 95

(11)

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

x

Tabel 4.7 File Uji Rich Text Format 96

Tabel 4.8 File Uji Hipertext Markup Language 96

Tabel 4.9 Hasil Pengujian Parameter Algoritma LZ77 98 Tabel 4.10 Hasil Pengujian Parameter Algoritma LZ78 100 Tabel 4.11 Hasil Pengujian Parameter Algoritma LZW 101

Tabel 4.12 Rasio Kompresi File *.txt 103

Tabel 4.13 Lama Proses File *.txt 104

Tabel 4.14 Rasio Kompresi File *.doc 106

Tabel 4.15 Lama Proses File *.doc 107

Tabel 4.16 Rasio Kompresi File *.rtf 108

Tabel 4.17 Lama Proses File *.rtf 109

Tabel 4.18 Rasio Kompresi File *.htm/*.html 111

(12)

DAFTAR GAMBAR

Halaman

Gambar 1.1 Diagram Konsepsi 3

Gambar 2.1 Contoh Cara Kerja Algoritma LZ77 Bagian 1 10 Gambar 2.2 Contoh Cara Kerja Algoritma LZ77 Bagian 2 10 Gambar 2.3 Urutan Spektrum Kompleksitas Waktu Algoritma 23 Gambar 2.4 Grafik Perbandingan Pertumbuhan Kompleksitas 23 Gambar 3.1 Konversi token ke bit stream algoritma LZ77 33 Gambar 3.2 Konversi bit stream ke token algoritma LZ77 33

Gambar 3.3 Flowchart Algoritma LZ77 Encoding 34

Gambar 3.4 Proses Pencarian Pola Karakter LZ77 38

Gambar 3.5 Flowchart Algoritma LZ77 Decoding 41

Gambar 3.6 Proses Decoding Token Algoritma LZ77 43 Gambar 3.7 Konversi Token Ke Bit Stream Algoritma LZ78 45 Gambar 3.8 Konversi bit stream ke token algoritma LZ78 45

Gambar 3.9 Flowchart Algoritma LZ78 Encoding 46

Gambar 3.10 Flowchart Algoritma LZ78 Decoding 52 Gambar 3.11 Konversi Token Ke Bit Stream Algoritma LZW 56 Gambar 3.12 Konversi Bit Stream Ke Token Algoritma LZW 56

Gambar 3.13 Flowchart Algoritma LZW Encoding 59

Gambar 3.14 Flowchart Algoritma LZW Decoding 63

Gambar 3.15 Pengukuran Kecepatan Algoritma 67

Gambar 3.16 Data Flow Diagram Proses Kompresi Level 0 69 Gambar 3.17 Data Flow Diagram Proses Kompresi Level 1 70 Gambar 3.18 Data Flow Diagram Proses Dekompresi Level 0 71 Gambar 3.19 Data Flow Diagram Proses Dekompresi Level 1 72 Gambar 3.20 Struktur Perancangan Halaman Website 74

Gambar 3.21 Tampilan Rancangan Halaman Home 75

Gambar 3.22 Tampilan Rancangan Halaman Upload File Source Kompresi 76 Gambar 3.23 Tampilan Rancangan Halaman Pilih Algoritma Kompresi 76 Gambar 3.24 Tampilan Rancangan Halaman Pengaturan Parameter Algoritma 78 Gambar 3.25 Tampilan Rancangan Halaman Upload File Dekompresi 79 Gambar 3.26 Tampilan Rancangan Halaman Pengaturan Parameter Dekompresi 80

Gambar 3.27 Tampilan Halaman Home 82

Gambar 3.28 Tampilan Halaman Upload File Kompresi 82 Gambar 3.29 Tampilan Halaman Pilih Algoritma Kompresi 83 Gambar 3.30 Tampilan Halaman Pengaturan Parameter Kompresi LZ77 84

Gambar 3.31 Tampilan Hasil Kompresi LZ77 85

Gambar 3.32 Tampilan Halaman Pengaturan Parameter Kompresi LZ78 86

Gambar 3.33 Tampilan Hasil Kompresi LZ78 87

Gambar 3.34 Tampilan Halaman Bandingkan Algoritma 88 Gambar 3.35 Tampilan Halaman Upload File Dekompresi 89 Gambar 3.36 Tampilan Pengaturan Parameter Dekompresi 89

(13)

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

xii

Gambar 4.1 Grafik Rasio Kompresi Parameter Algoritma LZ77 99 Gambar 4.2 Grafik Rasio Kompresi Parameter Algoritma LZ78 100 Gambar 4.3 Grafik Lama Proses Kompresi Parameter Algoritma LZ78 101 Gambar 4.4 Grafik Rasio Kompresi Parameter Algoritma LZW 102 Gambar 4.5 Grafik Lama Proses Kompresi Parameter Algoritma LZW 102

Gambar 4.6 Grafik Rasio Kompresi File *.txt 104

Gambar 4.7 Grafik Lama Proses Kompresi File *.txt 105

Gambar 4.8 Grafik Performa File *.txt 105

Gambar 4.9 Grafik Rasio Kompresi File *.doc 106

Gambar 4.10 Grafik Lama Proses Kompresi File *.doc 107

Gambar 4.11 Grafik Performa File *.doc 108

Gambar 4.12 Grafik Rasio Kompresi File *.rtf 109 Gambar 4.13 Grafik Lama Proses Kompresi File *.rtf 110 Gambar 4.14 Grafik perbandingan Performa File *.rtf 110 Gambar 4.15 Grafik Rasio Kompresi File *.html 111 Gambar 4.16 Grafik Lama Proses Kompresi File *.html 112 Gambar 4.17 Grafik Perbandingan Performa Kompresi File *.html 113

(14)

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

BAB 1

PENDAHULUAN

1.1 Latar Belakang

Meningkatnya penggunaan komputer dalam kegiatan sehari-hari, secara tidak langsung juga membuat kebutuhan akan penyimpanan data semakin meningkat. Data tersebut, dapat berupa file text, gambar, suara, dan video. Semakin besar ukuran file, semakin besar pula tempat penyimpanan yang dibutuhkan. Untuk keperluan pengiriman data melalui media transmisi, akan semakin lama juga waktu yang dibutuhkan untuk mengirimkan data tersebut. Oleh karena itu, mulailah dikembangkan algoritma-algoritma kompresi yang bertujuan untuk memampatkan data.

Kompresi data adalah ilmu atau seni merepresentasikan informasi dalam bentuk yang lebih compact. (Ida Mengyi Pu, 2006). Berbagai algoritma telah dikembangkan untuk keperluan kompresi data. Namun, algoritma tersebut sebahagian besar lebih efisien digunakan untuk tipe data tertentu saja. Misalnya untuk kompresi

text, terdapat algoritma Huffman, Ziv and Lempel 77 (LZ77), Ziv and Lempel 78

(LZ78), Lempel Ziv Welch (LZW), Dinamic Markov Compression (DMC), Run

Length Encoding (RLE) dan lain-lain.

Dalam tugas akhir ini, akan dibandingkan tiga algoritma kompresi : Ziv and Lempel 77 (LZ77), Ziv and Lempel 78 (LZ78), dan Lempel Ziv Welch (LZW), yang semuanya memakai metode kompresi dictionary. Ketiga algoritma ini dipilih karena merupakan algoritma dasar dan algoritma yang populer untuk metode kompresi

(15)

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

2

Algoritma LZW memberikan hasil kompresi yang buruk untuk file multimedia, seperti gambar, suara dan video (Linawati dan Panggabean, H.P., 2004). Karena Algoritma LZ77 dan LZ78 menggunakan konsep yang relatif sama, implementasi akan dilakukan hanya untuk file text.

Dalam menentukan algoritma yang tepat, ada 3 faktor yang akan dipertimbangkan, yaitu: kompleksitas algoritma, waktu yang dibutuhkan untuk melakukan kompresi, dan rasio perbandingan file hasil kompresi.

1.2 Rumusan Masalah

Permasalahan yang akan diteliti dan diuraikan dalam tugas akhir ini adalah:

1. Bagaimana perbandingan kompleksitas algoritma antara LZ77, LZ78, dan LZW. 2. Algoritma mana yang lebih efisien, dilihat dari waktu yang diperlukan untuk

kompresi dan dekompresi file, serta rasio perbandingan antara file hasil kompresi dengan file sebelum dikompresi.

1.3 Batasan Masalah

Batasan-batasan masalah dalam penelitian ini adalah:

1. Jenis file yang akan dikompresi adalah file plain text ASCII (.txt), microsoft word

document (.doc), rich text format (.rtf) dan hipertext markup language (.html).

2. Studi perbandingan kinerja yang dilakukan mencakup kompleksitas, waktu yang diperlukan, dan rasio perbandingan kompresi file.

3. Pengukuran kompleksitas dilakukan dengan perbandingan notasi Big O.

4. Aplikasi untuk implementasi algoritma dibuat menggunakan bahasa pemograman PHP dan JavaScript.

1.4 Tujuan Penelitian

Tujuan dari penelitian ini adalah:

1. Mengetahui algoritma mana yang lebih efektif dalam mengkompresi file text, 2. Mengembangkan aplikasi sebagai bentuk implementasi dari algoritma

(16)

3. Dengan aplikasi yang dikembangkan, ukuran file text dapat dikompresi menjadi lebih kecil, sehingga mengefisiensikan penggunaan memori penyimpanan.

1.5 Manfaat Penelitian

Dengan membandingkan 3 algoritma ini, dapat diambil manfaat algoritma mana yang lebih baik dalam melakukan kompresi file text, dan kelebihan serta kekurangan masing-masing algoritma. Selain itu, dengan membandingkan konsep-konsep dalam ketiga algoritma ini dapat dilihat bagaimana proses perancangan algoritma yang lebih baik, karena ketiga algoritma ini merupakan bentuk perbaikan dari algoritma sebelumnya.

1.6 Diagram Konsepsi

Konsep kerja studi perbandingan ketiga algoritma ini adalah sebagai berikut:

Gambar 1.1 Diagram Konsepsi Algoritma Kompresi

Algoritma LZ77 Algoritma LZ78 Algoritma LZW

Mengukur kompleksitas algoritma LZ77 Mengukur kompleksitas algoritma LZ78 Mengukur kompleksitas algoritma LZW

Implementasi ke dalam program komputer

Kompresi dan dekompresi file text ketiga algoritma

(17)

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

4

1.7 Metodologi Penelitian

Metodologi penelitian yang akan digunakan adalah: 1. Studi Literatur

Dengan melakukan studi literatur, penulis mempelajari teori tentang algoritma kompresi dari berbagai sumber, seperti buku, artikel, jurnal, dan situs-situs internet. Selain itu juga mempelajari beberapa teori lainnya yang dirasakan perlu. 2. Merancang Desain Sistem

Desain yang akan dirancang adalah struktur program yang akan digunakan untuk implementasi algoritma kompresi LZ77, LZ78, dan LZW.

3. Implementasi Sistem

Sistem akan diimplementasikan dalam bentuk aplikasi berbasis web menggunakan bahasa pemograman PHP dan JavaScript.

4. Pengujian dan Analisa Sistem

Pengujian ini mencakup apakah implementasi telah sesuai dengan teori, atau apakah program mengalami kesalahan. Perbaikan program akan dilakukan jika ditemukan kesalahan.

5. Dokumentasi Sistem

Pembuatan dokumentasi sistem, lengkap dengan analisis yang telah diperoleh.

1.8 Sistematika Penulisan

Sistematika penulisan dari skripsi ini terdiri dari beberapa bagian utama sebagai berikut:

BAB I . PENDAHULUAN

Bab ini akan menjelaskan mengenai latar belakang masalah yang dibahas dalam skripsi ini, rumusan masalah, batasan masalah, tujuan penelitian, manfaat penelitian, metode penelitian, dan sistematika penulisan skripsi.

(18)

BAB II. LANDASAN TEORI

Bab ini merupakan tinjauan teoritis yang berkaitan dengan algoritma kompresi, algoritma LZ77, LZ78 dan LZW, serta membahas teori Big O yang akan digunakan untuk membandingkan kompleksitas ketiga algoritma.

BAB III. PERANCANGAN DAN IMPLEMENTASI SISTEM

Dalam bab ini akan dibahas tentang perancangan untuk ketiga algoritma, pembuatan

psoude code untuk masing-masing algoritma dan menghitung kompleksitasnya. Lalu

diimplementasikan dalam bahasa pemograman PHP dan Javascript, beserta fungsi-fungsi program yang digunakan

BAB IV. ANALISA DAN PENGUJIAN SISTEM

Dalam bab ini akan berisi pengujian terhadap program yang sudah diimplementasikan, lalu dilakukan analisa perbandingan kinerja dari ketiga algoritma tersebut.

BAB V. KESIMPULAN DAN SARAN

Bab terakhir akan memuat kesimpulan isi dari keseluruhan uraian bab-bab sebelumnya dan saran-saran dari hasil yang diperoleh yang diharapkan dapat bermanfaat dalam pengembangan selanjutnya.

(19)

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

BAB 2

LANDASAN TEORI

Pada bab ini dijelaskan tentang defenisi dan klasifikasi kompresi data, lalu masing-masing teori tentang algoritma Ziv and Lempel 77 (LZ77), Ziv and Lempel 78 (LZ78), dan Lempel Ziv Welch (LZW). Selanjutnya dibahas teori tentang pengitungan kompleksitas algoritma menggunakan Big O.

2.1 Definisi dan Klasifikasi Algoritma Kompresi Data

Menurut Ida Mengyi Pu (2006, hal: 1) kompresi data adalah ilmu atau seni merepresentasikan informasi dalam bentuk yang lebih compact. Sedangkan David Salomon (2007, hal: 2) mengatakan bahwa data kompresi adalah proses mengkonversikan sebuah input data stream (stream sumber, atau data mentah asli) menjadi data stream lainnya (bit stream hasil, atau stream yang telah terkompresi) yang berukuran lebih kecil.

Tujuan dari kompresi data adalah untuk merepresentasikan suatu data digital dengan sesedikit mungkin bit, tetapi tetap mempertahankan kebutuhan minimum untuk membentuk kembali data aslinya. Data digital ini dapat berupa text, gambar, suara, dan kombinasi dari ketiganya, seperti video.

Untuk membuat suatu data menjadi lebih kecil ukurannya daripada data asli, diperlukan tahapan-tahapan (algoritma) untuk mengolah data tersebut. Menurut Thomas H. Cormen (2001, hal: 2) algoritma adalah suatu prosedur komputasi yang didefinisikan secara baik, membutuhkan sebuah atau sekumpulan nilai sebagai input, dan menghasilkan sebuah atau sekumpulan nilai sebagai output. Dalam algoritma

(20)

kompresi data, tidak ada algoritma yang cocok untuk semua jenis data. Hal ini disebabkan karena data yang akan dimampatkan harus dianalisis terlebih dahulu, dan berharap menemukan pola tertentu yang dapat digunakan untuk memperoleh data dalam ukuran yang lebih kecil. Karena itu, muncul banyak algoritma-algoritma kompresi data.

Secara garis besar, terdapat 2 penggolongan algoritma kompresi data: kompresi lossy, dan kompresi lossless.

a. Kompresi Lossy

Algoritma kompresi dikatakan lossy atau disebut juga irreversible jika tidak dimungkinkan untuk membentuk data asli yang tepat sama dari data yang sudah dikompresi. Ada beberapa detail yang hilang selama proses kompresi. Contoh penggunaan algoritma lossy seperti pada data gambar, suara dan video. Karena cara kerja sistem pengelihatan dan pendengararn manusia yang terbatas, beberapa detail dapat dihilangkan, sehingga didapat data hasil kompresi yang seolah-olah sama dengan data asli.

b. Kompresi Lossless

Algoritma kompresi dikatakan lossless atau disebut juga reversible jika dimungkinkan untuk membentuk data asli yang tepat sama dari data yang sudah dikompresi. Tidak ada informasi yang hilang selama proses kompresi dan dekompresi. Teknik ini digunakan jika data tersebut sangat penting, jadi tidak di mungkinkan untuk menghilangkan beberapa detail.

Untuk kompresi Lossless, berdasarkan cara mereduksi data yang akan dikompresi, terbagi lagi menjadi 2 kelompok besar algoritma:

a. Algoritma berbasis Entropi

Algoritma berbasis Entropi, atau disebut juga berbasis statistik, menggunakan model statistik dan probabilitas untuk memodelkan data, keefisienan kompresi bergantung kepada berapa banyak karakter yang digunakan dan seberapa besar

(21)

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

8

distribusi probabilitas pada data asli. Contoh algoritma yang berbasis entropi adalah: Huffman Coding, Adaptive Huffman, dan Shannon Fano.

b. Algoritma berbasis dictionary

Algoritma berbasis dictionary, bekerja dengan cara menyimpan pola masukan sebelumnya, dan menggunakan index dalam mengakses pola tersebut jika terdapat perulangan. Contoh algoritma yang berbasis dictionary adalah: LZ77, LZ78, LZW,

DEFLATE, dan LZMA.

Dari beberapa algoritma kompresi berbasis dictionary, LZ77, LZ78, dan LZW adalah yang paling populer. Banyak algoritma lainnya yang merupakan variasi dari tiga algoritma dasar tersebut. Pengembangan algoritma LZ77, LZ78, dan LZW tidak dalam waktu yang sama, algoritma LZ77 dikembangkan pada tahun 1977, LZ78 pada tahun 1978, dan LZW yang merupakan pengembangan dari LZ78, dipublikasikan pada tahun 1984.

Proses kompresi melibatkan 2 buah proses, yaitu proses kompresi (compression) dan dekompresi (decompression). Pada proses kompresi file asli dibaca, lalu dilakukan pengkodean untuk membuat file hasil kompresi. Proses ini disebut juga dengan proses encoding. Untuk memperoleh kembali file asli dari file yang sudah dimampatkan tersebut, proses pengkodean kembali dilakukan. Proses ini disebut juga proses decoding.

2.2 Algoritma Lempel Ziv 77

Algoritma Lempel-Ziv 77 (LZ77), atau dikenal juga dengan LZ1, dipublikasikan dalam sebuah paper oleh Abraham Lempel dan Jacob Ziv pada tahun 1977. Algoritma ini merupakan tipe algoritma lossless. Algoritma LZ77 disebut juga dengan ’sliding

windo ws’, atau jendela berjalan karena proses kerjanya (wikipedia, 2008).

Prinsip dari algoritma ini adalah menggunakan sebahagian input karakter yang telah dikodekan sebelumnya sebagai dictionary (kamus). Bagian input ini seolah-olah diibaratkan dengan sebuah jendela (window) yang dapat digeser dari kiri ke kanan. Jendela ini secara dinamis merupakan dictionary untuk mencari simbol

(22)

input dengan pola tertentu. Ketika jendela ini bergerak dari kiri ke kanan, isi dari dictionary dan input karakter yang akan dicari polanya juga akan berubah.

Jendela ini dibagi menjadi dua bagian, bagian pertama disebut history buffer (H), atau search buffer, yang berisi sebahagian input karakter yang sudah dikodekan. Jendela kedua adalah lookahead buffer (L), yang berisi sebahagian input karakter yang akan dikodekan. Ukuran dari masing-masing buffer ini telah ditetapkan sebelumnya, dalam implementasinya nanti, history buffer akan memiliki panjang beberapa ribu

byte, dan lookahead buffer panjangnya hanya puluhan byte (Salomon, D., 2007 ).

Algoritma kompresi LZ77 secara sederhana dapat dilihat pada tabel 2.1, dimana input berupa sebuah string karakter. Output algoritma adalah kumpulan token.

Tabel 2.1 Algoritma Dasar LZ77 Encoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

a ← batasan panjang history_buffer; b ← batasan panjang lookahead_buffer; history_buffer ← ””;

lookahead_buffer ← a karakter pertama dari string

input;

while not EOF do

temukan pola karakter terpanjang pada history_buffer yang cocok dengan pola yang terdapat pada

lookahead_buffer;

l ← jumlah karakter terpanjang yang ditemukan; f ← jarak antara ujung history_buffer dengan

karakter yang ditemukan;

c ← karakter pertama setelah karakter yang

ditemukan;

output token (f,l,c);

history_buffer ← history buffer + karakter yang

sudah dikodekan + c;

if ukuran history_buffer > a do

hapus beberapa karakter di awal history_buffer supaya tidak melebihi batas a;

end if

lookahead_buffer←lookahead_buffer + (l+1) karakter

berikutnya;

if ukuran lookahead_buffer > b do

hapus beberapa karakter di awal lookahead_buffer supaya tidak melebihi batas b;

end if end while

Sebagai contoh, pada gambar 2.1, H adalah: ”gian_input_yang_dikode kan._Bagian_”, sepanjang 34 byte (1 karakter = 1 byte). Lalu L adalah: ”inputan_ini_merup”, sepanjang 12 byte. Data input karakter pada dan sebelum H

(23)

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

10

sudah dikodekan sebelumnya, tetapi karakter pada dan sesudah L, adalah yang akan dikodekan.

Algoritma LZ77 akan mencari apakah karakter yang terdapat pada jendela L, terdapat juga pada jendela H. Pencarian ini untuk menemukan karakter terpanjang yang cocok dengan karakter yang ada pada jendela L. Kode yang dihasilkan dengan algoritma LZ77 berupa token dengan bentuk (f, l,c). Dimana f adalah jumlah karakter dari ujung jendela H kepada karakter yang ditemukan, dalam contoh ini adalah 29 karakter. Sedangkan l adalah jumlah panjang dari karakter yang ditemukan cocok pada H, dalam contoh ini sepanjang 5 karakter. Dan c adalah karakter pertama setelah karakter yang sudah dikodekan, yaitu ’a’.sehingga token yang dihasilkan adalah (29,5,a). Setelah token (29,5,a), jendela akan bergeser sebanyak 6 karakter, yaitu banyak karakter yang ditemukan + 1, ke kiri. Sehingga tampak seperti gambar 2.2.

Gambar 2.1 Contoh Cara Kerja Algoritma LZ77 Bagian 1

Gambar 2.2 Contoh Cara Kerja Algoritma LZ77 Bagian 2

Pada tahap ini, dilakukan cara yang sama seperti tahap sebelumnya, algoritma akan mencari apakah karakter yang terdapat pada jendela L, terdapat juga pada jendela H, dan menghasilkan token (8,4,i). Lalu jendela akan bergeser sebanyak 4+1 karakter ke kanan. Langkah ini dilakukan terus menerus sampai akhir dari file. Kumpulan token inilah yang menjadi file terkompresi dari file asli.

Sebahagian_input_yang_dikodekan._Bagian_inputan_ini_merup

History Buffer Lookahead Buffer 5

29

gian_input_yang_dikodekan._Bagian_inputan_ini_merupak

History Buffer Lookahead Buffer 4

(24)

Dekompresi algoritma LZ77, dilakukan dengan cara membaca semua token hasil kompresi dan mengkodekannya kembali menjadi string asli. Algoritma dasar dekompresi LZ77 dapat dilihat pada tabel 2.2.

Tabel 2.2 Algoritma Dasar LZ77 Decoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 11 output ← ””;

while not EOF do

f ← sub token 1 dari token; l ← sub token 2 dari token; c ← sub token 3 dari token; outlen ← panjang string output;

output ← output.ambil sebanyak l karakter

dari string output dimulai pada karakter ke (outlen-f).c;

end while

tampilkan output;

Ukuran dari history buffer dan lookahead buffer merupakan faktor penting dalam kinerja kompresi. Proses pencarian string yang efisien juga mempengaruhi kinerja dari algoritma kompresi LZ77.

2.3 Algoritma Lempel Ziv 78

Algoritma Lempel Ziv 78 (LZ78), dikembangkan 1 tahun setelah LZ77, yaitu pada tahun 1978. Oleh Abraham Lempel dan Jacob Ziv. Karena dipublikasikan oleh pihak yang sama, algoritma ini disebut juga dengan LZ2.

Pada algoritma LZ78, Abraham Lempel dan Jacob Ziv mencoba mengatasi permasalah yang ditemukan pada LZ77, yaitu berkaitan dengan kemampuan dalam menemukan pola karakter. Pada LZ77, algoritma ini tidak dapat menemukan pola karakter, jika karakter tersebut sudah dilewati oleh history buffer. Untuk mengatasinya, algoritma LZ78 dikembangkan dengan cara membuat suatu dictionary yang dapat menyimpan pola secara permanen selama proses pengkodean berlangsung.

Token yang digunakan sebagai index untuk menemukan pola tersebut,

(25)

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

12

adalah pointer yang merujuk pada dictionary dimana pola yang ditemukan, dan c adalah karakter pertama sesudah pola.

Dictionary pada LZ78 dapat dibayangkan sebagai sebuah array. Pada saat

proses pengkodean dimulai, array ini kosong. Sewaktu algoritma membaca sebuah karakter input, ia akan mencari dalam array, apakah karakter itu ada pada array atau tidak. Jika tidak ditemukan, karakter itu akan dimasukkan ke dalam array, dan dihasilkan token: (0,c), dimana c adalah karakter yang tidak ditemukan tersebut. Tetapi jika didalam array ditemukan, akan dibuat sebuah string yang bersisi karakter yang ditemukan tadi, disambung dengan karakter berikutnya dari input, dan kembali dicari didalam array, apakah pola ini ada atau tidak. Jika ada, string tadi ditambahkan kembali, sampai tidak ditemukan pola yang sesuai dengan string didalam array. Lalu

string ini akan dimasukkan ke dalam array, dan dihasilkan token: (f,c). Dimana f

adalah index dari array untuk pola string yang ditemukan, dan c adalah karakter terakhir dari string. Proses ini berlangsung terus menerus sampai akhir file (Pu , Ida M., 2006).

Tabel 2.3 adalah contoh 9 langkah pertama dalam mengkodekan string input : ”ada_beberapa_data_yang_hilang”. Kumpulan token inilah yang menjadi file kompresi pada algoritma LZ78. Salah satu masalah yang ada pada algoritma LZ78, adalah jumlah index, atau besar dari dictionary yang diperlukan. Dictionary ini akan bertambah banyak dengan sangat cepat. Salah satu cara sederhana adalah dengan membuat batas maksimum pada jumlah dictionary. Dan jika batas ini tercapai, algoritma tidak akan memasukkan karakter ke dalam dictionary lagi, tetapi hanya memakai dictionary yang sudah ada.

Tabel 2.3 Contoh Cara Kerja Algoritma LZ78

Index Isi dictionary Token Index Isi dictionary Token

0 null 5 ”e” (0,”e”)

1 ”a” (0,”a”) 6 ”be” (4,”e”)

2 ”d” (0,”d”) 7 ”r” (0,”r”)

3 ”a_” (1,”_”) 8 ”ap” (1,”p”)

(26)

Algoritma kompresi LZ78 secara sederhana dapat dilihat pada tabel 2.4, dimana input berupa sebuah string karakter, dan sebuah dictionary dengan index pertama berisi dengan nilai null. Output algoritma adalah kumpulan token.

Tabel 2.4 Algoritma Dasar LZ78 Encoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 11 dictionary[0] ← ””;

while not EOF do

word ← ””;

c←baca 1 karakter selanjutnya;

while word+c ada dalam dictionary do

word←word+c;

c ← baca 1 karakter selanjutnya;

end while

key ← index dictionary untuk word;

output (key,c);

tambahkan word+c kedalam dictionary pada lokasi yang tersedia;

end while

Dekompresi algoritma LZ78, dilakukan dengan cara membaca semua token hasil kompresi dan membuat kembali dictionary yang sama persis seperti proses kompresi. Misalkan (f,c) adalah pasangan token, maka algoritma dekompresi LZ78 dapat dilihat pada tabel 2.5.

Tabel 2.5 Algoritma Dasar LZ78 Decoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 dictionary[0] ← ””;

baca input dalam bentuk stream token

while not EOF stream token do

a ← karakter f pada token berikutnya; b ← karakter c pada token berikutnya; word ← isi dictionary pada index ke a;

output word.b;

tambahkan word.b kedalam dictionary pada lokasi yang tersedia

end while

Dibandingkan dengan algoritma LZ77 yang menggunakan 3 karakter untuk 1 token, algoritma LZ78 memakai token yang terdiri dari 2 karakter. Karena keterbatasan sumber daya memori, jumlah dictionary dalam LZ78 akan dibatasi. Sebuah algoritma pencarian untuk array juga merupakan faktor penting dalam kinerja algoritma LZ78.

(27)

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

14

2.4 Algoritma Lempel Ziv Welch

Algoritma Lempel Ziv Welch (LZW), dikembangkan oleh Abraham Lempel, Jacob Ziv, dan Terry Welch. Algoritma ini dipublikasikan pada tahun 1984 oleh Terry Welch. LWZ dirancang sebagai peningkatan dari algoritma LZ78.

Algoritma ini mereduksi jumlah token yang dibutuhkan menjadi 1 simbol saja. Simbol ini merujuk kepada index dalam dictionary. Proses kerjanya mirip dengan algoritma LZ78, tetapi jika pada algoritma LZ78 dictionary dimulai dari keadaan kosong, LZW mengisi dictionary ini dengan seluruh simbol karakter yang akan digunakan. Pada kasus yang umum, 256 index pertama dari dictionary akan diisi dengan karakter ASCII dari 0-255. Karena dictionary telah diisi dengan semua kemungkinan karakter terlebih dahulu, maka karakter input pertama akan selalu dapat ditemukan dalam dictionary. Inilah yang menyebabkan token pada LZW hanya memerlukan 1 simbol saja yang merupakan pointer pada dictionary.

Tabel 2.6 Algoritma Dasar LZW Encoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 word←””;

inisialisasi dictionary dengan 256 karakter ASCII;

while not EOF do

x←baca karakter selanjutnya;

if word+x ada dalam dictionary do

word←word+x;

else

output index dictionary untuk word; tambahkan word+x kedalam dictionary pada lokasi yang tersedia;

word←x;

end if end while

output index dictionary untuk word;

Prinsip kerja LZW, dimulai dengan membaca karakter input satu persatu dan diakumulasi pada sebuah string I. Lalu dilakukan pencarian dalam dictionary, apakah terdapat string I. Selama string I ditemukan didalam dictionary, string ini ditambahkan dengan satu karakter berikutnya, lalu dicari lagi dalam dictionary. Pada saat tertentu, menambahkan satu karakter x pada string I akan menyebabkan tidak ditemukan dalam dictionary. String I ditemukan, tetapi string I+x tidak. Dalam tahap

(28)

ini, algoritma akan akan menulis index dari string I sebagai output, menambahkan

string I+x kedalam dictionary, dan menginisialisasikan string I dengan x, lalu proses

dimulai lagi dari awal. Algoritma kompresi LZW secara sederhana dapat dilihat pada tabel 2.6, dimana input berupa sebuah string karakter. Output algoritma adalah kumpulan token.

Sebagai contoh, input adalah string : ”ada_beberapa_data_yang_hilang”.

Langkah pertama adalah mengisi dictionary dengan semua kemungkinan karakter, yaitu karakter ASCII dari 0-255, yang berarti index dictionary 0-255 telah berisi. Lalu

string I diisi dengan karakter ”a”. Didalam dictionary, karakter ”a” ada pada index ke

97. Lalu string I ditambah dengan karakter selanjutnya ”d”. Frase ”ad” tidak ditemukan, maka akan dihasilkan token 97, dan frase ”ad” ditambahkan pada index ke 256 dalam dictionary. String I sekarang berisi ”d”, karena d ada pada index ke 100, maka string I ditambahkan dengan karakter selanjutnya, menjadi ”da”. Untuk langkah selanjutnya dapat dilihat dari tabel 2.7.

Tabel 2.7 Contoh Cara Kerja Algoritma LZW

String I Di dalam dictionary? Entry baru Output keterangan

a ada - -

ad tidak [256] = ad 97 97 adalah index dari ”a”

d ada - -

da tidak [257] = da 100 100 adalah index dari ”d”

a ada - -

a_ tidak [258] = a_ 97 97 adalah index dari ”a”

_ ada - -

_b tidak [259] = _b 95 95 adalah index dari ”_”

b ada - -

be tidak [260] = be 98 98 adalah index dari ”b”

e ada - -

eb tidak [261] = eb 101 101 adalah index dari ”e”

b ada - -

be ada - -

ber tidak [262] = be 260 262 adalah index dari ”be”

(29)

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

16

Kumpulan output yang berupa angka-angka inilah sebagai hasil kompresi. Karena menggunakan konsep dictionary yang sama seperti LZ78, pengorganisasian

dictionary juga diperlukan, misalnya seperti seberapa besar dictionary yang

disediakan, dan apa yang akan dilakukan jika dictionary sudah penuh.

Dekompresi algoritma LZW, dilakukan dengan cara membaca semua token hasil kompresi dan membuat kembali dictionary yang sama persis seperti proses kompresi. Misalkan (x) adalah token hasil proses kompresi, maka algoritma dekompresi LZ78 dapat dilihat pada tabel 2.8.

Tabel 2.8 Algoritma Dasar LZW Decoding

Baris Pseudo code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

x←baca token x dari file;

element←isi dictionary pada index x;

output element;

word←element;

while not EOF do

x←baca token x selanjutnya;

if tidak ada index ke x pada dictionary then

element←word+karakter_pertama_pada_word;

else

element←isi dictionary pada index x;

end if

output element;

tambahkan word + karakter pertama dari word kedalam dictionary;

word←element;

end while

Banyak algoritma berbasis dictionary lainnya dikembangkan dari tiga algoritma ini. Misalnya algortima LZMW, LZAP dan LZY adalah variasi dari LZW. Algoritma LZFG yang merupakan gabungan dari LZ77 dan LZ78. Atau algoritma DEFLATE yang merupakan gabungan antara algoritma HUFFMAN dengan LZ77 dan banyak diimplementasikan dalam aplikasi kompresi populer seperti PKZIP dan 7-Zib (Feldspar A, 2009).

2.5 Kompleksitas Algoritma dan Notasi O-besar (big O)

Dalam ilmu komputer, sebuah algoritma tidak hanya dilihat dari apakah algoritma tersebut dapat memecahkan suatu masalah atau tidak, tetapi juga dari seberapa efisien algortima tersebut melakukannya. Keefisienan suatu algoritma biasanya berkaitan erat

(30)

dengan waktu dan ruang yang dibutuhkan algoritma tersebut dalam memecahkan masalah. Jika algoritma B dapat memecahkan masalah yang sama dengan waktu yang lebih cepat dibandingkan algoritma B, dapat dikatakan bahwa algoritma B lebih efisien daripada algoritma A.

Efisiensi suatu algortima dapat diukur dengan:

1. Waktu (time): yakni banyaknya komputasi elementer dalam algoritma.

2. Ruang (space): adalah banyaknya sel memori yang dibutuhkan oleh algoritma.

Ukuran ini secara berturut-turut disebut sebagai kompleksitas komputasi (computational complexity) dan kompleksitas ruang (space complexity) (Suksmono, 2009). Kedua kompleksitas ini tidak begitu berarti untuk input yang relatif sedikit, namun untuk input yang besar, keduanya dapat digunakan untuk mengetahui algoritma mana yang lebih efisien.

Salah satu hal yang paling penting dalam menghitung kompleksitas komputasi algoritma adalah pertumbuhan dari fungsi kompleksitas. Seperti contoh pada tabel 2.9, jika algoritma A mempunyai kompleksitas: 100n+50, dan algoritma B dengan kompleksitas: n2+10n+4, maka algoritma A dapat disimpulkan lebih efisien dibandingkan dengan algortima B untuk input yang besar dari 100. Hal ini dapat dilihat dimana dengan jumlah input (n) yang semakin membesar, algoritma B akan membutuhkan waktu yang lebih lama.

Tabel 2.9 Perbandingan Pertumbuhan Kompleksitas (Growth Rates) Algoritma A (100n+50) dengan Algoritma B ( n2+10n+4)

n Algoritma A (100n+50) Algoritma B (n2+10n+4) 10 50 100 200 500 1.000 1.050 5.050 10.050 20.050 50.050 100.050 204 3.004 11.004 42.004 255.004 1.010.004

(31)

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

18

Dengan jumlah input (n) kurang dari 100, algoritma B lebih efisien daripada algoritma B, namun jika jumlah input sudah diatas 100, algoritma B akan membutuhkan waktu yang lebih banyak daripada algoritma A. Pertumbuhan dari kompleksitas dengan meningkatnya besarnya input (n), adalah ukuran yang sesuai untuk membandingkan algoritma. Pertumbuhan fungsi kompleksitas dilambangkan dengan notasi O (dibaca big-O).

Dalam bidang matematika, notasi big O menggambarkan batasan ruang lingkup (limiting behavior) dari suatu fungsi, ketika argumen fungsi tersebut condong ke suatu nilai tertentu atau nilai yang tak berhingga. Notasi big O akan menyederhanakan suatu fungsi agar dapat diketahui tingkat pertumbuhan kompleksitasnya (growth rates) (wikipedia, 2009). Walaupun dikembangkan sebagai bagian dari perhitungan di bidang matematika, notasi big O juga dapat digunakan dalam bidang ilmu komputer untuk mengukur kompleksitas suatu algoritma.

Definisi big O: misalkan f dan g adalah dua buah fungsi dari bilangan bulat ke bilangan riil. Dapat dikatakan bahwa f(x) adalah O(g(x)) jika ada suatu konstanta C dan k sedemikian hingga |f(x)| ≤ C| g(x)|, saat x > k. (Suksmono, 2009). Saat menganalisa perumbuhan dari fungsi kompleksitas, f(x) dan g(x) selalu positif. Oleh karena itu, persyaratan big-O diatas dapat disederhanakan menjadi f(x) ≤ C⋅g(x) saat x > k.

Untuk menunjukkan bahwa f(x) adalah O(g(x)), hanya perlu ditentukan satu buah pasangan (C, k) (yang tidak pernah unik). Ide dibelakang notasi big-O adalah penentuan batas atas (upper boundary) dari perumbuhan suatu fungsi f(x) untuk x besar. Batas ini diberikan oleh fungsi g(x) yang biasanya jauh lebih sederhana daripada f(x). dengan konstanta C dalam persyaratan f(x) ≤ C⋅g(x) saat x > k. Karena C tidak pernah tumbuh sejalan dengan tumbuhnya x. Kita hanya tertarik pada x besar, sehingga jika f(x) > C⋅g(x) untuk x ≤ k, bukanlah suatu masalah.

Contoh Soal : Tunjukkan bahwa f(x) = x2 + 2x + 1 adalah O(x2). Jawab: Untuk x > 1: x2 + 2x + 1 ≤ x2 + 2x2 + x2

⇒ x2

(32)

Karena itu, untuk C = 4 dan k = 1: f(x) ≤ C x2 ketika x > k. ⇒ f(x) adalah O(x2).

Notasi big O dapat ditulis sebagai pangkat tertinggi (higest order) dari suatu fungsi polinomial. Ini dikarenakan untuk input (n) yang besar dalam fungsi polinomial, pangkat tertinggi akan sangat mendominasi. Jadi fungsi f(n) = 100n+50, ditulis dengan O(n), dan untuk f(n) = (n2+10n+4) ditulis sebagai O(n2).

Kompleksitas suatu algoritma dihitung untuk setiap langkah atau instruksi yang dikerjakan. Beberapa ketetapan waktu yang diterapkan :

1. Operasi pengisian nilai (assignment), perbandingan, operasi aritmatika, read and

write, membutuhkan waktu O(1).

2. Pengaksesan elemen array membutuhkan waktu O(1).

3. Operasi if-then-else waktu yang diambil adalah yaktu yang paling besar diantara 2 kondisi.

4. Operasi perulangan (for, repeat-until, dan while-do) membutuhkan waktu

sebanyak jumlah perulangan dikalikan dengan banyak instruksi dalam perulangan tersebut.

Contoh algoritma konversi suhu:

Tabel 2.10 Algoritma Konversi Suhu

Baris Pseudo code Waktu eksekusi

1 2 3 a←read(x); fahrenheit←(x*1.8)+32; print fahrenheit; 1 1+1+1=3 1

Pada contoh algoritma diatas, total waktu eksekusi adalah 1+3+1=4, maka notasi big O adalah O(1).

(33)

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

20

Contoh algoritma membedakan bilangan ganjil atau genap: Tabel 2.11 Algoritma Bilangan Ganjil atau Genap

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 a←read(x); b←0; if (a mod 2 = 0)

hasil←”bilangan genap”; b=b+a;

else

hasil←”bilangan genap”; end if 1 1 1+1=2 1 1+1=2 1

Pada contoh algoritma diatas, total waktu eksekusi adalah 1+1+2+ max(3,1)=1+1+2+3=7, maka notasi big O adalah O(1).

Contoh algoritma perulangan:

Tabel 2.12 Algoritma Perulangan Sederhana

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 a←read(x); b←0; i←0; for i=1 to a do b=b+i; i←i+1; end for 1 1 1 (1+1)*n=2n (1+1)*n=2n (1+1)*n=2n

Pada contoh algoritma diatas, total waktu eksekusi adalah 1+1+1+2n+2n+2n =6n+3, maka notasi big O adalah O(n).

Contoh algoritma perulangan bersarang (nested loop): Tabel 2.13 Algoritma Perulangan Sederhana

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 9 12 a←read(x); b←0;c←0;i←0;j←0; for i=1 to a do b←i; for j=1 to b do c←c+j j←j+1; end for i←i+1; end for 1 1+1+1+1=4 (1+1)*n=2n 1*n=1n (1+1)*n*n=2n2 (1+1)*n*n=2n2 (1+1)*n*n=2n2 (1+1)*n=2n

Pada contoh algoritma diatas, total waktu eksekusi adalah 1+4+2n+1n+2n2 +2n2+2n2 +2n=6n2+5n+5, maka notasi big O adalah O(n2).

(34)

Notasi big O yang sering diperoleh dari suatu algoritma adalah: 1. O(1) - constant time

Kompleksitas O(1) teradapat pada algoritma yang menghasilkan nilai selalu tetap tanpa bergantung kepada banyak masukan.

Contoh:

a. Operasi push dan pop pada suatu stack (yang terdiri dari n elemen). b. Inisialisasi suatu variabel.

c. Operasi aritmatika sederhana.

2. O(2log n) - logarithmic time

Algoritma yang berdasarkan pada binary tree biasanya memiliki kompleksitas O(log n).

Contoh:

a. Algoritma binary search pada list berurutan yang terdiri dari n elemen. b. Operasi insert dan search pada binary tree yang terdiri dari n node.

3. O(n) - linear time

Algoritma dengan kompleksitas O(n) membutuhkan 1 kali proses untuk masing-masing masukan.

Contoh:

a. Penelusuran suatu list/array yang terdiri dari n elemen.

b. Pencarian suatu nilai dalam list/array dengan algoritma linear search. c. Mencari nilai maksimum atau minimum dari suatu list.

4. O(n 2log n) - linearithmic time

Kompleksitas O(n log n) terdapat pada algoritma yang memecahkan masalah menjadi masalah yang lebih kecil, lalu menyelesaikan tiap masalah secara

independen.

Contoh:

a. Algoritma pengurutan list quicksort. b. Algoritma pengurutan list mergesort.

(35)

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

22

5. O(n2) - quadratic time

Umumnya algoritma dengan kompleksitas O(n2) melibatkan proses perulangan bersarang (nested loop).

Contoh:

a. Beberapa algoritma pengurutan sederhana, seperti selection sort. b. Membandingkan array 2 dimensi dengan ukuran n * n.

c. Mencari duplikasi dalam sebuah list yang tidak terurut dengan n elemen (menggunakan 2 loop bersarang).

6. O(n3) - cubic time

Algoritma dengan kompleksitas O(n3), mirip dengan O(n2), namun menggunakan

loop bersarang sebanyak 3 kali. Algoritma jenis ini hanya cocok jika n kecil. Jika

n besar, waktu yang dibutuhkan akan sangat lama.

7. O(2n) - exponential time

Salah satu algoritma yang mempunyai kompleksitas O(2n) adalah brute force dalam menebak suatu password. Setiap penambahan karakter, akan melipatgandakan waktu yang dibutuhkan.

8. O(n!) - factorial time

O(n!) merupakan kompleksitas yang sangat cepat pertumbuhan waktu yang diperlukannya. Algoritma ini memproses tiap masukan dan menghubungkannya dengan n-1 masukan lainnya.

Tabel 2.14 Perbandingan Pertumbuhan Kompleksitas

Input (n) O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n) O(n!)

1 1 1 1 1 1 1 2 1 2 1 1 2 2 4 8 4 2 8 1 3 8 24 64 512 256 40.320 64 1 6 64 384 4096 262.144 1019 1088 512 1 9 512 4.608 262.144 108 10153 101165 1.024 1 10 1.024 10.240 106 109 10307 102638 1.048.576 1 20 106 2*107 1012 1018 ∞ ∞

(36)

Pada tabel 2.4 terlihat perbandingan tingkat pertumbuhan (growth rates) dari masing-masing notasi big O. Untuk masukan (n) yang semakin membesar, O(n2), O(n3), O(2n) dan O(n!) membutuhkan waktu eksekusi yang sangat lama. Sedangkan O(1), O(log n) dan O(n) peningkatan waktu yang dibutuhkan tidak terlalu cepat untuk n yang besar. Urutan spektrum kompleksitas waktu algoritma dapat dilihat pada gam-bar 2.3, dan dalam grafik, pertumbuhan kompleksitas dapat dilihat pada gamgam-bar 2.4.

                        (1)< (log )< ( )< ( log )< ( )< ( )<...< 3 2 n O n O n n O n O n O O O( 2n)< O(n!)

algoritma polinomial algoritma eksponensial Gambar 2.3 Urutan Spektrum Kompleksitas Waktu Algoritma

Gambar 2.4 Grafik Perbandingan Pertumbuhan Kompleksitas Sumber : Growth of Functions (2009).

Suatu masalah dikatakan tractable (mudah dari segi komputasi) jika ia dapat diselesaikan dengan algoritma yang memiliki kompleksitas polinomial kasus terburuk (artinya dengan algoritma yang mangkus), karena algoritma akan menghasilkan solusi dalam waktu yang lebih pendek. Sebaliknya, sebuah masalah dikatakan

intractable (sukar dari segi komputasi) jika tidak ada algoritma yang mangkus untuk

menyelesaikannya. Masalah yang sama sekali tidak memiliki algoritma untuk memecahkannya disebut masalah tak-terselesaikan (unsolved problem) (Munir, 2009).

(37)

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

BAB 3

PERANCANGAN SISTEM

Perancangan sistem terdiri dari 5 bagian, bagian pertama adalah perancangan fungsi-fungsi yang digunakan pada perancangan algoritma kompresi. Bagian kedua merupakan perancangan masing-masing algoritma dalam bentuk pseudo code, lalu menghitung kompleksitasnya. Bagian ketiga berisi tentang perancangan pengukuran kecepatan algoritma, bagian keeampat tentang pengukuran rasio kompresi, dan bagian kelima tentang perancangan aplikasi yang mencakup DFD, kamus data dan interface program yang digunakan sebagai implementasi dari ketiga algoritma.

3.1 Perancangan Fungsi

Fungsi-fungsi yang dirancang digunakan dalam perancangan algoritma nantinya. Setiap algoritma membutuhkan beberapa fungsi yang hampir sama dalam melakukan proses kompresi (encoding) dan dekompresi (decoding), sehingga akan lebih efisien jika fungsi tersebut dipisahkan dari algoritma inti. Perancangan fungsi terdiri dari 2 bagian, yaitu perancangan fungsi dasar dan perancangan fungsi khusus.

3.1.1 Perancangan Fungsi Dasar

Perancangan fungsi dasar adalah perancangan fungsi-fungsi yang banyak digunakan dalam pemograman umum. Untuk bahasa pemograman tingkat tinggi, biasanya fungsi-fungsi ini sudah tersedia, termasuk bahasa pemograman PHP yang akan digunakan untuk implementasi ketiga algoritma. Tetapi untuk mengukur kompleksitas suatu algoritma, dihitung berdasarkan langkah demi langkah instruksi yang digunakan. Dengan merancang kembali fungsi-fungsi tersebut, akan dapat dihitung

(38)

kompleksitas dan big O untuk masing-masing fungsi. Namun ada beberapa batasan yang digunakan, dimana ada beberapa fungsi dasar yang tidak dirancang ulang, dan dianggap memiliki kompleksitas 1. Fungsi tersebut adalah:

1. Fungsi untuk mencari panjang dari suatu string : strlen().

2. Fungsi untuk mencari banyak elemen dalam suatu array : count(). 3. Fungsi konversi integer ke karakter ASCII : chr().

4. Fungsi konversi karakter ASCII ke integer : ord().

3.1.1.1 Fungsi Konversi Bilangan Desimal ke Bilangan Biner

Tujuan dari fungsi konversi bilangan desimal ke bilangan biner adalah untuk memperoleh output nilai biner dari input nilai desimal. Misalkan input dalam fungsi ini adalah 14, maka output yang dihasilkan adalah 1110. Tipe data masukan adalah integer, dan tipe data keluaran berupa string. Konversi bilangan desimal ke biner, dirancang dengan algoritma sebagai berikut:

Tabel 3.1 Algoritma Fungsi Konversi Bilangan Desimal ke Bilangan Biner

Baris Pseudo code Waktu eksekusi

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

string function dectobin (int dec){ int sisa←0; string biner←””;

repeat {

sisa←dec modulus 2; dec←dec div 2;

if (sisa == 0) then biner←"0".biner; else biner←"1".biner; end if } until (dec > 0) return biner; } 1 1+1 (1+1)*2log n (1+1)*2log n 1*2log n (1+1)*2log n (1+1)*2log n 1*2log n 1

Total Kompleksitas 8 * 2log n + 4

Algoritma tersebut mempunyai kompleksitas 8 * 2log n + 4, dengan dalam percabangan if pada baris ke-6 hanya diambil salah satu nilai, sehingga O(2log n). Namun pada desain ketiga algoritma kompresi nantinya, batasan input dari fungsi konversi bilangan desimal ke bilangan biner ini adalah 214 = 16.384. Oleh karena n maksimum adalah 16.384, worst case fungsi ini menjadi 8 * 2log 16.384 + 4 = 116, dengan O(1).

(39)

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

26

3.1.1.2 Fungsi Konversi Bilangan Biner ke Bilangan Desimal

Tujuan dari fungsi konversi bilangan biner ke bilangan desimal adalah untuk memperoleh output nilai desimal dari input nilai biner. Misalkan input dalam fungsi ini adalah 11010, maka output yang dihasilkan adalah 26. Tipe data masukan adalah

string, dan tipe data keluaran adalah integer. Konversi bilangan desimal ke biner,

dirancang dengan algoritma sebagai berikut:

Tabel 3.2 Algoritma Fungsi Konversi Bilangan Biner ke Bilangan Desimal

Baris Pseudo code Waktu eksekusi

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

int function bintodec(string bin){

int len_bin←0;

arr←array(1,2,4,8,16,32,64,128,256,512,1024,

¬2048,4096,8192,16384);

len_bin←strlen(bin);

int dec←0; int i←0; string bit←""; for i=len_bin-1 to 0 do bit←bin[i]; dec←dec+(bit*arr[len_bin-i-1]); i--; end for return dec; } 1 1 15 1+1 1+1+1 (1+1+1)*n 1*n (1+1+1+(3))*n 2*n 1 Total Kompleksitas 12*n + 23

Algoritma tersebut mempunyai kompleksitas 12n + 22, dengan O(n). n dalam algoritma ini adalah panjang string biner yang digunakan sebagai input. Pada baris kedua algoritma, dideklarasikan sebuah array arr sebagai penampung nilai 2n. Ini digunakan untuk mengatasi operasi pemangkatan dalam penerapannya nanti, bahasa pemograman PHP membutuhkan fungsi khusus untuk operasi pemangkatan, yang menyebabkan nilai kompleksitas akan sulit dihitung.

Dalam desain ketiga algoritma, konversi dari biner ke desimal maksimal hanya membutuhkan 13 digit, atau nilai maksimum desimalnya 16383. Dengan pembatasan ini, kompleksitas fungsi konversi bilangan biner ke bilangan desimal menjadi konstan, karena perulangan yang terjadi maksimal hanya 13 kali, sehingga dapat ditulis sebagai O(1).

(40)

3.1.1.3 Fungsi Pemotongan String

Fungsi pemotongan string adalah untuk menggantikan fungsi substr() pada PHP, yang digunakan untuk mengambil sebagian isi string. Fungsi ini membutuhkan 3 parameter, yaitu string input, awal dari pemotongan dan panjang pemotongan. Parameter pertama bertipe string, dan yang lainnya bertipe integer. Output fungsi bertipe string. Fungsi pemotongan string dirancang dengan algoritma sebagai berikut:

Tabel 3.3 Algoritma Fungsi Pemotongan String

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 9 10

string function sub_str(string input, int

¬awal, int length){

int akhir←length+awal; string output←””; int i←0;

for i=awal to akhir do

output←output.input[i]; i++; end for return output; } 3 1+1 1+1 (1+1)*n (1+1)*n 2*n 1 Total Kompleksitas 6*n + 8

Algoritma tersebut mempunyai kompleksitas 6n + 8, sehingga O(n). n adalah panjang pemotongan. Prinsip kerja algoritma tersebut adalah menyambung karakter demi karakter dalam batas yang telah ditentukan. Dalam perancangan algoritma kompresi nantinya, nilai n untuk fungsi ini terbatas pada nilai tertentu, sehingga kompleksitas akan menjadi konstan dengan O(1).

3.1.1.4 Fungsi Zero Left Pad

Fungsi ini digunakan untuk menambahkan beberapa karakter nol pada sisi kiri sebuah

string dengan jumlah tertentu. Misalnya ditetapkan panjang string akhir adalah 8

karakter, jika input adalah 1101, output akan menjadi 00001101. Jika input adalah 1010010, output yang dihasilkan adalah 01010010. Fungsi ini membutuhkan 2 buah parameter, yang pertama adalah string input, yang kedua adalah panjang pad yang diinginkan dengan tipe data integer. Output fungsi bertipe string. Fungsi zero left pad dirancang dengan algoritma sebagai berikut:

(41)

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

28

Tabel 3.4 Algoritma Fungsi Zero Left Pad

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 9 10

string function zero_lpad( string input,

¬int pad_length){

int in_len←strlen(input); int i←0;

for i=in_len to pad_length do

input←"0".input; i++; end for return input; } 2 1+1 1 (1+1)*n (1+1)*n 2*n 1 Total Kompleksitas 6*n + 6

Algoritma tersebut mempunyai kompleksitas 6n + 6, dengan O(n). n adalah banyaknya karakter “0” yang akan ditambahkan. Algoritma tersebut menambahkan karakter “0” pada sisi kiri sebanyak panjang pad - panjang string input.

Dalam desain ketiga algoritma kompresi yang dirancang, maksimum panjang pad yang digunakan adalah 14 karakter. Sehingga nilai n maksimum adalah 14, dan kompleksitas fungsi zero left pad akan konstan menjadi 6(14) + 6 = 90 pada

worst case dengan O(1).

3.1.1.5 Fungsi Zero Right Pad

Fungsi ini mirip dengan zero left pad. Namun penambahan “0” dilakukan pada sisi kanan. Misalnya ditetapkan panjang string akhir adalah 8 karakter, jika input adalah 1101, output akan menjadi 11010000. Jika input adalah 1010010, output yang dihasilkan adalah 10100100. Fungsi ini membutuhkan 2 buah parameter, yang pertama adalah string input, yang kedua adalah panjang padding yang diinginkan bertipe integer. Output fungsi bertipe string. Fungsi zero right pad dirancang dengan algoritmaseperti pada tabel 3.5.

(42)

Tabel 3.5 Algoritma Fungsi Zero Right Pad

Baris Pseudo code Waktu eksekusi

1 2 3 4 5 6 7 8 9 10

string function zero_rpad(string input,

¬int pad_length){

int in_len←strlen(input); int i←0;

for i= in_len to pad_length do

input←input."0"; i++; end for return input; } 2 1+1 1 (1+1)*n (1+1)*n 2*n 1 Total Kompleksitas 6*n + 6

Untuk kompleksitas fungsi sama dengan zero left pad, 6n + 6, dengan O(n). n adalah banyaknya karakter “0” yang akan ditambahkan.

Kedua fungsi ini sengaja dipisahkan untuk efisiensi, karena dalam desain algoritma nantinya fungsi zero left pad akan sering digunakan, sedangkan fungsi zero

rightpad hanya beberapa kali digunakan.

3.1.2 Perancangan Fungsi Khusus

Perancangan fungsi khusus adalah perancangan fungsi atau sub program yang digunakan dalam perancangan algoritma LZ77, LZ78 dan LZW. Karena dalam beberapa tahap ketiga algoritma memerlukan fungsi yang sama, maka lebih efisien untuk memisahkannya menjadi sebuah sub program. Berbeda dengan desain fungsi dasar yang bersifat umum, desain fungsi khusus sedikit lebih kompleks dan merupakan bagian dari perancangan algoritma kompresi yang akan dibahas.

3.1.2.1 Fungsi Bit Stream to String

Fungsi bit stream to string digunakan oleh ketiga algoritma kompresi untuk mengkonversi bit stream menjadi string yang terdiri dari karakter-karakter ASCII sebelum di tulis kedalam file akhir. Fungsi ini diperlukan pada proses kompresi (encoding).

Bit stream yang akan dikompresi berupa sebuah string yang berisi angka

biner, seperti “0100101010110”. Bit stream ini adalah output dari proses encoding masing-masing algoritma kompresi. Untuk menyimpan hasil encoding ke dalam

Gambar

Tabel 2.1 Algoritma Dasar LZ77 Encoding
Tabel 2.2 Algoritma Dasar LZ77 Decoding
Tabel 2.4 Algoritma Dasar LZ78 Encoding
Tabel 2.7 Contoh Cara Kerja Algoritma LZW  String I  Di dalam dictionary?  Entry baru  Output   keterangan
+7

Referensi

Dokumen terkait

AICS - Inventarisasi Bahan Kimia Australia; ASTM - Masyarakat Amerika untuk Pengujian Bahan; bw - Berat badan; CERCLA - Undang-Undang Tanggapan, Kompensasi, dan Tanggung Jawab

Pengaruh Tingkat Inflasi, Suku Bunga, dan Nilai Tukar Terhadap Harga Saham Perusahaan Bank BUMN Di Bursa Efek Indonesia Variabel Independen: Tingkat Inflasi, Suku

A PUJI DWI LESTARI ENTRY JOURNAL A NINDY MERLIANA PUTRI ENTRY JOURNAL A ALVY NURUL HIDAYAH ENTRY JOURNAL A AMMI ERWATI ENTRY JOURNAL G RANI ROFITA ENTRY JOURNAL E CATUR

Liability based on fault in principle refers to Article 1 paragraph (1) of the Criminal Code (KUHP) which explicitly states that an act can not be criminal,

Bahan baku ikan yang akan digunakan dalam pembuatan sosis harus dalam.. keadaan segar dan mempunyai mutu yang

This data is similar with a study conducted in Saudi Arabia 11 which shows visual impairment is most common in students aged 7–8 years and were of 3 rd to 4 th grade.. One

Republik Indonesia, Peraturan Presiden Nomor 44 Tahun 2016 tentang Bidang Usaha Yang Tertutup Dan Bidang Usaha Yang Terbuka Dengan Persyaratan Di Bidang Penanaman Modal, pasal 1

Dalam melakukan penelitian ini, peneliti ingin membatasi hanya dengan memahami bagaimana kasus chat mesum Habib Rizieq dan Firda Husein disebarkan