• Tidak ada hasil yang ditemukan

SKRIPSI. Diajukan Untuk Memenuhi Salah Satu Syarat Memperoleh Gelar Sarjana Komputer Program Studi Teknik Informatika

N/A
N/A
Protected

Academic year: 2021

Membagikan "SKRIPSI. Diajukan Untuk Memenuhi Salah Satu Syarat Memperoleh Gelar Sarjana Komputer Program Studi Teknik Informatika"

Copied!
104
0
0

Teks penuh

(1)

i HALAMAN JUDUL

PERBANDINGAN KOMPRESI TEKS MENGGUNAKAN

ALGORITMA HUFFMAN STATIS, HUFFMAN DINAMIS

DAN MODIFIKASI ALGORITMA HUFFMAN

SKRIPSI

Diajukan Untuk Memenuhi Salah Satu Syarat Memperoleh Gelar Sarjana Komputer

Program Studi Teknik Informatika

Disusun oleh: Yohanes Beny Prasetyo

115314040

PROGRAM STUDI TEKNIK INFORMATIKA JURUSAN TEKNIK INFORMATIKA FAKULTAS SAINS DAN TEKNOLOGI

UNIVERSITAS SANATA DHARMA YOGYAKARTA

(2)

ii

HALAMAN JUDUL (English)

COMPARISON TEXT COMPRESSION USING STATIC

HUFFMAN ALGORITHM, DYNAMIC HUFFMAN

ALGORITHM AND MODIFICATION HUFFMAN

ALGORITHM

A Thesis

Presented as Partial Fulfillment of The Requirements To Obtain Sarjana Komputer Degree

In Informatics Engineering Study Program

Written by: Yohanes Beny Prasetyo

115314040

INFORMATICS ENGINEERING STUDY PROGRAM DEPARTMENT OF INFORMATICS ENGINEERING

FACULTY OF SCIENCE AND TECHNOLOGY SANATA DHARMA UNIVERSITY

YOGYAKARTA

(3)

iii

HALAMAN PERSETUJUAN

(4)

iv

HALAMAN PENGESAHAN

(5)

v

HALAMAN PERSEMBAHAN

“ Mintalah, maka akan diberikan kepadamu; carilah, maka kamu akan mendapat;

ketoklah, maka pintu akan dibukakan bagimu ” – Yesus Kristus

“ Orang muda terkasih,

jangan mengubur talenta-talenta, karunia yang diberikan Allah padamu. Jangan takut memimpikan hal-hal besar “ – Paus Fransiskus

Aku persembahkan skripsi ini untuk : Allah Bapa di surga yang sudah memberikan segalanya bagiku dan semua yang selalu ada dalam suka dan duka ku

(6)

vi

PERNYATAAN KEASLIAN KARYA

Saya menyatakan dengan sesungguhnya bahwa skripsi yang saya tulis ini tidak memuat karya atau bagian karya orang lain, kecuali yang telah disebutkan dalam kutipan dan daftar pustaka sebagaimana layaknya karya ilmiah

Yogyakarta, 11 Januari 2016 Penulis

(7)

vii

LEMBAR PERNYATAAN PERSETUJUAN PUBLIKASI KARYA ILMIAH UNTUK KEPENTINGAN AKADEMIS

Yang bertanda tangan di bawah ini, saya mahasiswa Universitas Sanata Dharma: Nama : Yohanes Beny Prasetyo

NIM : 115314040

Demi pengembangan ilmu pengetahuan, saya memberikan kepada perpustakaan Universitas Sanata Dharma karya ilmiah yang berjudul:

PERBANDINGAN KOMPRESI TEKS MENGGUNAKAN ALGORITMA HUFFMAN STATIS, HUFFMAN DINAMIS

DAN MODIFIKASI ALGORITMA HUFFMAN

Beserta perangkat yang diperlukan (bila ada). Dengan demikian saya memberikan kepada perpustakaan Universitas Sanata Dharma hak untuk menyimpan, mengalihkan dalam bentuk media lain, mengelolanya dalam bentuk pangkalan data, mendistribusikan secara terbatas, dan mempublikasikan di internet atau media lain untuk kepentingan akademis tanpa perlu meminta ijin dari saya maupun memberikan royalty kepada saya selama tetap mencantumkan nama saya sebagai penulis.

Demikian pernyataan ini saya buat dengan sebenarnya.

Yogyakarta, 11 Januari 2016 Yang menyatakan,

(8)

viii

PERBANDINGAN KOMPRESI TEKS MENGGUNAKAN ALGORITMA HUFFMAN STATIS, HUFFMAN DINAMIS

DAN MODIFIKASI ALGORITMA HUFFMAN

ABSTRAK

Permasalahan ukuran file dan waktu yang dibutuhkan menjadi suatu

kendala tersendiri dalam proses penyimpanan atau perpindahan antar media. Solusi permasalahan tersebut telah ditemukan oleh David A. Huffman dengan algoritma yang didasarkan pada pohon biner. Algoritma Huffman mempunyai dua jenis yaitu Huffman Statis dan Huffman Dinamis. Algoritma ini terkenal dalam bidang kompresi data, akan tetapi perkembangan zaman membuktikan algoritma ini memiliki hasil kompresi yang kurang maksimal.

Dalam penelitian ini, akan dilakukan uji perbandingan hasil algoritma Huffman Statis, Huffman Dinamis serta modifikasi algoritma Huffman yang dibuat untuk penelitian ini. Secara umum ketiga algoritma ini mempunyai proses yang sama yaitu proses pengubahan data asli menjadi kode biner (encoding) dan proses pengubahan kode biner menjadi data asli (decoding). Pengujian dilakukan

untuk mengetahui perbandingan waktu kompresi dan besarnya ratio compression

dari ketiga algoritma. Dalam penelitian ini akan diuji teks dengan dua bahasa yaitu Indonesia dan Inggris untuk mengetahui pengaruh bahasa dengan hasil kompresi, yang didasarkan dengan kemunculan tiap karakter. Implementasi algoritma dalam penelitian ini menggunakan bahasa pemrograman Java.

(9)

ix ABSTRACT

COMPARISON TEXT COMPRESSION USING STATIC HUFFMAN ALGORITHM, DYNAMIC HUFFMAN ALGORITHM AND

MODIFICATION HUFFMAN ALGORITHM

ABSTRACT

Problems file size and time taken into an obstacle in the process of storage or displacement between media. Solution these problems have been found by David A . Huffman with the algorithms that based on binary tree. Huffman algorithm have two types is huffman static and huffman dynamic. This algorithm famous in the field of compression data, but time progress prove this algorithm having results compression not optimal.

In this research , test will be done the comparison of the algorithms huffman static , huffman dynamic and algorithms huffman modification made for this study. In general third algorithm have similar process that is the process of transformation data natives to be binary code ( encoding ) and process transformation binary code be real data ( decoding ). Testing be held to find out comparison time compression and the size of the ratio compression of the three algorithm. In this research be tested a text by two languages Indonesian and English to know the influence of language by the results of compression, based with the emergence of every character. The implementation of algorithm in this research using language Java programming.

(10)

x

KATA PENGANTAR

Dengan kerendahan hati, penulis mengucapkan puji dan syukur atas segala berkat dan karunia Tuhan Yesus Kristus sehingga dapat menyelesaikan tugas akhir ini. Selama pengerjaan tugas akhir ini, penulis tidak akan bisa menyelesaikan sendirian tanpa orang-orang hebat yang telah membantu. Terucap terima kasih kepada :

1. Kedua orang tua, bapak Yustinus Sugito dan ibu Chatarina Sutini yang selalu

memberikan semangat dan mendoakan setiap malam untuk penulis.

2. Br. Sarju selaku ketua LKM dan Mbak Iput yang telah memberikan

kesempatan dan membantu saya untuk menyelesaikan studi ini.

3. Bapak Alb. Agung Hadhiatma, S.T., M.T. selaku dosen pembimbing yang

telah memberikan pencerahan kepada penulis sehingga dapat menyelesaikan tugas akhir ini.

4. Ibu Sri Hartati Wijono, S.Si., M.Kom. selaku wakil kepala program studi

Teknik Informatika yang juga telah memberikan pencerahan terhadap penulis untuk dapat menyelesaikan studi ini.

5. Bapak Drs. Haris Sriwindono, M.Kom. selaku penguji tugas akhir penulis

telah memberikan masukan dan arahan yang bermanfaat dalam penulisan tugas akhir ini.

6. Seluruh teman-teman seperjuangan Teknik Informatika angkatan 2011, yang

telah membuat penulis tertawa dan senang ketika pusing menyelesaikan tugas akhir ini.

7. Semua pihak, baik langsung maupun tidak, yang telah membantu

penyelesaian tugas akhir ini.

Penulis menyadari bahwa masih banyak kekurangan dalam tugas akhir ini. Saran dan kritik diharapkan untuk perbaikan-perbaikan pada masa yang akan datang. Semoga bermanfaat.

Yogyakarta, 11 Januari 2016 Penulis,

(11)

xi DAFTAR ISI

1

HALAMAN JUDUL ...i

HALAMAN JUDUL (English) ... ii

HALAMAN PERSETUJUAN ... iii

HALAMAN PENGESAHAN ... iv

HALAMAN PERSEMBAHAN ... v

