Huffman kodlaması hakkında biraz farklı düşünme şekline bakalım.
0.5, 0.25 ve 0.25 olasılıkları olan A, B ve C olmak üzere üç sembolden oluşan bir alfabeniz olduğunu varsayalım. Olasılıkların hepsi ikisinin ters kuvvetleri olduğu için, bu optimal olan bir Huffman koduna sahiptir (yani aritmetik kodlama ile aynıdır). Bu örnek için 0, 10, 11 standart kodunu kullanacağız.
Bizim devlet olarak adlandırdığımız bir büyük tam sayı olduğu varsayalım . Kodlamayı, geçerli durumu alan bir işlev ve kodlanacak ve yeni durumu döndüren bir sembol olarak düşünebilirsiniz:s
encode(s,A)encode(s,B)encode(s,C)=2s=4s+2=4s+3
Şimdi durum 11 ile (ikili olarak 1011) başlayalım, B sembolünü kodlayalım. Yeni durum 46, ikili olarak 101110. Gördüğünüz gibi, bu, dizi 10'un sonuna eklenmiş olan "eski" durumdur. Biz esas olarak bit dizisi 10 "çıktı" var.
Çok uzak çok iyi.
Şimdi bir an için aritmetik kodlamanın nasıl çalıştığını düşünün. Olasılıkları ortak bir payda üzerine koyarsanız, A sembolü aslında aralığı temsil eder , B sembolü[2[04,24)ve C sembolü[3[24,34).[34,44)
Temelde burada yaptığımız her şeyi ortak payda ile çarpmak. Durumun aslında taban 4'te olduğunu düşünün. Bir B sembolünü kodlamak gerçekten bu tabanda 2 rakamını çıkarır ve bir C sembolünü kodlamak o tabanda 3 rakamını çıkarır.
Bununla birlikte, A sembolü biraz farklıdır, çünkü taban 4'te tam bir rakam değildir.
Bunun yerine, alfabeyi A_0, A_1, B, C, eşit olasılıklı simgeler kümesi olarak düşünebiliriz. Bu, yine, optimum bir Huffman koduna 00, 01, 10, 11 sahiptir. Ya da, bunu taban 4'te düşünebiliriz. Bir sembolü kodlamak için sadece şunu yaparız:
encode(s,A0)encode(s,A1)encode(s,B)encode(s,C)=4s+0=4s+1=4s+2=4s+3
Şimdi B ve C sembollerinin nasıl kodlanacağı açık, ancak A sembolünü kodlamak için bir seçeneğimiz var. Hangisi ve A 1 kullanacağız?A0A1
Şimdi burada akıllıca bir fikir: Biz devlet bilgilerin bir bit çalmak :s
i=smod2
s′=⌊s2⌋
i=smod2
ve sonra .encode(s′,Ai)
Önceki örneğimizi kullanarak, , s ′ = 5 ve i = 1 olduğunu buldukve ( 5 , A 1 ) = 4 × 5 + 1 = 21 kodladık . Yeni durum ikili olarak 10101'dir.s=11s′=5i=1encode(5,A1)=4×5+1=21
Şimdi bu, Huffman kodlamasıyla tam olarak aynı bit çıktısını üretmez, ancak aynı uzunlukta bir çıktı üretir. Ve umarım görebileceğiniz gibi, bu da benzersiz bir şekilde çözülebilir. Bir sembolün kodunu çözmek için, 4'e bölündükten sonra kalanları alırız. Değer 2 veya 3 ise, sembol sırasıyla B veya C'dir. 0 veya 1 ise, sembol A olur ve sonra durumu 2 ile çarpıp 0 veya 1 ekleyerek biraz bilgi ekleyebiliriz.
Bu yaklaşımla ilgili güzel olan şey, olasılıkların payı ve / veya paydası ikisinin gücü olmadığında, doğal olarak kesirli bit kodlamasına uzanmasıdır. A ve B olmak üzere iki sembolümüz olduğunu varsayalım, burada A olasılığı ve B olasılığı2'dir.35 . Sonra bir sembolü şu şekilde kodlayabiliriz:25
encode(s,A0)encode(s,A1)encode(s,A2)encode(s,B0)encode(s,B1)=5s+0=5s+1=5s+2=5s+3=5s+4
s′=⌊s3⌋i=smod3encode(s′,Ai)
Bu aritmetik kodlamaya eşdeğerdir. Aslında Asimetrik Sayısal Sistemler olarak bilinen bir yöntem ailesidir ve son birkaç yıldır Jarek Duda tarafından geliştirilmiştir. İsmin anlamı açık olmalıdır: sembolünü olasılık ile kodlamakpq
Kodlama yöntemleri ailesi olmasının nedeni, burada gördüğümüz şeyin kendi başına pratik olmamasıdır; durum değişkenini verimli bir şekilde manipüle etmek için muhtemelen sonsuz hassasiyetli tamsayılara sahip olmamanız için bazı değişikliklere ihtiyaç duyar ve bunu başarmanın çeşitli yolları vardır. Aritmetik kodlama, elbette, durumu için benzer bir soruna sahiptir.
Pratik varyantlar arasında rANS ("r", "oran" anlamına gelir) ve tANS ("tablo güdümlü") sayılabilir.
ANS'nin hem pratik hem de teorik olarak aritmetik kodlamaya göre birkaç ilginç avantajı vardır:
- Aritmetik kodlamanın aksine, "durum" bir çift sözcük yerine tek bir kelimedir.
- Sadece bu değil, aynı zamanda bir ANS kodlayıcısı ve karşılık gelen kod çözücüsü aynı durumlara sahiptir ve işlemleri tamamen simetriktir. Bu , kodlanmış sembollerin farklı akışlarını araya sokabilmeniz ve her şeyin mükemmel şekilde senkronize edilmesi gibi bazı ilginç olasılıkları artırır .
- Pratik uygulamaların, elbette, bilgileri gittikçe "çıktılamak" ve sadece sonunda yazmak için büyük bir tamsayıda toplamak değil. Bununla birlikte, "çıktının" boyutu (genellikle mütevazı) sıkıştırma kaybı karşılığında yapılandırılabilir. Dolayısıyla, aritmetik kodlayıcıların bir kerede biraz çıktı alması gerektiğinde, ANS bir seferde bir bayt veya bir çakıl çıktısı verebilir. Bu size hız ve sıkıştırma arasında doğrudan bir denge sağlar.
- Mevcut nesil donanımda ikili aritmetik kodlama kadar hızlı ve bu nedenle Huffman kodlaması ile rekabet edebilir görünmektedir. Bu onu büyük harfli aritmetik kodlama ve değişkenlerinden (ör. Aralık kodlama) çok daha hızlı yapar.
- Patentsiz görünüyor.
Bir daha asla aritmetik kodlama yapacağımı sanmıyorum.