Mengembangkan utilitas kompresi data berbasis kode Huffman dengan Haskell
(lazamar.github.io)Implementasi program kompresi data menggunakan pengodean Huffman
- Apa itu kode Huffman?
- Melakukan kompresi data dengan memetakan setiap karakter ke urutan bit yang unik
- Karakter yang sering muncul dipetakan ke urutan bit yang pendek, sedangkan karakter yang jarang muncul dipetakan ke urutan bit yang panjang
- Contoh: untuk string
aaab,adipetakan ke1danbke0, sehingga dikompresi menjadi1110
Kode tanpa prefiks
- Apa itu kode tanpa prefiks?
- Memastikan tidak ada satu kata kode pun yang menjadi prefiks dari kata kode lain
- Contoh: untuk
aaabc,adipetakan ke1,bke00, dancke01, sehingga dikompresi menjadi1110001
Membuat kode tanpa prefiks
- Cara membuat kode tanpa prefiks
- Menempatkan semua karakter sebagai daun pada pohon biner penuh
- Cabang kiri diberi label
1, cabang kanan diberi label0 - Jalur dari akar ke daun menjelaskan kata kode untuk tiap karakter
Menulis coder
-
Definisi tipe
- Mendefinisikan tipe
Bit,Code,FreqMap,CodeMap,Weight,HTree HTreeterdiri dariLeafdanFork
- Mendefinisikan tipe
-
Fungsi encoding
- Fungsi untuk mengubah string menjadi bit
- Menghitung frekuensi tiap karakter menggunakan
FreqMap, lalu membuat pohon Huffman berdasarkan hasil tersebut - Menghasilkan kata kode untuk tiap karakter dari pohon Huffman
-
Fungsi decoding
- Fungsi untuk mengubah bit kembali menjadi string asli
- Mendekode bit secara berurutan menggunakan pohon Huffman
Integrasi dengan file biner
- Encoding data biner
- Menggunakan modul
Data.ByteString.Char8untuk membaca byte sebagai karakter - Mengodekan data biner menggunakan coder teks
- Menggunakan modul
Serialisasi
- Fungsi serialisasi
- Mengubah
FreqMapdan bit menjadi byte nyata lalu menyimpannya ke file - Menggunakan monad
Putuntuk menghasilkanByteStringsecara efisien
- Mengubah
Deserialisasi
- Fungsi deserialisasi
- Mengubah data yang dibaca dari file menjadi
FreqMapdan bit - Menggunakan monad
Getuntuk mendeserialisasiFreqMap
- Mengubah data yang dibaca dari file menjadi
Integrasi seluruh kode
- Fungsi kompresi dan dekompresi file
- Fungsi
compress: membaca file, membuat peta frekuensi, mengodekan data, lalu menyimpannya sebagai file terkompresi - Fungsi
decompress: membaca file terkompresi, mendekode data, lalu menyimpannya kembali sebagai file asli
- Fungsi
Peningkatan
-
Multithreading
- Mendekode bagian-bagian file secara paralel
- Menambahkan tabel yang menentukan batas tiap bagian dan ukuran decode yang diharapkan agar pemrosesan paralel dimungkinkan
-
Encoding single-pass
- Membuat peta frekuensi secara real-time sambil melakukan encoding
- Tidak perlu menyertakan peta frekuensi di awal file
-
Kode Huffman kanonis
- Melakukan decoding dalam kompleksitas waktu
O(1)dengan mengindeks vektor alih-alih menelusuri pohon
- Melakukan decoding dalam kompleksitas waktu
-
Pembuatan kode yang lebih cepat
- Jika mencoba encoding single-pass, kecepatan pembuatan code map perlu ditingkatkan
Opini GN⁺
-
Kelebihan pengodean Huffman
- Memungkinkan kompresi data yang efisien dengan memetakan karakter yang sering muncul ke urutan bit yang pendek
- Dapat menangani data besar sambil meminimalkan penggunaan memori
-
Kelebihan Haskell
- Memungkinkan penulisan kode yang modular dengan memanfaatkan keunggulan pemrograman fungsional
- Dapat mengoptimalkan penggunaan memori melalui evaluasi malas
-
Proyek dengan fungsi serupa
- Tersedia berbagai alat kompresi data seperti gzip dan bzip2
- Penting untuk membandingkan kelebihan dan kekurangan tiap alat agar dapat memilih yang paling sesuai
-
Hal yang perlu dipertimbangkan saat mengadopsi teknologi baru
- Algoritme yang tepat harus dipilih dengan mempertimbangkan performa dan penggunaan memori
- Efisiensi dapat ditingkatkan dengan menerapkan teknik optimasi seperti encoding single-pass
1 komentar
Komentar Hacker News
Ada algoritme in-place berbasis array sehingga tidak perlu mengalokasikan tree dan menelusuri pointer sebanyak itu
Pernyataan bahwa codeword tidak boleh menjadi prefiks dari codeword lain tidak sepenuhnya akurat secara teknis
Penasaran apakah ada tutorial serupa yang membahas fitur lebih tingkat lanjut untuk menulis program Haskell, seperti monad transformer, lens, dan sebagainya
Kursus functional programming Coursera (Scala) memberikan tugas Huffman coding yang serupa
Pernah menggunakan Huffman code untuk menjalankan program makro prosesor MICMAC dengan jumlah microcycle dan microinstruction minimum
Info tambahan tentang Huffman coding: Rosetta Code Huffman Coding
Pertanyaan untuk programmer Haskell: seperti apa performa Haskell bagi programmer yang ingin menulis kode yang dioptimalkan?
Ada komentar yang mengucapkan terima kasih karena sudah berbagi
Ada typo pada tabel di bagian "Creating prefix-free codes"
Arithmetic coding hampir lebih baik dalam segala hal