Huffman kodlaması neden Lempel-Ziv'in yapmadığı entropiyi ortadan kaldırıyor?


13

Popüler DEFLATE algoritması, Lempel-Ziv'in üstünde Huffman kodlamasını kullanır.

Genel olarak, rastgele bir veri kaynağımız varsa (= 1 bit entropi / bit), Huffman dahil hiçbir kodlamanın ortalama olarak sıkıştırması olası değildir. Lempel-Ziv "mükemmel" olsaydı (uzunluk sonsuza kadar giderken çoğu kaynak sınıfı için yaklaşır), Huffman ile post kodlama yardımcı olmaz. Tabii ki, Lempel-Ziv en azından sonlu uzunlukla mükemmel değildir ve bu nedenle biraz fazlalık kalır.

Bu kalan artıklık, Huffman kodlamasını kısmen ortadan kaldırarak sıkıştırmayı geliştirir.

Sorum şu: Bu kalan artıklık neden Luff tarafından değil Huffman kodlamasıyla başarıyla ortadan kaldırılıyor? Huffman'a karşı LZ'nin hangi özellikleri bunu gerçekleştirir? Sadece LZ'yi tekrar çalıştırmak (yani, LZ sıkıştırılmış verileri LZ ile ikinci kez kodlamak) benzer bir şey başarabilir mi? Değilse, neden olmasın? Benzer şekilde, önce Huffman ile ve daha sonra LZ ile sıkıştırılır ve eğer değilse, neden?

GÜNCELLEME: LZ'den sonra bile bir miktar fazlalığın kalacağı açıktır. Birkaç kişi bu noktaya değindi. Açık olmayan şey şu: Kalan artıklık neden Huffman tarafından LZ'den daha iyi ele alınıyor? LZ'nin Huffman'dan daha iyi çalıştığı orijinal kaynak yedekliliğinin aksine, benzersiz olan nedir?

Yanıtlar:


13

Bu aslında bir yorumdu, ama çok uzun sürdü.

DEFLATE'e bakarsanız, Huffman tarafından sıkıştırılan şey LZ77'nin çıktısıdır; LZ77, (ham verilerden daha az bit aldığında) sıkıştırılan dizeye daha önce bir işaretçi ve işaretçiden sonra kaç sembolün alınacağını söyleyen bir eşleşme uzunluğu göndererek çalışır. Teori, ek sıkıştırma olmadan bile, bu tekniğin sonunda kaynak entropisine yakınlaştığını göstermektedir. Ancak, veri sıkıştırmada, tamamen rastgele olmayan bir dağıtımınız olduğunda, onu da sıkıştırabilirsiniz. LZ77'nin çıktısının (işaretçiler ve maç uzunlukları) tamamen rastgele olduğuna inanmak için hiçbir neden yoktur. LZ77 asimptotik olarak optimal olduğu için asimptotik sınırda tam bir rasgele birleşmek zorundalar, ancak pratikte sadece sınırlı bir sözlük kullanıyorsunuz, bu yüzden muhtemelen üzerinde daha fazla sıkıştırma yaparak kazandığınız tamamen rastgele olmaktan yeterince uzak dururlar. Doğal olarak, işaretçiler için bir Huffman kodu ve maç uzunlukları için başka bir Huffman kodu kullanırsınız, çünkü bu iki işlem farklı istatistiklere sahiptir.

İkinci sıkıştırma turu için neden LZ yerine Huffman kullanıyorsunuz? LZ'nin Huffman'a göre en büyük avantajı, semboller arasındaki bağımlılıkları tedavi etmektir. İngilizce'de, bir harf 'q' ise, bir sonraki harfin 'u' olması muhtemeldir. Semboller bağımsız olaylarsa, Huffman daha basittir ve kısa dizeler için iyi veya daha iyi çalışır. LZ77'nin çıktısı için sezgim, sembollerin oldukça bağımsız olması gerektiğinden Huffman'ın daha iyi çalışması gerekiyor.


1. paragrafta yanınızdayım: LZ, daha fazla sıkıştırmak için hala biraz fazlalık bırakıyor. Ama 2. paragrafınız el sallamıyorsa hala atlıyor gibi görünüyor. İki iddia vardır: 1. LZ'den sonra kalan artıklık sıfır derecedir (yani p (X_n) yaklaşık x_n-1'den bağımsızdır; Sıfır dereceli modelde olduğu gibi sıfır dereceli terimini kullanıyorum, ör. data-compression.com/theory.shtml ) ve 2. Sıfır sıralı yedeklilikte Huffman LZ'den daha iyi çalışır; Üst düzey yedeklilikte LZ daha iyi çalışır. Belki de bu iddiaların ikisi de doğrudur, ancak ikisini de haklı göstermediniz
SRobertJames