PERNYATAAN KEASLIAN KARYA ... vi

LEMBAR PERNYATAAN PERSETUJUAN PUBLIKASI KARYA ILMIAH UNTUK KEPENTINGAN AKADEMIS ... vii

ABSTRAK ... viii

ABSTRACT ... ix

KATA PENGANTAR ... x

DAFTAR ISI ... xi

DAFTAR GAMBAR ... xiv

DAFTAR TABEL ... xvi

1 BAB I PENDAHULUAN ... 1 1.1 Latar Belakang ... 1 1.2 Rumusan Masalah ... 3 1.3 Tujuan ... 3 1.4 Batasan Masalah ... 3 1.5 Manfaat Penelitian ... 4 1.6 Luaran Penelitian ... 4 1.7 Sistematika Penulisan ... 5

2 BAB II LANDASAN TEORI ... 6

2.1 Kompresi ... 6

2.1.1 Pengertian ... 6

(12)

xii

2.2 Struktur Data ... 8

2.2.1 Pohon Biner (Binary Tree) ... 9

2.2.2 Quick Sort ... 10

2.3 Algoritma Huffman ... 13

2.3.1 Pohon Biner Huffman ... 13

2.3.2 Huffman Statis ... 16

2.3.3 Huffman Dinamis ... 19

2.4 Dekompresi ... 23

3 BAB III METODOLOGI DAN PERANCANGAN ... 25

3.1 Metode Pengembangan Sistem ... 25

3.2 Gambaran Umum Sistem ... 26

3.3 Analisa Kebutuhan Proses ... 27

3.3.1 Baca Teks ... 28

3.3.2 Pembentukan Pohon Huffman ... 28

3.3.3 Analisis Biner ... 29

3.3.4 Simpan File ... 30

3.3.5 Baca File ... 33

3.3.6 Pengubahan Kode ... 34

3.3.7 Simpan File (Proses Decoding) ... 34

3.4 Optimalisasi Algoritma Huffman ... 35

3.5 Desain User Interface ... 38

3.6 Spesifikasi Software dan Hardware ... 39

4 BAB IV IMPLEMENTASI DAN ANALISIS ... 41

4.1 Proses Encoding ... 41

4.1.1 Implementasi Proses Baca Teks ... 41

4.1.2 Implementasi Proses Pembentukan Pohon Biner ... 43

4.1.3 Implementasi Proses Analisis Biner ... 47

4.1.4 Implementasi Proses Encoding ... 55

(13)

xiii

4.2 Proses Decoding ... 62

4.2.1 Implementasi Proses Baca Teks File Kompresi ... 62

4.2.2 Implementasi Proses Pengubahan Kode (Decoding) ... 64

4.2.3 Implementasi Proses Pembentukan File Hasil Decoding ... 68

5 BAB V PENGUJIAN DAN ANALISIS ... 70

5.1 Perbandingan Jumlah Bit ... 70

5.2 Perbandingan Ukuran File Kompresi dan Waktu Proses ... 73

5.3 Hubungan Peluang Kemuculan Setiap Karakter dengan Jumlah Bit Hasil Kompresi ... 79

5.3.1 Data Bahasa Indonesia ... 80

5.3.2 Data Bahasa Inggris ... 82

6 BAB VI PENUTUP ... 85

6.1 Kesimpulan ... 85

6.2 Saran ... 86

(14)

xiv

DAFTAR GAMBAR

Gambar 2.1 Penentuan pivot dan cara kerja Quick Sort ... 11

Gambar 2.2 Pohon biner sempurna dan beberapa contoh pohon biner ... 13

Gambar 2.3 Flowchart pembentukan pohon biner Huffman ... 14

Gambar 2.4 Hasil dari pohon Huffman ... 18

Gambar 2.5 Proses pembentukan pohon Huffman Dinamis FGK ... 20

Gambar 2.6 Pembentukan pohon Huffman Dinamis ... 21

Gambar 2.7 Proses dekompresi dengan pohon Huffman ... 24

Gambar 3.1 Diagram konteks ... 27

Gambar 3.2 Block diagram encoding... 27

Gambar 3.3 Block diagram decoding... 28

Gambar 3.4 Pembentukan pohon Huffman modifikasi... 37

Gambar 3.5 Interface encoding ... 38

Gambar 3.6 Interface decoding ... 39

Gambar 4.1 Implementasi proses memilih file encoding ... 42

Gambar 4.2 Implementasi proses membaca file encoding ... 42

Gambar 4.3 Implementasi pembentukan pohon Huffman Statis ... 43

Gambar 4.4 Implementasi pembentukan pohon Huffman Dinamis ... 44

Gambar 4.5 Implementasi pembentukan pohon Huffman Modifikasi ... 46

Gambar 4.6 Source code kelas KodeHuffman.java ... 48

Gambar 4.7 Implementasi analisis biner Huffman Statis dan Modifikasi ... 49

Gambar 4.8 Implementasi analisis biner Huffman Statis method find() ... 50

Gambar 4.9 Implementasi analisis biner Huffman Modifikasi method find() . 51-52 Gambar 4.10 Implementasi analisis biner Huffman Dinamis ... 53

Gambar 4.11 Implementasi analisis biner Huffman Dinamis ... 54

Gambar 4.12 Implementasi encoding Huffman Statis dan Dinamis ... 55

Gambar 4.13 Implementasi encoding Huffman Modifikasi ... 56

Gambar 4.14 Implementasi preprocessing ... 58

(15)

xv

Gambar 4.16 Implementasi proses simpan file kompresi ... 61

Gambar 4.17 Implementasi proses memilih file decoding ... 62

Gambar 4.18 Implementasi proses membaca file decoding ... 63

Gambar 4.19 Implementasi proses decoding header ... 64

Gambar 4.20 Implementasi proses decoding isi ... 65

Gambar 4.21 Implementasi proses decoding Huffman Dinamis dan Statis... 66

Gambar 4.22 Implementasi proses decoding Huffman Modifikasi ... 67

Gambar 4.23 Implementasi proses pembentukan file decoding... 68

Gambar 5.1 Kelas pengujian perbandingan jumlah bit ... 71

Gambar 5.2 Capture hasil pengujian jumlah bit ... 71

Gambar 5.3 Lanjutan capture hasil pengujian jumlah bit ... 72

Gambar 5.4 Frame pengujian jumlah bit dan ratio compression ... 73

Gambar 5.5 Tampilan awal aplikasi ... 74

Gambar 5.6 Tampilan klik browse untuk memilih file ... 74

Gambar 5.7 Tampilan encoding untuk memilih salah satu algoritma ... 75

Gambar 5.8 Tampilan loading proses encoding ... 75

Gambar 5.9 Pemberitahuan jika proses encoding berhasil ... 76

Gambar 5.10 Grafik waktu yang dibutuhkan untuk kompresi ... 78

(16)

xvi

DAFTAR TABEL

Tabel 2.1 Tabel kode Huffman ... 18

Tabel 5.1 Tabel hasil perbandingan jumlah bit ... 72

Tabel 5.2 Tabel hasil pengujian jumlah bit dan ratio compression ... 73

Tabel 5.3 Data ukuran file pengujian ... 77

Tabel 5.4 Tabel hasil pengujian ... 77

Tabel 5.5 Hasil pengujian jumlah bit data bahasa Indonesia ... 81

Tabel 5.6 Peluang karakter terbanyak data bahasa Indonesia ... 81

Tabel 5.7 Hasil pengujian jumlah bit data bahasa Inggris ... 83

(17)

1

1

BAB I

PENDAHULUAN

1.1 Latar Belakang

Pada zaman sekarang ukuran suatu file menjadi bertambah semakin besar

dan membutuhkan memori penyimpanan yang lebih serta membutuhkan waktu transfer yang lama. Ukuran file yang besar tidak terlalu menjadi masalah karena ukuran hard disk semakin lama semakin besar dengan harga yang semakin terjangkau. Tetapi jika mengenai file transfer, masalah ukuran file yang besar menjadi penghambat dalam waktu transfer yang menjadi semakin lama.

Dalam bidang ilmu komputer, permasalahan kompresi data sudah menjadi kasus klasik dan telah muncul beberapa algoritma dalam mengatasi permasalahan tersebut. Beberapa algoritma yang ada antara lain algortima Huffman, Shannon-Fano, Lempel Ziv Welch (LZW), Lempel Ziv Storer Szymanski (LZSS) dan masih banyak algoritma lainnya. Namun pada skripsi ini, lebih dibahas tentang algoritma Huffman. Kenapa memilih algoritma Huffman, karena algoritma Huffman merupakan dasar dari berbagai algoritma pengkompresian serta algoritma yang paling sederhana. Algoritma Huffman pertama kali diperkenalkan oleh David A. Huffman pada tahun 1952 yang menanggapi tantangan oleh dosennya Robert M. Fano untuk membuat sebuah pohon biner yang efisien. Dalam algoritma Huffman, ada dua macam tipe algoritma yaitu algoritma Huffman Statis dan algoritma Huffman Dinamis. Algoritma Huffman Dinamis lebih mudah dan fleksibel dalam

(18)

pembuatan Huffman Tree karena pohon Huffman akan otomatis berubah menyesuaikan kode yang sering muncul dan akan ditempatkan di dekat root

