Huffman Kodlaması (Huffman Encoding)

Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinde veri sıkıştırmak için kullanılan bir kodlama yöntemidir. Kayıpsız (lossless) olarak veriyir sıkıştırıp tekrar açmak için kullanılır. Huffman kodlamasının en büyük avantajlarından birisi kullanılan karakterlerin frekanslarına göre bir kodlama yapması ve bu sayede sık kullanılan karakterlerin daha az, nadir kullanılan karakterlerin ise daha fazla yer kaplamasını sağlamasıdır.

Şayet bütün karakterlerin dağılımı eşitse yani aynı oranda tekrarlanıyorsa, bu durumda Huffman kodlaması aslında blok sıkıştırma algoritması (örneğin ASCII kodlama) ile aynı başarıya sahiptir. Ancak bu teorik durumun gerçekleşmesi imkansız olduğu için her zaman daha başarılı sonuçlar verir.

Örneğin sadece 8 sembolden oluşan bir dilimiz olsun (Örneğin a,b,c,d,ef,g,h harflerinden oluşan bir dil düşünelim) Bu dili kodlamak için 3 bit yeterlidir (23=8 olduğuna göre 8 farklı dili ikilik tabanda kodlayabiliriz)

Bu durumda örneğin harflerin değerlerini aşağıdaki şekilde oluşturabiliriz:

a 000

b 001

c 010

d 011

e 100

f 101

g 110

h 111

Her harf için farklı bir kodlama yapılan dilde örneğin “baba caddede gec” mesajını kodlayacak olursak:

001000001000 010000011011100011100 110100010

şeklinde bir sonuç elde ederiz. Görüldüğü üzere kodlama sonucunda harf sayısının üç misli kadar bit kullanılmak zorundadır (14 harf için 14×3=52 bit gerekmektedir).

Huffman kodlaması ile bu mesajı sıkıştıracak olsaydık. Öncelikle harflerin mesajdaki sıklıklarını gösteren biraşağıdaki istatistiğin çıkarılması gerekirdi:
a3
b2
c2
d3
e3
f0
g1
h0

Yukarıda her harfin kullanılma sıklıkları sıralanmıştır. Bu istatistiksel veriye dayanarak bir ağaç oluşturulması gerekir.

Yukarıdaki ağaçta dikkat edilirse dilimizdeki harfler ve her harf düğümlerinin birleşim noktalarında ise o harflerin mesajdaki tekrar sayıları bulunmaktadır. Ayrıca istatistiksel olarak birbirine denk olan sıklıktaki düğümler aynı seviyede bulunmaktadır. Örneğin g+b = 3 sıklığa sahip ve d’de 3 sıklığa sahiptir. Bu durumda d ile g ve b’nin birleştiği düğüm aynı seviyede olmaktadır.

Yukarıdaki bu ağaca göre her harfi veren kodlama karşılığı çıkarılır. Bu çıkarma işlemi sırasında ağaçtaki her sağ kola hareket 1, her sol kola hareket 0 olarak okunur. Örneğin g harfinin değeri 010′dır çünkü kökteki 14 değerinin solunda (yani 0) 6 değerinin sağında (yani 1) ve 3 değerinin solundadır yani toplamda 010 değerine sahiptir.

Bu şekilde her harfin kodlama değeri aşağıda verilmiştir:

a 111

b 011

c 110

d 00

e 10

g 010

Yukarıdaki bu kodlamaya göre ilk mesajımızın yeni değeri :

011111011111 1101110000100010 01010110

Şeklinde bulunmuş olur. Dikkat edilirse bu mesajın boyutu 36 bittir ve ilk baştaki 52 bit uzunluğundan daha kısadır.
Huffman Ağacının Oluşturulması

Genel bir soru üzerine, ağacın oluşturulma algoritmasını yayınlıyorum. Ağacı oluşturmanın çeşitli algoritmaları olduğu gibi, en basit olanı, bir rüçhan sırası (öncelik sırası, priority queue) kullanmaktır. Bu sırada, en düşük olasılığa sahip olan düğüm (node), en yüksek rüçhana sahip olacaktır. Algoritmanın adımları aşağıdaki şekildedir:

1. Algoritma tarafından kodlanacak olan her sembol için birer yaprak düğüm, rüçhan sırasına eklenir.
2. Sırada, birden fazla düğüm kaldığı sürece aşağıdaki adımlar döngü halinde yapılır.
a. Sıradan, en yüksek rüçhana sahip iki düğüm alınır. (bu düğümlerin en az kullanım sıklığına sahip olduğunu hatırlayınız)
b. Yeni bir iç düğüm (internal node) oluşturulup, değer olarak bu alınan iki düğümün toplamı atanır.
c. Yeni düğüm ağaca ve sıraya eklenir.
3. Döngü bitip tek düğüm kaldıysa, bu düğüm, kök düğüm yapılır ve algoritma sona erer.

Şimdi, yukarıdaki bu algoritmaya göre ağacımızı oluşturalım. Harfler ve kullanım sıklıkları aşağıdaki şekildedir:

d3,e3,a3,b2,c2,g1

Buna göre bir rüçhan sırası yaparsak:

g1, b2, c2, a3, d3, e3 şeklinde en düşük sıklığan sahip olan en önde olacaktır.(ayrıca eşit öncelikli olanlar, kendi aralarında istenildiği gibi sıralanabilir.)

Algoritmanın 2. adımına geçiyor ve döngümüzü çalıştırmaya başlıyoruz.

Sıradaki en yüksek rüçhana sahip iki düğümü alalım: g1, b2

Toplamlarını hesaplayalım: 1+2 = 3

Yeni çıkan bu düğümü ağaca ve sıraya ekleyelim. Ağaç hali aşağıdaki şekildedir:

  3
 /  \
g1  b2

Sıra için bu düğümlerden oluşan ağaca gb3 ismini verirsek, sıramız aşağıdaki hali alır:

c2, a3, d3, gb3, e3

Sıradan iki düğüm daha alıyoruz: c2, a3, toplamları : 2 + 3 = 5, ağaca ekliyoruz:

  5
 /  \
c2  a3

d3, gb3, e3, ca5

Sıradan iki düğüm daha alıp ağaç oluşturuyoruz: d3, gb3

    6
  /  \
 d3   3
     / \
   g1  b2

Yeni düğümü sıraya ekleyelim: e3, ca5, dgb5 Sıradaki düğümler: e3, ca5

   8
 /  \
e3   5
    /  \
   c2  a3

Sıraya ekleyelim:

dgb6, eca8

Bu iki düğümü alıp ağacı oluşturduğumuzda ise sonuç ağacımız çıkmaktadır:

Bu yazıyı beğendiyseniz, başkalarının da ilgisini çekebilirsiniz:


881 views

4 responses to “Huffman Kodlaması (Huffman Encoding)”
  1. tarık-ege.üni says:

    Güzel açıklanmış elinize sağlık.Ama bence bazı eksiklikler var.Mesela 14′ün niye 5-9 diye ayrılmadı da 6-8 diye ayrıldı. ve bu eksikliği bu adresteki bilgiler ile kapatılabilir.
    http://tr.wikipedia.org/wiki/Huffman_kodu#A.C4.9Fac.C4.B1n_olu.C5.9Fturulmas.C4.B1

    maksat içerik zenginlerşsin.

  2. bora says:

    e 3 sıklıktadır.neden a ile aynı hizada değil ve 5 ile aynı hizada bunu anlayamadım … teşekkür ederim

  3. Yukarıdaki yazıda, ağacın nasıl oluşturulduğu konusu eksik kalmış. Dolayısıyla sorunuzun cevabı, yazı içerisinden anlaşılamıyor. Yukarıdaki yazıda eksik olan bu hususu tamamlıyorum.

    başarılar

  4. Anonymous says:

    encoding ve decoding in c ile yazılmış kod örneklerini paylaşmanız mümkün mü acaba ?

Leave a Reply


* 8 = yirmi dört

Benzer Yazılar:

Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Huffman Kodlaması (Huffman Encoding)' isimli yazı 25 Feb 2009 tarihinde, saat: 20:47 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam881 defa okunmuştur.

Benzer yazıları Veri Sıkıştırma (Data Compression), veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


Category: Veri Sıkıştırma (Data Compression), veri yapıları