2
@Robert: Yüksek dereceli korelasyonların Huffman kodlaması üzerinde hiçbir etkisi yoktur. LZ, daha yüksek mertebeden artıklık için asimptotik olarak en uygun şekilde çalışır, ancak gerekli olan ek yük, sonlu uzunluktaki sıfır mertebeli kaynaklarda da işe yaramayacağı anlamına gelir. Bu, bir yerde literatürde deneysel olarak incelenmiş olmalıdır; belki başka biri referansa bir işaretçi verebilir. Nokta 1 için, sezgim, LZ'den sonra kalan herhangi bir üst düzey artıklığın herhangi bir basit kodlama şemasında kullanılmak için çok karmaşık olmasıdır, ancak bunu haklı çıkarmanın iyi bir yolu yoktur.
Peter Shor

10

Veri sıkıştırma gerçekten iki şeyden oluşur: modelleme ve kodlama. LZ ailesinin algoritmaları, metni, birçok rastgele kaynak için asimptotik olarak en uygun ve birçok gerçek metin için oldukça iyi olan kesin tekrarların bir birleşimi olarak modellemektedir. Bununla birlikte, bazı girdiler için bu model oldukça kötü olabilir. Örneğin, sonek dizisi orijinal metin kadar sıkıştırılabilir olsa da, bir sonek dizisini doğrudan sıkıştırmak için LZ'yi kullanamazsınız.

LZ77, girdiyi tekrarlama başına tuples dizisi olarak kodlar; burada , daha önceki bir oluşumun göstergesidir, tekrarlamanın uzunluğudur ve , bir sonraki karakterdir. Genellikle bu dizi çok sayıda (oldukça uzun) kesin tekrar içermez, bu nedenle sıkıştırmak için başka bir LZ tabanlı algoritma kullanamayız. Bunun yerine, başka modeller aramalıyız.p c(p,,c)pc

Bir demetin üç bileşeninden, işaretçi büyük bir rasgele tamsayı olarak düşünülebilir, bu yüzden onu bir -bit tamsayı olarak kodlamak ( uzunluğu uzunluğu için ) oldukça iyi bir seçimdir. Öte yandan, tekrar uzunlukları genellikle küçüktür, bu yüzden onları büyük sayılar üzerinde küçük sayıları destekleyen kodlarla kodlamalıyız. Huffman uygun bir kodlama şemasıdır ve başkaları da vardır. Tekrarlardan sonraki karakterler muhtemelen eşit olarak dağıtılmaz, bu yüzden en belirgin yedeklemeyi sıkıştırmak için Huffman gibi sıfır dereceli bir kompresör kullanabiliriz.nlognn

Kısacası, Huffman, modeli (sabit tekrarlamaya karşı kesin tekrarlar) veriler için daha iyi bir eşleşme olduğundan, tüpleri sıkıştırırken LZ'yi yener.


Teşekkürler Jouni. Kalan ana artıklık, rep uzunluklarının genellikle daha büyük olmaktan ziyade daha küçük olduğu ([0,2 ^ n] üzerine eşit olarak dağıtılmadığı) gibi geliyor. Huffman bu sıfır derece asimetrisinde iyi performans gösterirken, LZ'nin iyi çalışması için daha büyük özelliklere ihtiyacı var. Bu doğru mu? Ve neden Huffman'ı başlamak için kullanmıyorsunuz - neden LZ ile hiç uğraşmıyorsunuz?
SRobertJames

3
Metni doğrudan Huffman ile sıkıştırırsak, sıfır dereceli entropiden daha iyi sıkıştırma elde edemeyiz. Bununla birlikte, çoğu gerçek metin, sıfır dereceli entropi ile yeterince modellenemeyen önemli fazlalık kaynaklarına sahiptir. Birçok durumda, Huffman'dan önce LZ kullanmak bu fazlalığı sıkıştırmamıza izin verir.
Jouni Sirén

2

Cevabın arama sözlüğü boyutunda olduğuna inanıyorum.

Verilerin bir yer hissi vardır (yani, bir veri parçası kullanılmışsa, yakında tekrar kullanılacaktır) ve LZ algoritması, arama sözlüğü yapısında bundan yararlanır. Aramaları hızlı tutmak için sonlu miktarda olası düğümlere sahip bir üçlü oluşturur . Boyut sınırına ulaştığında, bir öncekini "unutarak" başka bir üçlü yapar. Bu nedenle, daha basit karakterler için tekrar arama tablosu oluşturmak zorundadır, ancak bazı kelimeler artık kullanılmıyorsa, artık bellekte tutulmazlar, böylece daha küçük bir kodlama kullanılabilir.