sehingga tidak membutuhkan waktu preprocessing yang lama. Hal ini berbeda

dengan algoritma Huffman Statis yang harus melakukan preprocessing dengan

memindai setiap karakter dan mengurutkannya dari yang paling sering muncul sampai yang paling sedikit muncul.

Dalam ilmu komputer dan informasi, Huffman coding adalah suatu entropi

algoritma yang digunakan untuk teknik lossless compression [3]. Data yang

dikompres menggunakan algoritma ini akan menghasilkan hasil dekompresi yang sama dengan aslinya. Penggunaan teknik ini banyak digunakan untuk kompresi data teks serta informasi penting lainnya yang tidak diperbolehkan adanya data informasi yang hilang.

Saat ini telah banyak tulisan yang mengangkat kasus tentang kompresi data dengan berbagai macam algoritma yang ada. Banyak yang mengangkat kasus

tersebut dengan cara membandingkan efficiency dari algoritma-algoritma yang

ada, implementasi algoritma dengan menggabungkan dua algoritma kompresi dan membandingkan kompleksitas dari semua algoritma. Dalam tulisan ini akan dibahas tentang algoritma Huffman yang akan diimplementasikan pada data teks. Dengan penggunaan algoritma Huffman sebagai dasar dari penelitian ini, maka modifikasi untuk pengoptimalan akan dilakukan mengingat juga posisi algoritma Huffman seperti yang telah disebutkan sebelumnya. Pengujian dalam penelitian ini akan dilakukan untuk algoritma Huffman Statis, Huffman Dinamis dan pengembangan algoritma Huffman. Sehingga nantinya akan didapat sebuah

(19)

pengembangan algoritma dari Huffman yang dapat berguna bagi optimalisasi transfer data dan mengoptimalkan kapasitas penyimpanan memori.

1.2 Rumusan Masalah

Berdasarkan latar belakang yang dipaparkan sebelumnya maka dapat dibuat beberapa rumusan masalah antara lain:

1. Bagaimana cara mengecilkan ukuran suatu file teks untuk mempercepat

transfer data antar media penyimpanan?

2. Bagaimana cara mengecilkan ukuran suatu file teks untuk mempercepat proses

upload atau download?

3. Bagaimana cara mengecilkan ukuran suatu file teks untuk menghemat

kapasitas memori penyimpanan serta mengoptimalkan kapasitas memori?

1.3 Tujuan

Tujuan dari penelitian ini adalah menemukan optimalisasi dari algoritma Huffman untuk kompresi data teks sebagai suatu cara untuk mempercepat proses transfer antar media penyimpanan, serta untuk menghemat dan mengoptimalkan kapasitas memori penyimpanan.

1.4 Batasan Masalah

Dalam penelitian ini, penulis menentukan beberapa batasan masalah untuk mempersempit lingkup permasalahan, antara lain :

(20)

1. Algoritma yang dibahas dalam tulisan ini hanya digunakan untuk data bertipe teks. Data yang dimaksud adalah data berisi huruf, angka atau karakter yang terdapat dalam standar ASCII.

2. Data teks yang digunakan hanya untuk file betipe .TXT (Text Document).

1.5 Manfaat Penelitian

Manfaat yang didapat dari penelitian ini, antara lain :

1. Memberikan analisis sejauh mana algoritma Huffman dapat

dikembangkan untuk menghasilkan algoritma kompresi yang lebih baik.

2. Membantu masyarakat dalam melakukan pengoptimalan memori

penyimpanan serta mempermudah dan mempercepat dalam proses transfer

(upload dan download) suatu file teks.

1.6 Luaran Penelitian

Luaran penelitian ini adalah sebuah algoritma kompresi file teks yang merupakan pengembangan dari algoritma Huffman. Selain itu, produk yang didapat adalah sebuah aplikasi untuk menjalankan ketiga algoritma.

(21)

1.7 Sistematika Penulisan BAB I PENDAHULUAN

Berisi latar belakang, rumusan masalah, tujuan, batasan masalah, manfaat penelitian, luaran penelitian dan sistematika penulisan untuk mempermudah pemahamannya.

BAB II LANDASAN TEORI

Bab ini berisi mengenai berbagai macam landasan teori yang digunakan untuk penelitian ini.

BAB III METODOLOGI DAN PERANCANGAN

Bab ini berisi analisa dan gambaran umum dari perancangan algoritma yang akan dibuat dari pengembangan algoritma Huffman.

BAB IV IMPLEMENTASI

Berisi implementasi dari algoritma serta rancangan yang telah dibuat. BAB V PENGUJIAN DAN ANALISIS

Berisi pengujian dari algoritma yang telah dibuat kedalam beberapa kondisi pengujian.

BAB VI PENUTUP

Berisi kesimpulan yang diperoleh dari keseluruhan proses pembuatan tugas akhir ini, serta beberapa saran yang dapat digunakan untuk pengembangan algoritma lebih lanjut.

(22)

6

2

BAB II

LANDASAN TEORI

Pada bab ini penulis akan membahas serta menjelaskan mengenai teori-teori yang mendukung penelitian dalam proses analisa dan implementasi algoritma. Hal yang dibahas mencakup : pengertian kompresi file, jenis-jenis kompresi file, struktur data, binary tree, pengurutan data, algoritma Huffman Statis dan algoritma Huffman Dinamis.

2.1 Kompresi 2.1.1 Pengertian

Kompresi adalah mengurangi jumlah data dalam file, gambar atau video tanpa mengurangi kualitas dari data asli. Itu juga berarti mengurangi jumlah bit

yang diperlukan untuk menyimpan dan atau mengirimkan melalui media digital[1].

Dalam kompresi, jika data tersebut akan dipergunakan kembali maka harus dilakukan proses dekompresi. Dekompresi adalah suatu proses pengubahan kembali kode-kode yang digunakan untuk mengurangi jumlah bit menjadi data awal.

Pemilihan algoritma yang tepat dalam kompresi tidak hanya bagaimana algoritma itu dapat mengembalikan data menjadi seperti semula, tetapi ada beberapa faktor lain yang dipertimbangkan. Faktor tersebut antara lain :

(23)

2. Kecepatan kompresi

3. Ukuran hasil kompresi

4. Besarnya redudansi

5. Ketepatan hasil dekompresi

6. Kompleksitas algoritma

2.1.2 Jenis Kompresi

Teknik kompresi itu sendiri terdiri dari dua jenis yaitu Lossless

Compression dan Lossy Compression. Kedua jenis kompresi tersebut akan dijelaskan sebagai berikut :

2.1.2.1 Lossless Compression

Jika data dikompresi menggunakan teknik Lossless Compression, hasil

dekompresiakan menghasilkan data yang sama dengan aslinya. Teknik ini biasa digunakan untuk aplikasi yang tidak diperbolehkan adanya perbedaan antara data asli dengan data hasil dekompresi. Contoh : ZIP, RAR, GZIP, 7-ZIP.

Kelemahan dari metode ini adalah ratio kompresi yang rendah. Rasio dapat dihitung dengan persamaan :

𝑅𝑎𝑠𝑖𝑜 = (1 −𝑈𝑘𝑢𝑟𝑎𝑛 𝑘𝑜𝑚𝑝𝑟𝑒𝑠𝑖

𝑈𝑘𝑢𝑟𝑎𝑛 𝑎𝑠𝑙𝑖 ) 𝑥 100%

Penerapan algoritma ini biasanya dilakukan pada data teks yang tidak diperbolehkan adanya bit yang hilang, serta pada kompresi citra medis. Oleh

(24)

karena itu secara umum, compression ratio yang tinggi tidak akan mungkin terjadi

jika menggunakan teknik lossless compression[2].

2.1.2.2 Lossy Compression

Teknik Lossy Compression memperbolehkan adanya informasi dan data

yang hilang setelah proses dekompresi. Contoh : MP3, JPEG, MPEG dan WMA. Kelebihan dari teknik ini adalah ukuran file yang lebih kecil namun masih dapat memenuhi syarat setelah di dekompresi. Teknik ini sebenarnya membuang bagian-bagian yang tidak berguna, tidak begitu dirasakan dan tidak begitu dilihat sehingga manusia masih beranggapan bahwa data tersebut masih memenuhi syarat dan masih bisa digunakan.

Jika dilihat dari contoh di atas, sebagian besar produk hasil dari teknik ini merupakan file multimedia seperti lagu, gambar dan video. Hal itu didasarkan karena file multimedia hanya untuk didengar atau dilihat, sehingga data yang hilang tidak akan terlalu mempengaruhi selagi masih dalam batas wajar.

2.2 Struktur Data

Dalam penelitian ini, salah satu konsep terpenting yang diambil dari ilmu komputer adalah struktur data. Struktur data merupakan sebuah cabang dari ilmu komputer yang mempelajari tentang cara dan algoritma dalam pengolahan data. Dalam algoritma Huffman, struktur data merupakan dasar terpenting di mana pembentukan pohon biner tersebut diambil dari konsep struktur data.

(25)

Selain konsep pohon biner, dalam algoritma Huffman juga terdapat konsep pengurutan data. Pengurutan data digunakan untuk preprocessing dalam algoritma Huffman Statis di mana setelah data di cek frekuensi kemunculannya, maka data akan diurutkan secara descending (dari besar ke kecil). Seperti yang telah dibahas sebelumnya, data dengan kemunculan terbanyak ditempatkan dekat dengan akar.

