330 likes | 588 Views
Algoritma dan Struktur Data Lanjut. Kompresi. Kompresi. Kompresi merupakan proses pengubahan sekumpulan data menjadi suatu bentuk kode untuk menghemat kebutuhan tempat penyimpanan dan waktu untuk transmisi data. Kompresi dapat diterapkan untuk: - File Teks - File Gambar - File Audio
E N D
Algoritma dan Struktur Data Lanjut Kompresi
Kompresi • Kompresi merupakan proses pengubahan sekumpulan data menjadi suatu bentuk kode untuk menghemat kebutuhan tempat penyimpanan dan waktu untuk transmisi data. • Kompresi dapat diterapkan untuk: - File Teks - File Gambar - File Audio - File Video
MetodedalamKompresi • Ada 3 metode yang digunakan dalam kompresi: - Kompresi Lossy - Kompresi Lossless - Kompresi Delta
KompresiLossy • Suatu metode kompresi data yang menghilangkan sebagian “Informasi” dari file asli (file yang akan dimampatkan) selama proses kompresi berlangsung dengan tidak menghilangkan (secara signifikan) informasi yang ada dalam file secara keseluruhan. • Contoh: pada kompresi file gambar. Merubah detail dan warna sebuah file gambar menjadi lebih sederhana dan mempunyai kapasitas file menjadi lebih kecil tanpa terlihat perbedaan mencolok dari pandangan manusia.
Kompresi Lossless • Metode kompresi data dimana tidak ada “Informasi” / data yang hilang atau berkurang jumlahnya selama proses kompresi, sehingga pada proses dekompresi jumlah bit (byte) data atau informasi dalam keseluruhan file hasil sama persis dengan file aslinya.
Kompresi Delta • Delta Comression mengirimkan semua informasi state, memungkinkan hanya mengirim perubahan/update (delta) dari state sebelumnya. Efeknya, membutuhkan pengiriman data yang reliable (contoh TCP). Efektif jika state game world besar, namun perubahan yang ada kecil.
AlgortimaKompresi • Algoritma Huffman • Algoritma LZW (Lempel-Ziv-Welch) • Algoritma DMC (Dynamic Marcov Compression) • Dsb
Kompresi Data Teks • Kompresi Teks menggunakan metode Lossless. • Karena jika menghilangkan beberapa karakter akan merubah arti dari teks aslinya. Kompresi Teks ada 2 macam: • Character-based Frequency counting • Huffman Encoding, Arithmetic Encoding • Word-based Frequency counting • Lempel-Ziv (LZ) algorithm
Algoritma Huffman • Dibuat oleh seorang mahasiswa MIT bernama David Huffman. • Merupakan salah satu metode paling lama dan paling terkenal dalam kompresi teks. • Metode ini adalah suatu teknik kompresi data secara statistik yang bekerja dengan mereduksi panjang kode rata-rata dan menghasilkan kode prefiks yang digunakan untuk merepresentasikan simbol-simbol dari suatu jenis huruf.
Pohon Huffman • Algoritma Huffman menggunakanstrukturpohondalamprosesnya. • Dalamstrukturpohondikenaldenganterminologiparent (orangtua) danchild (anak). • Parent (orangtua) yaitusebuahsimpul yang memilikilintasankesimpul lain dengantingkatan (level) dibawahnya. • Child (anak) yaitusebuahsimpul yang memilikilintasankesimpul lain dengantingktan (level) diatasnya.
Pohon Huffman (2) • Beradasarkan jumlah anak pohon huffman dikategorikan : • Uner : pohon dengan orang tua yang hanya memiliki satu anak • Biner : pohon dengan orang tua yang memiliki dua anak
Algoritma Huffman • Pengkodean dengan huffman coding menggunakan panjang bit yang bervariasi dalam pengkodean sebuah karakter. • Karakter dengan frekuensi kemunculan lebih besar memiliki panjang bit yang lebih pendek. • Berlaku kebalikannya.
Langkah-langkahAlgoritma Huffman • Hitungstatistik (frekuensi) jumlahkemunculanmasing-masingsimbol. • Simpanhasilinformasibobotmasing-masingsimbol. • Membangunpohonhuffmanberdasarkanlarikbobotdarimasing-masingsimbol. • Konversipohonhuffmanmenjadikodespesifikuntuktiapsimbol.
Contoh • Berikut ini adalah sebuah contoh cara pengkodean sebuah string. Misalkan kita akan mengkodekan sebuah string “AABCABC”. • Dalam kode ASCII string 7 huruf “AABCABC” membutuhkan representasi 7 × 8 bit = 56 bit (7 byte), dengan rincian sebagai berikut: • A = 01000001 • A = 01000001 • B = 01000010 • C = 01000011 • A = 01000001 • B = 01000010 • C = 01000011
PemecahanMasalah • Berdasarkan algoritma yang telah disebutkan sebelumnya, maka kita pertama kali akan menghitung frekuensi kemunculan dari setiap karakater. • String: AABCABC
PemecahanMasalah (2) • Berdasarkan tabel maka dapat disusun model pohon Huffman-nya:
PemecahanMasalah (3) • Berdasarkan pohon Huffman yang ditunjukan pada hasil di atas maka dapat ditentukan kode huffman untuk masing-masing setiap simbol yang dalam string “AABCABC”.
HasilKompresi • Berdasarkan tabel Huffman maka rangkaian bit dari string AABCABC adalah: • 0 0 10 11 0 10 11 • Jadi jumlah bit yang dipakai hanya 11 bit (2 byte), lebih hemat dari jumlah bit sebelumnya (56 bit).
Analisa • Dari Tabel Huffman tampak bahwa kode untuk sebuah simbol/karakter tidak boleh menjadi awalan dari kode simbol yang lain guna menghindari keraguan (ambiguitas) dalam proses dekompresi atau decoding. • Karena tiap kode Huffman yang dihasilkan unik, maka proses dekompresi dapat dilakukan dengan mudah.
Dekompresi Saatmembacakode bit pertamadalamrangkaian bit: 0 0 10 11 0 10 11 yaitu bit 0, dapatlangsungdisimpulkanbahwakode bit “0” merupakanpemetaandarisimbol “A”. Bit keduajuga “A”. Kemudianbacakode bit selanjutnya, yaitu bit “1”, tidakadakode Huffman “1”, lalubacakode Huffman selanjutnyayaitu “0” sehinggamenjadi “10” yaitukarakter “B”. Begituseterusnya…
Huffman Tree • Hitungfrekuensiuntuktiapsimbol. • Urutkandari yang paling kecilke yang paling besar. Setiapsimbolmewakilisatu node. • Tambahkankode ‘0’ untuk node terkecilpertamadan ‘1’ untuk node terkecilkedua. Gabungkankedua node tersebutdanjumlahkankeduafrekuensinya. Makaakandidapat node parent. • Hapuskedua node terkeciltadidaridalam list node, lalumasukkan node parent tadi. • Ulangilangkah ke-2 sampai ke-4 hinggasemuasimbolhabisdibangkitkan.
PenerapanAlgortima Huffman dalam Java • Buatlah kelas-kelas: • Simbol • Node • HuffmanCode
KelasSimbol • Tambahkan atribut char karakter, int frekuensi, String biner. Inisialisasi nilai biner dengan string kosong (“”). Buat setter dan getter-nya. • Buat 3 konstruktor, 1 konstruktor tanpa parameter, 1 konstruktor dengan parameter char karakter dan int frekuensi, 1 konstruktor dengan parameter char karakter, int frekuensi, dan String biner. • Inisialisasi nilai-nilai parameter dari konstruktor di dalam konstruktor.
Kelas Node • Kelas Node adalahturunandarikelasSimbol. • Tambahkan 3 atribut Node left, right, dan parent. Buat setter dan getter-nya. • Buat 3 konstruktor, 1 konstruktortanpa parameter, 1 konstruktordengan parameter Node left dan right, 1 konstruktordengan parameter char karakterdanintfrekuensi. Inisialisasitiapnilaidari parameter. • Untukkonstruktorketiga, inisialisasinilaikelas super denganmenggunakanfungsi setter dan getter darikelas super tersebut
Kelas Node (2) • Didalam fungsi setLeft dan setRight, tambahkan sintaks berikut: • left.setParent(this); (untuk setLeft) • right.setParent(this); (untuk setRight) • Tambahkan fungsi hasChild untuk mengecek apakah node ini memiliki anak atau tidak. • Tambahkan fungsi hasLeft dan hasRight untuk mengecek apakah node ini memiliki anak left atau right.
KelasHuffmanCode • Tambahkan sebuah atribut static Vector<Simbol> listSimbol ke dalamnya, lalu inisialisasi variabel tersebut. • Buat sebuah fungsi static bernama urutSimbol dengan tipe Vector<Node> dan berparameter Vector<Node> listNode. • Tambahkan kode berikut ke dalamnya: for (int i = 0; i < listNode.size() - 1; i++) { Node s = listNode.get(i); for (int j = i + 1; j < listNode.size(); j++) { Node s2 = listNode.get(j); if (s2.getFrekuensi() > s.getFrekuensi()) { Node nB; nB = listNode.get(i); listNode.set(i, listNode.get(j)); listNode.set(j, nB); } } } return listNode;
KelasHuffmanCode (2) • Buat sebuah fungsi static bernama getTopParent dengan tipe Node dan berparameter Vector<Node> listNode, lalu masukkan: Node parent = null; Vector<Node> listBuff = new Vector<Node>(); for (Node node : listNode) { listBuff.add(node); } while (true) { parent = new Node(); parent.setKarakter('p'); listBuff = urutSimbol(listBuff); Node n1 = listBuff.get(listBuff.size() - 1); Node n2 = listBuff.get(listBuff.size() - 2); parent.setFrekuensi(n1.getFrekuensi() + n2.getFrekuensi()); parent.setLeft(n2); parent.setRight(n1); if (listBuff.size() <= 2) { break; } listBuff.removeElementAt(listBuff.size() - 1); listBuff.removeElementAt(listBuff.size() - 1); listBuff.add(parent); } return parent;
KelasHuffmanCode (3) • Buat sebuah fungsi static bernama getCode dengan tipe void dan berparameter Node parent, lalu masukkan: if (parent.hasLeft()) { parent.getLeft().setBiner(parent.getBiner() + "0"); getCode(parent.getLeft()); } if (parent.hasRight()) { parent.getRight().setBiner(parent.getBiner() + "1"); getCode(parent.getRight()); } if (!parent.hasChild()) { listSimbol.add((Simbol) parent); }
KelasHuffmanCode (4) • Buat sebuah fungsi main, lalu masukkan: String txt = "AABCABC"; Vector<Node> listNode = new Vector<Node>(); String buff = txt; while (buff.length() > 0) { char c = buff.charAt(0); int f = 0; String buff2 = ""; for (int j = 0; j < buff.length(); j++) { if (c == buff.charAt(j)) f++; else buff2 += buff.charAt(j); } buff = buff2; listNode.add(new Node(c, f)); } listNode = urutSimbol(listNode); Node topParent = getTopParent(listNode); getCode(topParent); for (Simbol simbol : listSimbol) System.out.println(simbol.getKarakter() + "|" + simbol.getFrekuensi() + "|" + simbol.getBiner());
Tugas • Buat paper tentangalgoritmakompresi: - Lempel-Ziv-Welch (LZW) - Dymanic Markov Compression (DMC) • Jelaskansejarahnya, aturannya, algoritma-nya. • Bericontohpenerapannya: Misaluntukmengkompresi String/kalimat. Beripenjelasanlangkah per langkahuntukkompresidandekompresi-nya. Kumpul hardcopy minggudepansaatkuliah. Dikerjakanmaksimal 2 mahasiswa. Tiapkelompokuntukpenerapan-nyaharusbeda.
Post Test • Sebutkan 3 jenis metode kompresi! • 1 byte berapa bit? • Buatlah tabel Huffman untuk kompresi string ABACCDA (Kerjakan dengan lengkap tahap-tahapnya)! Tulis nama dan NIM.