Bu nedenle, bir LZ çıkışı Huffman kodlaması ile daha da azaltılabilir, çünkü arama denemelerinin oluşturulmasındaki bu fazlalık istatistiksel analizle tespit edilebilir.


İlk paragrafı kabul ediyorum: LZ'nin neden fazlalık bıraktığını açıklıyorsunuz. Fakat ikinci paragraf oldukça büyük bir sıçrama gibi görünüyor: Huffman neden bu fazlalığı yakalar? Neden tekrar LZ olmasın? Ve eğer Huffman daha kapsamlıysa, neden sadece başlamakla kalmıyor?
SRobertJames

2

Belki de burada pist dışındayım, ancak Huffman kodlaması, kodlama tablosunu (ağaç) oluşturmak için tüm girdiye bakar, oysa Lempel-Ziv ilerlerken kodlar. Bu Huffman için hem bir avantaj hem de dezavantaj. Dezavantaj, elverişsizdir, yani başlamadan önce tüm girdiyi görmek zorundayız. Avantajı, Huffman'ın girdinin herhangi bir yerinde gerçekleşen istatistikleri dikkate almasıdır, oysa Lempel-Ziv bunu kademeli olarak oluşturmak zorundadır. Ya da farklı bir şekilde ifade etmek gerekirse, Lempel-Ziv'in Huffman'ın yapmadığı bir "yönü" vardır.

Ama bütün bunlar sadece şeylerin nasıl olduğunu hayal etmenin naif yolu. Huffman'ın Lempel-Ziv'den tam olarak daha iyi performans gösterdiğini görmek için burada gerçek bir kanıta ihtiyacımız var.


2
İnsanlar, girdiye yalnızca bir kez bakan uyarlanabilir Huffman kodlamasını tanımladılar. Bu tartışmanın amaçları doğrultusunda, uyarlanabilir ve uyarlanamayan Huffman kodlaması benzer şekilde davranacaktır.
Peter Shor

2

Kısa cevap, LZ, kaynağın tam dağılımını bilmesine gerek olmadığı için "evrensel" bir algoritmadır (sadece kaynağın sabit ve ergodik olduğu varsayımına ihtiyaç duyar). Ama Huffman değil; kaynağın örneklendiği tam dağılımı bilmelidir (Huffman ağacını yapmak için). Bu ek bilgi, Huffman'ın sıkı sıkıştırma garantileri almasını sağlar. Bununla birlikte, pratik dosya sıkıştırma algoritmaları için Huffman daha az elverişli olabilir, çünkü önce dosyanın ampirik istatistiklerini toplayıp daha sonra ikinci yarıda gerçek sıkıştırmayı yapması gerekirken, LZ çevrimiçi olarak uygulanabilir.

Daha fazla ayrıntı standart bilgi teorisi metinlerinde bulunabilir, ör. Cover and Thomas tarafından hazırlanan Bilgi Teorisinin Unsurları.


Sabit ergodik kaynağın sadece LZ'yi analiz etmeyi kolaylaştıran bir varsayım olduğunu düşünüyorum. Sonuçta, sıkıştırma, çoğu durumda istatistiksel özelliklerle güzel bir şekilde çakışan girdinin kombinatoryal özelliklerine dayanmaktadır. Örneğin, düz metin biçiminde İngilizce metinlerin bir koleksiyonunu ve ardından HTML biçiminde aynı metinleri düşünün. LZ, sabit bir ergodik kaynak tarafından üretilen bir şeye benzemese de bu koleksiyonu oldukça iyi sıkıştırır.
Jouni Sirén

@Jouni: Bu yoruma katılmıyorum; Bir anlamda, düz metin İngilizce dilinin sabit bir ergodik kaynağa çok benzediğini düşünüyorum ve bu benzerlik LZ'nin tam olarak yararlandığı şeydir.
Peter Shor

@Peter: Ancak bu durumda, kaynak önce bazı metinleri düz metin biçiminde, sonra da tam olarak aynı metinleri HTML biçiminde üretir. Bazı düzensiz noktalarda düz metinden HTML'ye yapılan bu değişiklik ergodik sabit özelliği bozuyor gibi görünüyor. Öte yandan, düz metin biçimindeki bir metin ile HTML biçimindeki aynı metin arasında çok sayıda karşılıklı bilgi olduğundan, sıkıştırma sonuçları düz metinleri ve HTML metinlerini ayrı ayrı sıkıştırmaktan çok daha iyidir.
Jouni Sirén
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.