2.2.1 Pohon Biner (Binary Tree)

Sebuah pohon biner terbuat dari titik – titik (nodes), di mana setiap titik mempunyai pointer kiri dan kanan serta data element. Pointer akar terletak di

paling atas dari pohon. Pointer kiri dan kanan secara rekursif membentuk subtree

[5]

.

Dalam setiap pohon biner, terdapat sifat – sifat pohon antara lain [8]:

1. Node / simpul : obyek sederhana elemen dari senarai berantai yang dapat memiliki elemen dan penunjuk ke node lain.

2. Edge : garis yang menghubungkan dua buah node.

3. Path : sederetan node / edge dari awal node ke node lain (target). 4. Root node : node pertama dalam sebuah tree / subtree.

5. Subtree : tree yang merupakan bagian dari sebuah tree yang lebih besar. 6. Left Subtree : subtree yang berada di sebelah kiri sebuah tree.

7. Right subtree : subtree yang berada di sebelah kanan sebuah tree. 8. Parent : node yang berada tepat di atas sebuah node.

(26)

10. Left Child : node pertama dalam seuah left subtree / parentnode dari left subtree.

11. Right Child : node pertama dalam seuah right subtree / parentnode dari right subtree.

12. Sibling : node dengan parent yang sama.

13. Leaf Node / terrminal simpul : node yang tidak memiliki child. 14. Internal Node : node yang bukan leaf node.

Pohon biner secara umum mempunyai ciri bahwa setiap node hanya

mempunyai anak paling banyak dua. Sering kali pohon biner yang baik dan sempurna adalah pohon biner yang seimbang. Pohon biner seimbang yaitu pohon

yang mempunyai tinggi subtree kanan dan kiri tidak lebih dari satu, semua daun

terisi dan semua simpul memiliki dua anak [8].

2.2.2 Quick Sort

Salah satu metode dalam pengurutan data adalah Quick Sort. Pengurutan merupakan salah satu konsep dari struktur data yang digunakan dalam mengolah

data. Pengurutan itu sendiri dapat dibedakan menjadi dua yaitu ascending

(pengurutan dari data terkecil ke data terbesar) dan descending (pengurutan dari data terbesar ke data terkecil). Banyak algoritma pengurutan yang ada seperti bubble sort, selection sort, insertion sort, dan merge sort . Ide dasar metode quick sort adalah mempartisi array ke dalam subarray kiri dan subarray kanan sehingga setiap elemen di subarray kiri lebih kecil dari setiap elemen di subarray kanan [9].

(27)

Dari ide dasar metode quick sort tersebut, dapat dipahami bahwa inti dari

pengurutannya adalah membagi data menjadi dua bagian. Cara kerja quick sort [9]:

1. Tentukan elemen sebagai pivot dari array, misalkan elemen awal.

2. Atur array sehingga semua elemen yang lebih kecil atau sama dengan

pivot di sebelah kiri pivot dan semua elemen yang lebih besar dari pivot berada di sebelah kanan.

3. Secara rekursif quick sort subarray (kiri) dengan elemen yang lebih kecil

atau sama dengan dari pivot dan subarray (kanan) dengan elemen yang lebih besar dari pivot.

Gambar 2.1 Penetuan pivot dan cara kerja Quick Sort

Menurut gambar cara kerja quick sort di atas, penentuan sebuah pivot atau titik acuan didasarkan pada elemen awal dalam array. Penentuan ini akan terus dilakukan pada setiap hasil pembagian data hingga tidak ada array yang tersisa

(28)

atau dengan kata lain semua data berdiri sendiri. Algoritma quick sort itu sendiri adalah sebagai berikut [9] :

Larik A dengan N elemen akan diurutkan secara menaik (ascending).

Pemanggilan fungsi quick sort rekursif dengan parameter array x, indek awal dan indek akhir.

Parameter : x adalah array bertipe int.

awal = indek awal dari vektor / subvektor yang akan diurutkan = 0

akhir = indek akhir dari vektor / subvektor yang akan diurutkan = N-1

Test apakah indek awal < akhir, jika ya kerjakan langkah – langkah sebagai berikut:

Langkah 1 : tentukan i = awal + 1, j = akhir.

Langkah 2 : tambahkan nilai i dengan 1 selama i <= akhir dan x[i] <= x[awal].

Langkah 3 : kurangi nilai j dengan 1 selama j > awal dan x[j] > x[awal].

Langkah 4 : kerjakan langkah 5 sampai 7 selama i < j.

Langkah 5 : tukarkan nilai x[i] dengan x[j].

Langkah 6 : tambahkan nilai i dengan 1 selama i <= akhir dan x[i] <= x[awal].

Langkah 7 : kurangi nilai j dengan 1 selama j > awal dan x[j] > x[awal].

Langkah 8 : tukarkan nilai x[awal] dengan x[j].

Langkah 9 : panggil fungsi quick sort rekursif dengan parameter indek awal =

(29)

Langkah 10 : panggil fungsi quick sort rekursif dengan parameter indek awal = j + 1 dan indek akhir = akhir.

Langkah 11 : selesai.

2.3 Algoritma Huffman 2.3.1 Pohon Biner Huffman

Pohon adalah graf tak-berarah terhubung yang tidak mengandung sirkuit. Sedangkan pohon biner adalah pohon berakar dimana setiap simpul cabangnya mempunyai paling banyak dua anak. Pohon biner teratur adalah pohon biner

dimana setiap simpul cabangnya mempunyai dua buah anak[4].

Gambar 2.2 Pohon biner sempurna dan beberapa contoh pohon biner Kompresi data pada pengkodean Huffman didasarkan pada frekuensi kemunculan setiap karakternya. Struktur data yang terbentuk pada algoritma Huffman adalah pohon biner berbobot, dimana skema pengkodeannya dapat dilihat dari flowchart berikut :

(30)

Gambar 2.3 Flowchart pembentukan pohon biner Huffman

Dari pohon biner tersebut dapat diperoleh bahwa karakter dengan peluang kemunculan terbesar memiliki jumlah bit yang kecil. Setelah terbentuk pohon biner tersebut, maka karakter data asli tersebut diganti dengan kode bit berdasarkan pohon biner tadi. Proses ini dinamakan encoding.

Semua data yang di kompresi harus dikembalikan lagi menjadi data

semula (decoding). Dalam Huffman terdapat 2 cara untuk melakukan decoding

(31)

2.3.1.1 Menggunakan Pohon Biner Huffman

Langkah-langkah yang dilakukan dalam proses decoding dengan pohon

biner Huffman adalah :

a. Baca bit pertama dari string biner masukan

b. Lakukan traversal pada pohon Huffman mulai dari akar sesuai dengan bit

yang dibaca. Jika bit yang dibaca adalah 0, baca anak kiri. Tetapi jika yang dibaca adalah 1, baca anak kanan.

c. Jika anak dari pohon bukan daun, baca bit berikutnya dari string biner.

d. Traversal hingga ditemukan daun.

e. Pada daun tersebut, simbol ditemukan dan proses penguraian kode selesai.

f. Proses penguraian kode dilakukan hingga seluruh string biner masukan

diproses.

2.3.1.2 Menggunakan Tabel Kode Huffman

Kode Huffman itu sendiri disusun menggunakan kode awalan (prefiks code) yang berarti kode awalan dari sebuah simbol/karakter tidak boleh menjadi awalan suatu simbol lain. Oleh karena itu rangkaian bit hasil enkripsi dapat dengan mudah diuraikan menjadi data semula. Yang perlu dilakukan hanyalah melihat rangkaian setiap bit hasil enksripsi di dalam tabel kode Huffman.

Kompleksitas dari algoritma Huffman adalah T(𝑛) = 𝑂(𝑛 log 𝑛).

Dikarenakan dalam sekali proses iterasi, pada saat penggabungan dua buah pohon yang mempunyai frekuensi terkecil pada sebuah akar membutuhkan waktu

(32)

𝑂(log 𝑛), dan proses tersebut dilakukan berulang kali sampai hanya tersisa satu

buah pohon Huffman, yang berarti dilakukan sebanyak n kali [5].

2.3.2 Huffman Statis

Algoritma Huffman Statis merupakan algoritma dasar dari Huffman

Coding. Untuk mendapatkan kode Huffman, mula-mula kita harus menghitung dahulu peluang kemunculan tiap karakter dalam teks. Pada Huffman Statis pembentukan pohon Huffman adalah sebagai berikut :

1. Pilih dua karakter dengan peluang terkecil. Kedua simbol tadi

dikombinasikan sebagai simpul orangtua sehingga menjadi simbol 2 karakter dengan peluang yang dijumlahkan.

2. Selanjutnya pilih 2 simbol berikutnya termasuk simbol baru yang

mempunyai peluang terkecil.

3. Prosedur yang sama dilakukan pada dua simbol berikutnya yang

mempunyai peluang terkecil [4].

Contoh :

Data teks : EBCDAAEA = 8 huruf

Membutuhkan memori : 8 x 8 bit = 64 bit (8 byte) Kode ASCII :

E = 01000101 B = 01000010 C = 01000011 D = 01000100

(33)

