Yoksa evini şişirir, şişirir ve evini havaya uçurur!
Bu tamamen alakasızdı. Bu zorluk aslında Huffman kodlamasıyla ilgilidir . Bunun özü, temsilini kısaltmak için belirli bir metindeki karakterlerin sıklığıdır. Başka bir deyişle, en bizim alfabe olduğunu varsayalım a
yoluyla z
ve uzay. Bu 27 karakterdir. Her biri sadece 5 bit ile benzersiz şekilde kodlanabilir, çünkü 5 bit 32 karakter için yeterli alana sahiptir. Ancak, çoğu durumda (İngilizce veya genel olarak diller gibi), bazı karakterler diğerlerinden daha sıktır. Biz kullanabilirsiniz az daha seyrek karakterler için daha sık karakterler ve (belki) daha fazla bit için bit. Doğru yapıldığında, bit sayısında genel bir tasarruf vardır ve orijinal metin yine de benzersiz bir şekilde yeniden oluşturulabilir.
Örnek olarak "bu soru huffman kodlamasıyla ilgilidir" örneğini ele alalım. Bu metin 37 karakter uzunluğundadır, normalde 37 * 8 = 296 bit olur, ancak her karakter için yalnızca 5 bit kullanırsak yalnızca 37 * 5 = 185 bit olur. Bunu aklınızda bulundurun.
Her karakterin ve metindeki sıklıklarının, en azdan en az sıklığa göre sıralanmış bir (sorta) tablosu (burada bir boşluk için duruyor):
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
İlişkili bir optimal kodlama şunlar olabilir:
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Bunun, her karakter için sadece 5 bit kullanmaktan daha iyi bir kodlama olacağı hemen anlaşılmalıdır. Ne kadar iyi olduğunu öğrenelim!
185 bit , 185 ile karşılaştırıldı! Bu 40 bitlik bir tasarruf veya% 20'nin biraz üzerinde! (Bu, elbette, yapı hakkındaki bilgilerin kod çözme için mevcut olduğunu varsayar.) Bu kodlama en uygunudur, çünkü herhangi bir karakterin temsilini değiştirerek daha fazla bit atılamaz.
Görev
- Bir program veya işlev bir parametre ile yazın ...
- STDIN'den (veya eşdeğeri) veya tek bir bağımsız değişken olarak girdi alır.
- Frekansa göre sıralanmış karakterlerle yukarıdaki gibi optimum bir Huffman kodlaması çıktı alın (bir frekans sınıfındaki sıralama önemli değildir).
- Girişteki karakterlerin ASCII aralığı
32..126
artı bir yeni satırla sınırlı olduğunu varsayabilirsiniz . - Girdinin 10.000 karakterden uzun olmadığını varsayabilirsiniz (ideal olarak, teoride, girdinin sınırsız olması gerekir).
- Kodunuzun oldukça hızlı bitmesi gerekir. Yukarıda verilen örnek en az bir dakikadan fazla sürmemelidir. (Bu kaba kuvvetin dışlanması anlamına gelir.)
- Puanlama bayt cinsindendir.
Örnekler
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Mutlu kodlama!
Bu benzer sorunun , bunun yinelenen bir soru olduğu noktaya kadar yakından ilişkili olduğunu unutmayın . Bununla birlikte, Meta üzerinde şu ana kadarki konsensüs , daha eski olanın bunun bir kopyası olarak görülmesi gerektiğidir.
this question is about huffman coding
, ben olmak bit sayısını sayılan 145 değil 136.,