Haskell kullanarak Huffman kodu tabanlı bir veri sıkıştırma yardımcı programı geliştirmek
(lazamar.github.io)Huffman kodlaması kullanan bir veri sıkıştırma programının uygulanması
- Huffman kodu nedir?
- Her karakteri benzersiz bir bit dizisine eşleyerek veri sıkıştırması gerçekleştirir
- Sık görülen karakterleri kısa bit dizilerine, nadir görülen karakterleri ise uzun bit dizilerine eşler
- Örnek:
aaabdizgesi içina,1;bise0olarak eşlenir ve1110şeklinde sıkıştırılır
Öneksiz kod
- Öneksiz kod nedir?
- Hiçbir kod sözcüğünün başka bir kod sözcüğünün ön eki olmamasını sağlar
- Örnek:
aaabciçina,1;b,00;cise01olarak eşlenir ve1110001şeklinde sıkıştırılır
Öneksiz kod üretimi
- Öneksiz kod oluşturma yöntemi
- Tüm karakterler tam ikili ağacın yapraklarına yerleştirilir
- Sol dal
1, sağ dal0olarak etiketlenir - Kökten yaprağa giden yol, her karakterin kod sözcüğünü tanımlar
Kodlayıcının yazılması
-
Tür tanımları
Bit,Code,FreqMap,CodeMap,Weight,HTreetürleri tanımlanırHTree,LeafveForkyapılarından oluşur
-
Kodlama işlevi
- Dizgeyi bitlere dönüştüren işlev
FreqMapkullanarak her karakterin frekansını hesaplar ve buna dayanarak Huffman ağacını oluşturur- Huffman ağacından her karakter için kod sözcükleri üretir
-
Kod çözme işlevi
- Bitleri özgün dizgeye dönüştüren işlev
- Huffman ağacını kullanarak bitleri sırayla çözer
İkili dosyalarla entegrasyon
- İkili veri kodlama
- Baytları karakter olarak okumak için
Data.ByteString.Char8modülü kullanılır - Metin kodlayıcı kullanılarak ikili veri kodlanır
- Baytları karakter olarak okumak için
Serileştirme
- Serileştirme işlevi
FreqMapve bitleri gerçek baytlara dönüştürüp dosyaya kaydederPutmonadı kullanılarak verimli birByteStringoluşturulur
Ters serileştirme
- Ters serileştirme işlevi
- Dosyadan okunan veriyi
FreqMapve bitlere dönüştürür Getmonadı kullanılarakFreqMapters serileştirilir
- Dosyadan okunan veriyi
Tüm kodun birleştirilmesi
- Dosya sıkıştırma ve açma işlevleri
compressişlevi: dosyayı okur, frekans haritasını oluşturur, veriyi kodlayıp sıkıştırılmış dosya olarak kaydederdecompressişlevi: sıkıştırılmış dosyayı okur, veriyi çözüp özgün dosya olarak kaydeder
İyileştirmeler
-
Çok iş parçacıklılığı
- Dosyanın bölümlerini paralel olarak çözer
- Bölüm sınırlarını ve beklenen çözme boyutunu belirten bir tablo ekleyerek paralel işlemeyi mümkün kılar
-
Tek geçişli kodlama
- Frekans haritasını gerçek zamanlı oluştururken aynı anda kodlama yapar
- Dosyanın başında frekans haritasını bulundurmayı gerektirmez
-
Kanonik Huffman kodu
- Ağacı dolaşmak yerine vektör indeksleyerek
O(1)zaman karmaşıklığıyla kod çözme sağlar
- Ağacı dolaşmak yerine vektör indeksleyerek
-
Daha hızlı kod üretimi
- Tek geçişli kodlama denenecekse, kod haritası üretim hızı artırılmalıdır
GN⁺ görüşü
-
Huffman kodlamasının avantajları
- Sık görülen karakterleri kısa bit dizilerine eşleyerek verimli veri sıkıştırması sağlar
- Bellek kullanımını en aza indirirken büyük verileri işleyebilir
-
Haskell'in avantajları
- Fonksiyonel programlamanın avantajlarından yararlanarak modüler kod yazılabilir
- Tembel değerlendirme sayesinde bellek kullanımı optimize edilebilir
-
Benzer işlevlere sahip projeler
- gzip, bzip2 gibi çeşitli veri sıkıştırma araçları bulunur
- Her aracın artı ve eksilerini karşılaştırarak uygun aracı seçmek önemlidir
-
Yeni teknoloji benimserken dikkat edilmesi gerekenler
- Performans ve bellek kullanımını dikkate alarak uygun algoritma seçilmelidir
- Tek geçişli kodlama gibi optimizasyon teknikleri uygulanarak verimlilik artırılabilir
1 yorum
Hacker News yorumu
Ağaç tahsisi yapma ve pointer takip etme ihtiyacını azaltan, dizi tabanlı in-place algoritmalar mevcut
Kod sözcüklerinin başka kod sözcüklerinin ön eki olmaması gerektiğini söylemek teknik olarak doğru değil
Haskell programları yazmanın daha ileri özelliklerini (monad transformer'lar, lens'ler vb.) ele alan benzer bir eğitim olup olmadığını merak ediyorum
Coursera'nın fonksiyonel programlama kursu (Scala) benzer bir Huffman kodlama ödevi sunuyor
Huffman kodlarını kullanarak MICMAC işlemci makro programını asgari mikrodöngü ve mikrokomutla çalıştırdım
Huffman kodlaması hakkında ek bilgi: Rosetta Code Huffman Coding
Haskell programcılarına soru: optimize edilmiş kod yazmak isteyen bir programcı için Haskell'in performansı nasıl?
Paylaştığınız için teşekkürler diyen bir yorum
"Creating prefix-free codes" bölümündeki tabloda bir yazım hatası var
Aritmetik kodlama neredeyse her açıdan daha iyi