A = 01000001 A = 01000001 E = 01000101 A = 01000001

Frekuensi kemunculan data string di atas A = 3, E = 2, B=1, C = 1 dan D = 1.

Maka peluang yang didapat :

 C dan D menjadi 1 (CD) sehingga probabilitas menjadi 1/8 + 1/8 =

2/8

 CD dan B menjadi 1 (BCD) sehingga probabilitas menjadi 1/8 + 2/8

= 3/8

 BCD dan E menjadi 1 (EBCD) sehingga probabilitas menjadi 2/8 +

3/8 = 5/8

 EBCD dan A menjadi 1 (AEBCD) sehingga probabilitas menjadi 3/8

+ 5/8=8/8

Probabilitas yang lebih besar akan diletakkan di sebelah kiri dan paling dekat dengan robot. Maka hasil pohon Huffman adalah sebagai berikut :

(34)

A E B D C EABCD ABCD BCD CD 1 1 1 1 0 0 0 0

Gambar 2.4 Hasil dari pohon Huffman

Huruf Kode A 1 E 01 B 001 C 0000 D 0001

Tabel 2.1 Tabel Kode Huffman

Dengan melakukan pengkodean di atas, maka didapat sebuah kode yang sangat pendek. Sebagai contoh untuk karakter A yang sebelumnya berjumlah 8 bit hanya menjadi 1 bit.

Sehingga kapasitas memori yang diperlukan : Sebelum : 8 x 8 bit = 64 bit

(35)

2.3.3 Huffman Dinamis

Algoritma Huffman Dinamis atau Adaptive Huffman Coding (AHC)

merupakan suatu lanjutan dari algoritma Huffman Statis di mana AHC merupakan algoritma yang lebih efisien dan mampat. AHC lebih sering dilakukan pada proses

transfer data (streaming). Berikut algoritma AHC FGK (Faller-Gallager-Knuth)[6]

:

1. Buat suatu simbol yang bernama NYT (Not Yet Transmitted) atau berarti

belum ditransmisi.

2. Jika simbol adalah NYT, tambahkan 2 anak NYT tersebut, satunya akan

menjadi NYT baru dan yang lainnya adalah untuk simbol, akan menambahkan nilai dari NYT akar dan daun akan terbentuk. Jika daun baru terbentuk lanjutkan langkah 4, jika telah ada sebelumnya periksa dulu di langkah 3.

3. Jika simbol yang dimasukan terakhir memiliki probabilitas yang lebih

tinggi maka akan ditukar dengan yang sebelumnya menempati tempat kemunculan tertinggi.

4. Tambahkan nilai dari akar tersebut.

5. Jika bukan akar, kembali ke akar inang lalu lanjutkan ke langkah 2, selain

itu selesai.

Dari algoritma di atas, maka dapat di masukan ke dalam contoh berikut. Contoh :

(36)

Gambar 2.5 Proses pembentukan pohon Huffman Dinamis FGK

1. Pohon Huffman kosong dan berisi NYT 256 (2 byte).

2. Karakter pertama adalah a, dan disimpan pada anak NYT 256 yang

bobotnya bertambah 1 dan menambah anak NYT 254. Simbol a memiliki bobot 1 dengan alamat 255.

3. Karakter kedua adalah b, dan disimpan pada anak NYT 254. Simbol b

memiliki bobot 1 dengan alamat 253 serta NYT 254 memiliki anak NYT 252.

4. Karakter berikutnya adalah b lagi, maka akan dimasukan ke 253 (proses

searching) dan bobotnya menjadi 2. Lalu dibandingkan dengan karakter a, karena bobot b lebih besar dari a maka posisi a dan b ditukar.

Dari pohon di atas maka dapat disimpulkan bahwa karakter A memiliki code “01” dan karakter B memiliki code “1”.

Dari contoh Huffman Dinamis FGK di atas, dapat diterapkan pada data yang sama EBCDAAEA yaitu dengan langkah-langkah sebagai berikut :

(37)

E 1 B 1 C 1 4 D 1 E 1 B 1 C 1 5 D 1 A 1 A 2 B 1 C 1 6 D 1 E 1 E 1 1 E 1 B 1 2 E 1 B 1 3 C 1 A 2 E 2 C 1 7 D 1 B 1 A 3 E 2 C 1 8 D 1 B 1

Gambar 2.6 Pembentukan pohon Huffman Dinamis

1. Karakter pertama ‘E’ masuk, dan menempati posisi dekat dengan akar.

Bobot atau jumlah ‘E’ adalah 1.

2. Karakter kedua ‘B’ masuk dan mengecek posisi, karena posisi dekat

dengan akar sudah ditempati ‘E’ maka ‘B’ membentuk posisi di bawah ‘E’. Bobot karakter ‘B’ adalah 1.

(38)

3. Karakter ketiga ‘C’ masuk maka akan mengecek dan membuat posisi di bawah ‘B’. Bobot karakter ‘C’ adalah 1.

4. Karakter keempat ‘D’ masuk maka akan mengecek dan membuat posisi di

bawah ‘C’. Bobot karakter ‘D’ adalah 1.

5. Karakter kelima ‘A’ masuk maka akan mengecek dan membuat posisi di

bawah ‘D’. Bobot karakter ‘A’ adalah 1.

6. Karakter keenam ‘A’ masuk dan akan mengecek setiap node. Karena

karakter ‘A’ sudah membuat node di posisi paling bawah maka bobot ‘A’ akan bertambah menjadi 2. Perubahan bobot ini akan mengubah posisi ‘A’ menjadi dekat dengan akar dan bertukar posisi dengan karakter ‘E’.

7. Karakter ketujuh ‘E’ masuk dan mengecek setiap node. Karakter ‘E’ juga

telah dibuat maka bobot ‘E’ bertambah menjadi 2. Karakter ‘E’ kembali mengecek dari akar untuk mengubah posisi. Posisi dekat akar telah ditempati ‘A’ dengan bobot sama, maka ‘E’ mengecek dengan turun satu node. Karakter ‘B’ dengan bobot 1 ditukar posisinya dengan karakter ‘E’ .

Memang secara posisi pohon antara algoritma Huffman Statis dan Dinamis hampir sama, hanya saja lebih efisien Huffman Dinamis. Hal itu didapat karena peletakan daun pada Huffman Dinamis yang terus berubah-ubah (dynamic) dalam menentukan jumlah kemunculan tiap karakter. Dibandingkan dengan Huffman Statis yang terlebih dahulu harus menghitung peluang kemunculan tiap karakter.

(39)

2.4 Dekompresi

Proses dekompresi (decoding) merupakan suatu proses kebalikan dari proses kompresi (encoding). Dimana kode hasil kompresi dikembalikan dan disusun kembali seperti data awal. Proses dekompresi seperti yang telah disebutkan di awal, dapat dilakukan dengan 2 cara yaitu dengan menggunakan

pohon Huffman atau dengan tabel Huffman. Langkah-langkah dekompresi string

biner dengan pohon Huffman adalah sebagai berikut[7] :

1. Baca sebuah bit dari string biner.

2. Mulai dari akar.

3. Periksa kiri.

4. Periksa kanan.

5. Ulangi langkah 1,2 dan 3 sampai bertemu daun. Kodekan rangkaian bit

yang telah dibaca dengan karakter di daun.

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

Sebagai contoh sebuah biner “01001” akan di dekompresi, dengan pohon biner seperti Gambar 2.3 .

(40)

Gambar 2.7 Proses dekompresi dengan pohon Huffman

Dengan menggunakan algoritma di awal tadi, maka jika kita telusuri dari akar ditemukan bahwa kode “01” merupakan B dan kode “001” merupakan D. Hal ini dengan mudah ditemukan karena dalam Huffman kode akhir suatu biner bukan merupakan kode awalan biner lain. Jadi kode “01001” adalah kode Huffman untuk string BD.

Jika kita dekompresi dengan cara kedua, yaitu menggunakan tabel Huffman, seperti pada Tabel 2.1 akan lebih mudah dibandingkan daripada dengan menggunakan pohon Huffman. Kita hanya harus mencari kode “01” dan “001” tersebut dimiliki oleh karakter apa. Proses dekompresi algoritma Huffman relatif mudah dibandingkan dengan algoritma lainnya.

(41)

3

BAB III

METODOLOGI DAN PERANCANGAN

Pada bab analisis dan desain ini akan dibahas mengenai analisa terhadap kompresi data teks dengan algoritma Huffman serta desain program yang akan dibuat. Hal–hal yang dibahas antara lain proses–proses yang dibutuhkan dalam penelitian meliputi beberapa hal : gambaran umum sistem yang akan

dikembangkan, prosedur pengembangan sistem, gambaran algoritma

pengembangan dari Huffman, model analisis dan model desain.

3.1 Metode Pengembangan Sistem

Metodologi pengembangan yang penulis gunakan untuk pembuatan sistem

ini adalah metodologi model waterfall. Terdapat beberapa tahapan dalam

metodologi tersebut, antara lain :

1. System Engineering

Pada tahap ini merupakan tahap untuk mengumpulkan dan menentukan semua kebutuhan elemen sistem.

2. Analisis

Pada tahap untuk menentukan analisis terhadap permasalahan yang dihadapi.

(42)

Gambaran program yang akan diterjemahkan menjadi sebuah sistem. Meliputi desain tampilan, diagram konteks dan block diagram.

