Huffman Kodlaması
Sık geçen harflere kısa kodlar veren, en hafif iki ağacı tekrar tekrar birleştiren açgözlü sıkıştırma algoritması.
Önce bunlara göz at
#Nasıl çalışır?
Huffman kodlaması, kayıpsız veri sıkıştırmanın temel yöntemlerinden biridir. Her harfe sabit uzunlukta (ör. 8 bit) kod vermek yerine, sık geçen harflere kısa, nadir harflere uzun kodlar verir.
Kodlar önek-serbesttir (prefix-free): hiçbir kod başka bir kodun başlangıcı değildir. Bu sayede kodlar arasına ayraç koymadan metin tek anlamlı olarak çözülebilir.
Açgözlü kural: her harf, frekansı kadar ağırlıklı tek düğümlü bir ağaçtır. Her adımda en hafif iki ağaç yeni bir düğümün altında birleştirilir. Sonunda kökten bir harfe giden yol o harfin kodudur: sola gitmek 0, sağa gitmek 1. ABRACADABRA için Huffman 23 bit kullanır; 3 bitlik sabit kodla 33 bit gerekirdi.
#Kendin dene
Orman (ağırlığa göre)
C:1 D:1 B:2 R:2 A:5Sık geçen harflere kısa, nadir harflere uzun kodlar vererek metni sıkıştırıyoruz. Her adımda en hafif iki ağaç birleşir.
#Adım adım
- 01Her harfin frekansını say ve her harf için tek düğümlü bir ağaç oluştur.
- 02En hafif iki ağacı seç (öncelik kuyruğu ile).
- 03Bunları ağırlıkları toplamı olan yeni bir düğümün altında birleştir.
- 04Tek ağaç kalana kadar tekrarla; kökten yapraklara giden yollar kodları verir.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
import heapq
from collections import Counter
def huffman_bits(text: str) -> int:
"""Total bits of the Huffman-coded text: each merge adds its weight once per level."""
heap = list(Counter(text).values())
heapq.heapify(heap)
bits = 0
while len(heap) > 1:
a = heapq.heappop(heap) # the two lightest trees
b = heapq.heappop(heap)
bits += a + b # every letter below the new node gets one more bit
heapq.heappush(heap, a + b)
return bits
text = "ABRACADABRA"
print(huffman_bits(text)) # 23
distinct = len(set(text))
print(len(text) * (distinct - 1).bit_length()) # a fixed-length code: 3 bits per letter#Karmaşıklık
| İşlem | Süre |
|---|---|
| Frekans sayımı | O(n) |
| Ağaç kurma (min-heap ile) | O(k log k) |
| Kodlama | O(n) |
| Bellek | O(k) |
n metnin uzunluğu, k farklı harf sayısıdır. k − 1 birleştirmenin her biri öncelik kuyruğunda O(log k) sürer. Huffman, harf başına kod kullanan önek-serbest kodlar arasında toplam uzunluğu en küçük olanı verir; eşit frekanslarda farklı ama aynı uzunlukta kodlar çıkabilir.
#Ne zaman kullanılır?
ZIP/DEFLATE, gzip, PNG, JPEG ve MP3 gibi formatlar sıkıştırmanın bir aşamasında Huffman kodlaması kullanır. Fikir; veri sıkıştırma, iletişimde bant genişliği tasarrufu ve karar ağaçlarının optimizasyonunda da karşımıza çıkar.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
Huffman kodlaması sık geçen harflere nasıl kodlar verir?
- 1Daha kısa kodlar
- 2Daha uzun kodlar
- 3Hep aynı uzunlukta kodlar
- 4Rastgele kodlar
"Önek-serbest kod" ne demektir?
- 1Hiçbir kod başka bir kodun başlangıcı değildir
- 2Kodların hepsi aynı uzunluktadır
- 3Kodlar sıralıdır
- 4Kodlarda 0 kullanılmaz
Huffman her adımda hangi iki ağacı birleştirir?
- 1En hafif iki ağacı
- 2En ağır iki ağacı
- 3Alfabetik ilk iki ağacı
- 4Rastgele iki ağacı
Orta
ABRACADABRA metni Huffman ile kaç bit tutar?
- 123
- 233
- 311
- 488
Zor
k farklı harf için Huffman ağacını min-heap ile kurmanın maliyeti nedir?
- 1O(k log k)
- 2O(k²)
- 3O(k)
- 4O(2ᵏ)