21 Aralık 2017 Perşembe

Huffman Encoding (Sıkıştırma Algoritması)

      Sıkıştırma algoritmaları temel olarak iki kategoride incelenir. Bunlar, kayıplı ve kayıpsız sıkıştırma algoritmalarıdır. Kayıplı algoritmalarda sıkıştırılan veriden orjinal veri elde edilemezken kayıpsız sıkıştırma algoritmalarında sıkıştırılmış veriden orjinal veri elde edilebilir.
   
    Kayıplı sıkıştırma tekniklerine verilebilecek en güzel örnekler MPEG ve JPEG gibi standartlarda kullanılan sıkıştırmalardır. Bu tekniklerde sıkıştırma oranı artırıldığında orjinal veride bozulmalar ve kayıplar görülür. Kayıpsız veri sıkıştırmada durum çok farklıdır. Bu tekniklerde önemli olan orjinal verilerin aynen sıkıştırılmış veriden elde edilmesidir. Bu teknikler daha çok metin tabanlı verilen sıkıştırılmasında kullanılır.
    Bir metin dosyasını sıkıştırdıktan sonra metindeki bazı cümlelerin kaybolması istenmediği için metin sıkıştırmada bu yöntemler kullanılır. Huffman sıkıştırma algoritması kayıpsız bir veri sıkıştırma tekniğini içerir.

Huffman sıkıştırma algoritması şöyle hesaplanır.
-> Dosyadaki her karakterin ne kadar geçtiği yüzde olarak bulunur.
-> Her bir karakter ve yüzdeyi bir ağaç düğümü kabul edilir ve yaprak düğümü olur.
-> Kök düğümler elde edilirken her zaman için küçük iki değere sahip düğüm birleştirilir.
-> Bütün düğümler birleştirilenedek ağaç oluşturulur.
-> Her düğümün sol elemanı 0 , sağ elamanı 1 olarak kabul edilerek kodlama yapılır.

Örnek;
Bir metinde geçen karakterlerin sayıları
A=250 B=350 C=500 D=900 E=1200 F=100 G=600 H=1100

Yüzdeleri hesaplıyoruz.
A=%5 B=%7 C=%10 D=%18 E=%24 F=%2 G=%12 H=%22

Şimdi ağacımızı oluşturuyoruz.



Şimdi hesaplamalarımızı yapıyoruz.
Dosyanın normal boyutu 5000 btye = 5000 x 8(bit ile ifade edildiğinde) =40 000 byte

Huffman algoritması 
= A(5x250)+ B(4x350) + C(3x500) + D(3x900) + E(2x1200) + F(5x100) + G(3x600) + H(2x1100)
=13750 byte sıkıştırılmış hali

Örnek metin "bahc" kodlaması "0001(b)00001(a)11(h)100(c)" "00010000111100" 

Kısaca huffman sıkıştırma algoritmasında karakterin bulunma sıkılığına göre ifade edildiği bit sayısı değişmektedir.

Algoritmanın kodu