4. Implementasi

Proses menterjemahkan desain ke dalam bentuk yang dapat dieksekusi. Pada tahap ini juga merupakan proses coding program.

5. Pengujian

Memastikan apakah semua fungsi-fungsi program dapat berjalan dengan baik dan menghasilkan output yang sesuai dengan yang dibutuhkan.

3.2 Gambaran Umum Sistem

Sistem yang akan dibangun merupakan sebuah sistem berbasis Java dengan

Netbeans sebagai Intregated Development Environment (IDE). Secara umum

sistem yang berjalan akan menitikberatkan pada operasi algoritma Huffman sebagai proses kompresi dan dekompresi data. Dalam sistem ini hanya terdapat satu tipe data yang digunakan sebagai masukan user yaitu data teks dengan keluaran hasil dari sistem adalah sebuah file hasil kompresi data masukan tersebut.

Aktivitas yang dilakukan antara user dan sistem dapat digambarkan pada diagram konteks berikut :

(43)

User

Kompresi Data

Sistem

1. Data teks

2. File hasil kompresi

1. File hasil kompresi 2. Data teks

Gambar 3.1 Diagram konteks

Selain masukan berupa data teks, dari diagram konteks tersebut user juga bisa memasukan file hasil kompresi agar dapat di dekompresi kembali menjadi data teks sebagai keluarannya. File hasil kompresi yang akan digunakan sebagai masukan adalah file kompresi hasil dari sistem ini, karena file tipe hasil kompresi sistem ini akan berbeda dari sistem kompresi yang lain.

3.3 Analisa Kebutuhan Proses

Setelah melihat gambaran umum sistem, maka tahap selanjutnya adalah menganalisa semua proses yang dibutuhkan dalam sistem. Terdapat dua proses sistem yaitu proses encoding dan decoding. Gambaran proses tersebut akan di tampilkan dalam block diagram berikut :

(44)

Gambar 3.3 block diagram decoding

Dari gambar detail proses encoding dan decoding tersebut maka diperoleh beberapa proses di dalamnya antara lain : baca teks, pembentukan pohon Huffman, analisis biner, simpan file, baca file dan pengubahan kode.

3.3.1 Baca Teks

Proses baca teks merupakan sebuah proses awal dimana user memilih data yang akan di kompresi. Data yang dipilih hanya tipe data yang sesuai dengan batasan masalah seperti telah disebutkan pada bab 1. Proses pemilihan menggunakan kelas JFileChooser yang merupakan kelas bawaan pada Java untuk membuka kotak dialog browse file.

File yang telah dipilih, akan di read setiap byte secara detail. Proses baca akan membaca secara keseluruhan seperti karakter spasi, tanda baca hingga enter. Hasil dari proses ini adalah berupa Arraylist bertipe String yang akan diolah diproses selanjutya.

3.3.2 Pembentukan Pohon Huffman

Setelah proses baca teks dilakukan, maka proses selanjutnya adalah pembentukan pohon Huffman. Proses ini saya sebut sebagai inti dari proses

(45)

encoding karena dari data teks tersebut disusun sebuah pohon biner Huffman untuk membuat sebuah kode baru yang lebih singkat untuk masing-masing karakter.

Proses ini akan berbeda di setiap algoritma, karena pembentukan pohon biner yang memiliki ciri khas di masing-masing algoritma.Arraylist hasil proses baca teks akan di loop dan diambil setiap karakternya lalu dibentuk pohon binernya. Setelah terbentuk pohon biner, maka akan di identifikasi setiap karakter beserta kode yang baru. Hasil proses identifikasi dimasukan ke dalam Arraylist objek sebuah kelas yang berisi atribut karakter dan kode karakter. Hasil tersebut juga merupakan keluaran dari proses ini.

3.3.3 Analisis Biner

Proses analisis biner adalah suatu proses yang meliputi proses identifikasi kode baru tiap karakter serta proses pembentukan rangkaian kode biner baru. Proses ini dapat juga disebut sebagai proses pembentukan sebuah file baru hasil kompresi data yang dimasukan.

Hasil dari proses pembentukan pohon Huffman yang berupa Arraylistobjek berisi karakter dan kode, akan di cocokan satu per satu dengan tiap karakter hasil dari proses baca teks yang berupa Arraylist String. Hasil dari proses ini adalah sebuah String yang berisi deretan kode 1 dan 0. Kode inilah merupakan kode karakter yang baru dari setiap karakter pada teks.

(46)

3.3.4 Simpan File

Proses simpan file adalah sebuah proses untuk menyimpanan file hasil kompresi tersebut atau dengan kata lain file yang telah di buat dalam proses analisis biner akan di-stream di media penyimpanan.

Dalam proses ini terdapat 3 sub proses di dalamnya, proses-proses tersebut antara lain stream byte, simpan log, dan buat file kompresi.

3.3.4.1 Simpan Log

Proses simpan log ini merupakan sebuah proses yang saya buat untuk menyimpan tabel kode (Arraylist objek) dari hasil proses pembentukan pohon

Huffman. Proses ini nantinya akan membantu pada saat decoding dengan

mengambil tabel kode yang tersimpan dalam file log. File ini berada di dalam project tepatnya di folder logs. Untuk menyimpan tabel kode di dalam file log,

saya menggunakan stream bertipe objek dengan implements Serializable pada

kelasnya.

Aturan penamaan file log ini adalah tanggal ditambah waktu pada saat proses kompresi. Sebagai contoh kompresi dilakukan pada tanggal 24 Desember

2014 pukul 11:21:40, maka nama file log menjadi 24122014112140. Penamaan

ini secara singkatnya adalah tanggal dalam format angka ditambah waktu dari format jam, menit dan detik yang semuanya digabung tanpa spasi.

Seperti file pada umumnya, file ini juga mempunyai extension yang saya

beri nama .ldt (Log Data). Pemberian extension bertujuan untuk mempermudah

(47)

3.3.4.2 Stream Byte

Pada awalnya, untuk proses stream hasil kompresi akan menggunakan

stream bit yaitu stream dengan menggunakan ukuran terkecil dalam data. Ukuran terkecil yang dimaksud adalah jika program mencetak angka 1, maka yang ditulis adalah biner angka 1 bukan angka 1 yang mempunyai kode biner (00000001)

seperti halnya String atau Integer. Melihat sangat sulit dilakukan dengan

pemrograman berbasis Java, maka stream untuk hasil kompresi menggunakan

stream byte.

Stream byte adalah program mencetak hasil ke dalam sebuah file dengan menulis tiap karakter. Deretan kode hasil proses analisis biner yang berisi 1 dan 0, akan dipotong menjadi beberapa Stringdengan panjang masing-masing 7 karakter. Pemotongan menjadi 7 karakter ini didasarkan pada jumlah bit yang terdapat di sebuah karakter maksimal adalah 8 yaitu 10000000. Jika pemotongan berjumlah 8 karakter, akan menjadi masalah jika terdapat angka 1 selain di depan dan otomatis tidak akan ada karakter yang sesuai. Sebagai standar, saya menggunakan ASCII dengan maksimal jumlah bit adalah 28.

Proses stream byte ini sama dengan proses stream bit, hanya saja terdapat perbedaan jika dalam stream bit program akan mencetak tiap bit, sedangkan pada stream byte program akan mencetak tiap 7 bit menjadi sebuah karakter.

(48)

3.3.4.3 Buat File Kompresi

Untuk file baru hasil kompresi ini, saya akan memberi sebuah extension

dengan format .NFC(New File Compression). Tujuan dari pemberian format file

ini dengan nama yang baru adalah untuk membedakan file hasil kompresi dengan file hasil kompresi yang lainnya seperti RAR, ZIP, TAR atau sebagainya. Karena proses kompresi ini berbeda dari aplikasi kompresi lainnya, sehingga akan terjadi error jika file ini dibuka dengan aplikasi kompresi pada umumnya.

Seperti halnya file hasil kompresi umumnya, pada file ini juga terdapat sebuah informasi yang terdapat di dalamnya. Informasi dalam file ini meliputi nama file log untuk data tersebut. Secara singkat, file hasil kompresi akan

berpasangan dengan file log-nya masing-masing. Selain itu juga terdapat

informasi tentang metode atau algoritma yang dipakai. Saya memberikan ketentuan sebagai berikut :

1. Algoritma Huffman Statis, diberi kode ‘S’.

2. Algoritma Huffman Dinamis, diberi kode ‘D’.

3. Algoritma Huffman Modifikasi, diberi kode ‘M’.

Pemberian kode tersebut digunakan untuk mempermudah program dalam

proses decoding sehingga otomatis akan memilih cara yang sesuai. Untuk

mempermudah proses pengambilan data atau tokenizer, maka saya menggunakan

kata ‘sb’ yang merupakan singkatan dari sub. Alasan saya menggunakan sebuah kata, karena jika menggunakan karakter nantinya akan terjadi ambigu ketika terdapat karakter yang sama seperti karakter pembatas. Kejadian ambigu akan kecil kemungkinannya jika menggunakan sebuah kata.

(49)

Secara garis besar format penulisan dalam file hasil kompresi adalah sebagai berikut :

nama file logsbkode metodesb isi karakter

