Algoritmalar II Ders 8 Açgözlü Algoritmalar
Huffman kodlari
Huffman kodlari Huffman kodları algoritması veri sıkıştırma için 1952 yılında Huffman tarafından üretilmiştir. Bu algoritma açgözlü yaklaşımla tasarlanmıştır.
Sıkıştırma problemi Problem: Verilen metni en az bit kullanarak sıkıştırınız (kodlayınız) 2 tür sıkıştırma vardır: -Veri kaybına yol açan sıkıştırmalar. Örneğin WhatsApp’da gönderilen fotoğraflar veri kaybına uğrar. -Veri kaybına uğramayan sıkıştırmalar, yani sıkıştırılmış metin orijinaline dönüştürülebilir
Brute force çözüm Veri kaybına yol açmadan sıkıştırma problemi aşağıdaki gibi çözülebilir: Her sembolü aynı uzunlukta ikilik sayılarla eşleştiririz.
Huffman ana fikri Veri içerisinde en az kullanılan karakter için en uzun, en çok kullanılan karakter için de en kısa kod üretelim. Bir karakterin bir metinde kullanım sayısına bu karakterin frekansı denir.
Huffman ağaci Frekans tablosunu metin dosyasını kullanarak elde ettikten sonra yapmamız gereken’’Huffman Ağacını’’ oluşturmaktır. Huffman ağacı hangi karakterin hangi bitlerle temsil edileceğini(kodlanacağını) belirlememize yarar.
Algoritma Algoritmanın adımları aşağıdaki şekildedir: 1. Her karakter frekanslarına göre küçükten büyüğe doğru sıralanır ve tüm karakterler bir ağacın yaprak düğümlerine 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 az frekansa sahip iki düğüm alınır. 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.
ÖRNEK Bu örnekte aşağıdaki frekans tablosu kullanılacaktır. Karakter Frekans A 80 B 60 C 30 D 20 E 10 F 5 Bu örnekte aşağıdaki frekans tablosu kullanılacaktır. Bu tablodan çıkarmamız gereken şudur : Elimizde öyle bir metin dosyası var ki “A" karakteri 80 defa, “B" karakteri 60 defa .... “f" karakteri 5 defa geçiyor. Amacımız ise her bir karakteri hangi bit dizileriyle kodlayacağımızı bulmak.
ÇÖZÜM; 1 - Öncelikle "Huffman Ağacını" ndaki en son düğümleri(yaprakları) oluşturacak bütün semboller frekanslarına göre aşağıdaki gibi küçükten büyüğe doğru sıralanırlar. A 80 F 5 E 10 D 20 C 30 B 60
ÇÖZÜM; 1 En küçük frekansa sahip olan iki sembolün frekansları toplanarak yeni bir düğüm oluşturulur. Ve oluşturulan bu yeni düğüm diğer var olan düğümler arasında uygun yere yerleştirilir. - FE 15 D 20 C 30 B 60 A 80 F 5 E 10
ÇÖZÜM; 1 Aynı işlem tekrar edilir- C 30 FED 35 B 60 A 80 FE 15 D 20 F 10
ÇÖZÜM; 1 Aynı işlem tekrar edilir- CFED A B 80 60 65 C FED 30 35 FE D 15 D 20 F 5 E 10
Bir sonraki adim - A 80 BCFED 125 B 60 CFED 65 C 30 FED 35 FE 15 D 20 10
Son adim - ABCFED 205 BCFED 125 A 80 B 60 CFED 65 C 30 FED 35 FE 15 D 10
Huffman ağacının son halini oluşturduğumuza göre her bir sembolün yeni kodunu oluşturmaya geçebiliriz. Sembol kodlarını oluştururken Huffman ağacının en tepesindeki kök düğümden başlanır. Kök düğümün sağ ve sol düğümlerine giden dala sırasıyla “1" ve “0" kodları verilir. Sırası ters yönde de olabilir. Bu tamamen seçime bağlıdır. Ancak ilk seçtiğiniz sırayı bir sonraki seçimlerde korumanız gerekmektedir.
Huffman kodu - ABCFED 205 BCFED 125 A 80 B 60 CFED 65 C 30 FED 35 FE 0 1 0 1 0 1 0 1 0 1 BCFED 125 A 80 B 60 CFED 65 C 30 FED 35 FE 15 D 20 F 5 E 10
8 - Her bir sembol için kökten ilgili yaprağa gelene kadar yolda bulunan kodlar birleştirilip kod oluşturulur. Karakter Frekans Bit sayısı Kod A 80 1 B 60 2 10 C 30 3 110 D 20 4 1111 E 5 11101 F 11100
Örnek üzerinde Huffman kodu avantajinin hesaplanmasi : Her bir karakter için eşit uzunlukta kodlama yapalım. 6 karakterimiz olduğuna göre en az 3 bit uzunluğunda bir kodlama yapabiliriz. Örneğin, A için 000, B için 001, C için 010, D için 011, E için 100, F için 101 kodlaması yapılırsa toplam 205.3=615 bit gerekir. Huffman algoritmasına göre A nın kodu 0, B nin kodu 10, C nin kodu 110, D nin kodu 1111, E nin kodu 11101 ve F nin kodu 11100 oldu. Yani A için 1 bit, B için 2 bit, C için 3 bit, D için 4 bit, E iin 5 bit ve F için 5 bit gereklidir. Her karakterin frekansını bit uzunluğu ile çarpıp toplarsak 80.1+60.2+30.3+20.4+10.5+5.5=445 bit yeterli olur.
HUFFMAN KODU İLE KODLANMİŞ METNİN ESKİ HALİNE GETİRİLMESİ Örnek üzerinde şunu görebilirsiniz: Hiçbir karakterin kodu başka bir karakterin ön dizgesi değil, yani örneğin A nın kodu 0 dır ve diğer karakterlerin kodu 0 la başlamamaktadır. Bu da metni eski haline dönüştürme imkanı veriyor.
ÖRNEK; Huffman Kodu ile kodlanmış metin aşağıdaki olsun: “11011101111000” Huffman ağacında kökten başlayarak yapraklara doğru gidelim. Verilen metinde ilk karakter 1 olduğu için sağa git, sıradaki karakter 1 sağa git, sıradaki 0 sola git ve yapağa gelindi. Yani ilk 3 karakter 110 bu yapraktaki karakter C oldu. Tekrar kökten başlayarak aynı işlemleri yap. 1 sağa git, 1 sağa git, 1 sağa git, 0 sola git ve 1 sağa git, yaprak E, tekrar kökten başlayarak, 1 sağa, 1 sağa, 1 sağa, 0 sola, 0 sola, yaprak F oldu. Tekrar kökten başlanırsa 0 sola yaprak A, ayni metin CEFA oldu.