Untuk penamaan file hasil kompresi, saya menyamakan dengan nama file asli ditambah dengan metode yang dipakai. Sebagai contoh file bernama coba.txt di kompresi dengan metode Huffman Dinamis, menghasilkan file hasil coba_dinamis.nfc.

3.3.5 Baca File

Proses baca file adalah proses user untuk memilih file hasil kompresi untuk kemudian di dekompresi menjadi file baru seperti file aslinya. Pada proses

ini hanya file berekstensi .NFC yang dapat dibuka, karena output file hasil dari

sistem ini adalah file berformat .NFC. Sistem tidak bisa men-decoding jika masukan file tidak berformat seperti aturan tersebut.

Pada proses ini program juga akan membaca semua isi file dan akan

memasukannya ke dalam sebuah String, lalu kemudian program akan

men-tokenizer menjadi 3 data. Hasil pemotongan tersebut adalah nama file log, kode metode dan yang terakhir isi file. Program akan mengambil file log sesuai dengan nama yang terdapat dalam file dan membacanya lalu kemudian

memasukannya ke dalam Arraylist objek. Setelah ketiga komponen terpenuhi,

yaitu : Arraylist objek berisi tabel kode, kode metode yang dipakai dan isi karakter, maka proses selanjutnya adalah pengubahan kode.

(50)

3.3.6 Pengubahan Kode

Proses ini merupakan kebalikan dari proses pembentukan pohon Huffman pada saat encoding. Di dalam proses ini, ketiga komponen yang sudah diambil pada proses baca file akan diolah. Isi karakter akan di loop dan di proses per karakter lalu diubah menjadi bentuk biner. Hasil pengubahan ini adalah sebuah String yang berisi deretan kode 1 dan 0 seperti kode pada saat encoding.

Setelah terbentuk deret tersebut, maka akan dicocokan dengan Arraylist yang berisi tabel kode sehingga akan terbentuk sebuah kata yang sesuai dengan kata aslinya. Hasil dari proses ini adalah sebuah String yang nantinya akan diolah pada proses selanjutnya.

3.3.7 Simpan File (Proses Decoding)

Proses simpan file pada saat decoding berbeda dengan proses simpan file pada saat encoding. Pada proses ini, String hasil dari pengubahan kode akan

langsung di stream ke dalam sebuah file baru. Karena melihat dari batasan

masalah di mana file masukan hanya untuk berekstensi .TXT, maka file hasil decoding akan langsung diberi extension .TXT.

Untuk penamaan file hasil decoding, menggunakan nama dari file hasil

kompresi hanya diganti extension .NFC menjadi .TXT. Sebagai contoh file

(51)

3.4 Optimalisasi Algoritma Huffman

Seperti yang telah disebutkan dari awal, bahwa algoritma Huffman merupakan dasar dari algoritma kompresi yang ada pada saat ini. Melihat posisi tersebut bukan tidak mungkin dilakukan suatu modifikasi untuk mengoptimalkan hasil kompresi dari algoritma Huffman. Algoritma Huffman mempunyai dua macam algoritma, yaitu Huffman Dinamis dan Huffman Statis.

Kedua algoritma tersebut mempunyai persamaan yaitu terbuat dari pohon biner yang dikenal dengan pohon biner Huffman, hanya saja kedua algoritma

tersebut mempunyai perbedaan pada preprocessing data. Algoritma Huffman

Dinamis lebih fleksibel dan tanpa preprocessing karena data yang masuk akan diolah penempatannya ketika berada di pohon biner, sedangkan algoritma Huffman Statis melakukan pengurutan frekuensi kemunculan dahulu sebelum membuat pohon biner. Kedua algoritma mempunyai persamaan menempatkan karakter yang sering muncul berada di dekat akar sehingga mempunyai kode terpendek.

Pada penelitian ini mencoba untuk memodifikasi algoritma Huffman supaya lebih optimal dalam mendapatkan hasil ukuran kompresi. Secara garis besar, modifikasi ini merupakan turunan dari algoritma Huffman Statis. Untuk lebih memahaminya, maka sebuah contoh akan penulis berikan.

Data : E B C D A A E A

Langkah 1 : cek frekuensi kemunculan setiap huruf, dan di dapat :

(52)

Langkah 2 : urutkan data dari frekuensi kemunculan terbanyak hingga sedikit :

Hasil : A = 3, E = 2, B = 1, C = 1, D = 1

Langkah 3 : pembentukan pohon biner berdasarkan letak setiap

karakter, jika pada posisi ganjil maka akan menuju ke sebelah kanan pohon. Jika terletak pada posisi genap maka akan menuju ke sebelah kiri pohon.

Secara umum dapat dinyatakan dengan pseudecode sebagai berikut :

1. Cek frekuensi kemunculan tiap karakter.

2. Urutkan frekuensi dari yang terbanyak muncul hingga paling

sedikit muncul.

3. Cek posisi karakter yang telah diurutkan, variabel cursor == akar :

Ganjil :

 Jika cursor.getKanan( ) == null, buat node baru.

 Jika cursor.getKanan( ) != null, maka cursor = cursor.getKanan( ).

Genap :

 Jika cursor.getKiri( ) == null, buat node baru.

 Jika cursor.getKiri( ) == null, maka cursor = cursor.getKiri( ).

4. Lakukan nomor 3 hingga semua karakter ditempatkan pada pohon

biner.

(53)

Langkah 4 : membuat pohon biner dari data yang telah diurutkan.

Gambar 3.4 Pembentukan pohon Huffman modifikasi

1. Pada awalnya hanya akar dan data belum masuk.

2. Kemudian masuk karakter A, karena posisinya di awal (ganjil) dan

data belum ada maka langsung membuat node A di sebelah kanan akar.

3. Kemudian masuk karakter E, karena posisinya kedua (genap) dan

data belum ada maka langsung membuat node E di sebelah kiri akar.

4. Masuk karakter B yang berada pada urutan ketiga (ganjil), tetapi

sudah ada data A di sebelah kanan maka cursor turun 1 langkah dan membuat node B di bawah node A.

5. Karakter C lalu masuk sebagai urutan keempat (genap), tetapi

sudah ada data E di sebelah kiri maka cursor turun 1 langkah dan membuat node C di bawah node E.

(54)

6. Karakter terakhir adalah D dengan posisi kelima (ganjil). Karakter tersebut menempati di sebelah kanan akar, tetapi sudah ada data A dan B maka currsor turun 2 langkah dan membuat node D.

3.5 Desain User Interface

Tampilan atau user inteface merupakan komponen yang penting dalam

sebuah aplikasi atau program, oleh karena itu untuk mempermudah penggunaan aplikasi kompresi ini penulis membuat sebuah rancangan untuk user interface.

Tampilan aplikasi ini dibuat menggunakan kelas form dalam Java. Penggunaan

kelas JTabedPane untuk tampilan berguna mempersingkat dan mengurangi

banyaknya form yang digunakan. Untuk lebih memperjelasnya, berikut rancangan yang akan dibuat :

(55)

Gambar 3.6 Interface decoding

Secara garis besar, tampilan untuk encoding dan decoding hampir sama.

Kedua tampilan mempunyai jumlah tombol dan susunan panel yang sama. Untuk panel detail pada encoding, akan saya tampilkan ukuran asli dan ukuran file setelah dikompresi beserta compression ratio. Selain itu pada tampilan encoding juga ditambahkan panel untuk memilih algoritma yang akan digunakan. Pada panel detail untuk decoding akan ditampilkan ukuran setelah di decoding beserta metode atau algoritma yang digunakan.

3.6 Spesifikasi Software dan Hardware

Spesifikasi perangkat keras dan perangkat lunak yang digunakan untuk proses implementasi adalah sebagai berikut :

1) Processor : Intel(R) Core(TM) i3 CPU M380 @ 2.53GHz 2) Memory : 2048 MB

(56)

4) Operating System :Windows 7 Ultimate

@ 2013 Microsoft Corporation. All Rights Reserved

(57)

41

4

BAB IV

IMPLEMENTASI DAN ANALISIS

Pada bab ini akan dibahas tentang implementasi rancangan yang telah dijelaskan pada bab sebelumnya dan hasil analisa dari pengujian program. Implementasi tersebut meliputi ketiga algoritma yang akan dibuat dengan bahasa pemrograman Java. Pada bab sebelumnya telah dijelaskan proses-proses yang akan dilakukan oleh sistem, berikut adalah implementasi dari tiap proses tersebut.

4.1 Proses Encoding

Proses yang pertama adalah proses encoding yaitu proses data teks awal akan diubah menjadi kode-kode biner yang baru. Proses ini menghasilkan keluaran berupa file hasil kompresi.

4.1.1 Implementasi Proses Baca Teks

Pada proses ini, akan dibagi menjadi dua implementasi yaitu implementasi untuk memilih file dan implementasi untuk membaca file.

(58)

4.1.1.1 Memilih File

Gambar 4.1 Implementasi proses memilih file encoding

Penulis menggunakan kelas JFileChooser untuk menampilkan kotak

dialog browse, serta menggunakan WindowsLookAndFeel yang memberi kesan

seperti halnya kotak dialog pada aplikasi umumnya yang berjalan di Windows.

Penggunaan kelas FileFilter berfungsi untuk menyaring dan hanya menampilkan

file yang telah diatur. Pada program, file yang akan di-filter atau diperbolehkan hanya file berekstensi .TXT atau Text Format. Setelah file dipilih, maka file akan disimpan pada sebuah variabel.

4.1.1.2 Membaca File

Gambar 4.2 Implementasi proses membaca file encoding

Pada proses baca file, penulis tidak menggunakan fungsi Stream seperti

halnya FileInputStream atau menggunakan kelas FileReader melainkan

(59)

dan memasukannya ke dalam kelas. Fungsi tersebut hampir sama seperti fungsi Stream yaitu membaca file, hanya saja pada fungsi ini program akan membaca seluruh karakter yang ada di dalam file masukan sehingga nantinya tidak akan ada karakter yang tidak terbaca.

4.1.2 Implementasi Proses Pembentukan Pohon Biner

Pada proses ini akan ada tiga implementasi dari proses pembentukan pohon biner. Ketiga implementasi tersebut menyesuaikan dengan jumlah algoritma yang akan diuji pada skripsi ini yaitu pembentukan pohon biner algoritma Huffman Statis, Huffman Dinamis dan Huffman Modifikasi.

4.1.2.1 Pohon Biner Huffman Statis

(60)

Pada implementasi pembentukan pohon biner Huffman Statis, node yang berisi karakter selalu ditempatkan di lengan sebelah kanan. Implementasi dari ciri khas Huffman Statis, program akan mengecek terlebih dahulu apakah lengan sebelah kanan kosong (null) atau tidak, jika kosong maka karakter membuat node baru. Tetapi jika di sebelah kanan terdapat node atau tidak kosong,

maka cursor akan bergerak ke bawah melewati node tersebut untuk mencari

hingga posisi lengan sebelah kanan kosong.

4.1.2.2 Pohon Biner Huffman Dinamis

(61)

Implementasi pembentukan pohon biner Huffman Dinamis terlihat lebih panjang dan rumit, hal ini dikarenakan pohon biner akan selalu berubah menyesuaikan jumlah frekuensi kemunculan setiap karakter yang masuk. Langkah pertama program akan mengecek lengan sebelah kanan kosong atau tidak, jika

kosong maka karakter akan membentuk node baru dengan jumlah diisi 1

(cursor.setJumlah(1)). Jumlah ini merupakan frekuensi kemunculan karakter, hal ini juga yang membedakan Huffman Dinamis dengan metode Huffman yang lain.

Langkah kedua jika sebelah kanan terdapat node maka program akan

mengecek, jika data node tidak sama dengan karakter maka variabel n akan diisi dengan cursor dan cursor akan turun ke bawah melewati node tersebut. Tetapi jika data node sama dengan karakter, maka jumlah akan ditambah dengan 1 dan variabel n akan dibandingkan dengan data node. Proses perbandingan ini akan mengecek jumlah pada variabel n dan pada node, jika pada variabel n lebih kecil jumlahnya dibanding dengan node maka posisi keduanya akan ditukar.

(62)

4.1.2.3 Pohon Biner Huffman Modifikasi

Gambar 4.5 Implementasi pembentukan pohon Huffman Modifikasi Pembentukan pohon biner Huffman Modifikasi penulis implementasikan mirip seperti pembentukan pohon biner Huffman Statis, hanya saja terdapat

perbedaan pada peletakan node setiap karakter. Ciri khas yang saya berikan pada

algoritma ini adalah posisi tiap karakter (ganjil dan genap) akan menentukan

peletakan pada pohon biner,pada implementasi terdapat variabel boolean yaitu

isKanan_Ganjil. Variabel ini mempunyai arti jika posisi karakter adalah ganjil, maka akan ditempatkan pada lengan sebelah kanan.

Cara kerja algoritma ini, pertama variabel isKanan_Ganjil diberi nilai true karena karakter pertama pasti mempunyai posisi ganjil. Langkah berikutnya akan mengecek sebelah kanan dari cursor jika kosong dan isKanan_Ganjil adalah true maka akan membentuk node baru serta memberi nilai isKanan_Ganjil

(63)

menjadi false karena pasti posisi karakter berikutnya adalah genap. Jika tidak kosong maka cursor akan menuju ke bawah dan melewati node tersebut.

Kemudian jika sebelah kiri dari cursor kosong dan isKanan_Ganjil

adalah false maka akan membentuk node baru serta memberi nilai isKanan_Ganjil

menjadi true. Jika tidak kosong akan melewati node tersebut dan cursor menuju

ke bawah.

4.1.3 Implementasi Proses Analisis Biner

Pada proses ini, akan dibahas tentang pembentukan kode biner(1 dan 0) dari hasil pembentukan pohon biner pada proses sebelumnya. Pada implementasi ini akan dibagi menjadi dua, yang pertama yaitu implementasi pada Huffman Statis dan Huffman Modifikasi, serta yang kedua implementasi pada Huffman Dinamis. Kedua implementasi tersebut menggunakan sebuah kelas utama yaitu KodeHuffman, berikut isi dari kelas tersebut :

(64)

Gambar 4.6 Source code kelas KodeHuffman.java

Pada kelas tersebut terdapat dua atribut yaitu huruf dan kode yang

masing-masing bertipe String. Kelas ini pada dasarnya berfungsi untuk

menyimpan kode biner yang baru dari masing-masing huruf atau karakter. Di

dalam kelas terdapat method set dan get untuk mempermudah dalam

(65)

4.1.3.1 Implementasi Huffman Statis dan Huffman Modifikasi

Gambar 4.7 Implementasi analisis biner Huffman Statis dan modifikasi method generateKode()

Dalam proses ini nantinya terdapat dua method, salah satunya

adalah method generateKode(). Method ini secara garis besar berfungsi

untuk menentukan kode biner yang baru dari masing-masing karakter. Di dalam potongan program di atas, dapat dibagi menjadi dua proses yaitu proses membentuk pohon biner dengan membuat objek dari kelas BinaryTree dan proses mencari kode di dalam pohon biner. Pencarian

kode tersebut dilakukan dengan memanggil method berikutnya yaitu

method find() dengan parameter objek pohon biner dan karakter yang di cari. Dalam method ini terdapat perbedaan antara algoritma Huffman Statis dan Huffman Modifikasi, perbedaan tersebut didasarkan pada bentuk pohon biner yang berbeda dari kedua algoritma.

(66)

Gambar 4.8 Implementasi analisis biner Huffman Statis method find() Method find() tersebut digunakan untuk algoritma Huffman Statis, di mana jika dilihat hanya mengecek sebelah kanan dari pohon biner. Cara

kerja dari proses ini, pertama program akan terus berulang hingga cursor

sama dengan null. Program akan mengecek sebelah kanan, apakah data di node sama dengan data yang dicari. Jika sesuai maka kode akan berisi 1 sertacursor akan berubah menjadi null dan looping berhenti.

Jika sebelah kanan data dalam node tidak sesuai dengan data yang dicari maka kode akan berisi 0 dan cursor akan berpindah ke bawah serta

(67)

berulang untuk kembali mengecek dari awal. Tetapi jika sebelah kiri tidak ada kata “simpul” hal itu berarti tidak ada cabang di bawahnya maka program akan berhenti looping dengan membuat cursor menjadi null.

Gambar

Gambar 2.1 Penetuan pivot dan cara kerja Quick Sort
Gambar 2.2 Pohon biner sempurna dan beberapa contoh pohon biner  Kompresi  data  pada  pengkodean  Huffman  didasarkan  pada  frekuensi  kemunculan  setiap  karakternya
Gambar 2.4 Hasil dari pohon Huffman
Gambar 2.5  Proses pembentukan pohon Huffman Dinamis FGK
+7

Referensi

Dokumen terkait

Industri pangan menjadi salah satu faktor yang dapat menciptakan stabilitas ekonomi daerah, khususnya di daerah Jawa Barat. Tanaman pangan merupakan salah satu subsektor dari

Bagi pelamar untuk menjadi tenaga pendidik yang berlatar belakang professional dari kalangan birokrat/praktisi minimal berpendidikan S2 linier S1 dan S2 dan

Terdapat perbedaan penilaian atas efektivitas iklan (perhatian, minat, keyakinan, tindakan), citra toko online, dan niat beli ditinjau dari perbedaan jumlah ponsel

Hasil penelitian menunjukkan bahwa Total Asset TurnOver secara parsial berpengaruh positif tetapi tidak signifikan terhadap Return On Asset (ROA), Debt to Equity Ratio

Pada tahun ini, semasa saya mengetuai Bulan Bahasa sebagai pengerusi buat pertama kali, saya teruja dan terasa bersemangat kerana bakat, idea dan usaha yang saya lihat

Rekruitment Karyawan ini melalui proses/tahapan rekrutmen dengan seleksi berbasis kompetensi dan transparansi sehingga untuk tahapan seleksi yang menjadi tug as

pengetahuan di bidang Dana Pensiun sebagaimana diatur dalam Keputusan Direktur Jenderal Lembaga Keuangan Nomor KEP-618/LK/2003 tentang Persyaratan Pengetahuan di Bidang Dana

Renja Dinas Pendapatan Daerah tahun 2015 merupakan rencana tahunan kedua dalam pelaksanaan RPJMD Kabupaten Bogor tahun 2013-2018 yang harus memuat rencana