Haffman ağacı
Verilənlərin sıxışdırılmasının nisbətən sadə metodu fayl üçün Haffman ağacları adlanan ağacların qurulması yolu ilə yerinə yetirilə bilər və faylın sıxışdırılması və ondakı verilənlərin açılması üçün istifadə edilir. Bir çox proqramlar üçün Haffman ikilik ağacından istifadə edilir (məsələn, hər bir düyün nöqtəsi yarpaqdır, ya da iki altdüyünü vardır). Lakin ixtiyarı sayda altağacı olan Haffman ağacları qurmaq olar (məsələn, üçlük və ya ümumi halda N-lik ağaclar).
Z müxtəlif simvollardan ibarət fayllar üçün Haffman ağacının Z yarpağı var. Kökdən müəyyən bir simvolu təyin edən yarpağa gedən yol və yarpağa gedən yolda hər bir addım (0, 1, ..., (N-1) ola bilən) kodlaşdırmanı təyin edir. Tez-tez rast gəlinən simvolları kökə yaxın yerləşdirməklə və az rast gəlinənləri kökdən uzaq yerləşdirməklə arzu olunan sıxışdırmaya nail olunur. Daha dəqiq desək, belə ağac o zaman Haffman ağacı adlanır ki, verilmiş faylın kodlaşdırılması üçün minimal sayda N-lik simvollardan istifadə edilmiş olsun.
Bu məsələdə biz yalnız o ağaca baxacağıq ki, hər bir düyün ya daxili düyün olsun, ya da simvolların kodlaşdırılması yarpağı olsun və simvolları kodlaşdırmayan izolyasiya edilmiş yarpaqları olmasın.
Aşağıdakı şəkildə Hafmanın üçlük ağacına nümunə verilmişdir, 'a' və 'е' simvolları bir üçlük simvol ilə kodlaşdırılır. Az rast gəlinən 's' və 'p' simvolları isə iki üçlük simvol ilə və daha az rast gəlinən 'x', 'q' və 'y' simvollarının hər biri isə üç üçlük simvol ilə kodlaşdırılır.
Əlbəttə ki, biz istəyirik ki, B-lik simvollar siyahısını sonra geri açmaq imkanı olsun, sıxışdırmaq üçün hansı ağacın istifadə ediləcəyini bilmək lazımdır. Bunu bir neçə üsulla etmək olar. Bu məsələdə biz növbəti üsuldan istifadə edəcəyik: giriş verilənləri axınının əvvəlində cari faylda leksikoqrafik ardıcıllıqla saxlanılan Z simvolların kodlaşdırılmış qiymətlərini ehtiva edən başlıq veriləcək.
Z giriş simvollarının sayını, Haffman ağacının N-lik olduğunu təyin edən N qiymətini və başlığın özünü bilərək kodlaşdırılmış simvolların ilkin qiymətini tapmaq tələb olunur.
Giriş verilənləri
Giriş verilənləri ayrı-ayrı sətirlərdə verilmiş və növbəti test hallarının sayını təyin edən T tam ədədi ilə başlayır. Sonra isə hər biri 3 sətirdə növbəti şəkildə yerləşmiş hər bir T test halları verilir:
Test halında müxtəlif simvolların Z (2 ≤ Z ≤ 20) sayı;
Haffman ağacının N-lik dərəcəsini təyin edən N ədədi;
Alınan ismarışın başlığını əks etdirən sətir, hər bir simvol [0, (N-1)] rəqəm diapazonunda olacaq. Bu sətirdə 200-dən az simvol olacaq.
Tətbiq: Şifrələnmə zamanı bir neçə başa düşülən olması üçün heç olmazsa və nadir, lakin bu başlıq üçün mümkündür (məsələn, '010011101100' başlığı Z = 5 və N = 2 qiymətləri üçün). Giriş verilənlərində verilmiş bütün test hallarının yeganə həlli olduğuna zəmanət verilir.
Çıxış verilənləri
Hər bir T test halında hər bir Z simvolları üçün dekodlaşdırılmış versiyanı verən Z sayda sətirləri verməli. orijinal->kodlaşdırma formatından istifadə edin, orijinal – [0, (Z-1)] diapazonunda və bu simvollar üçün kodlaşdırılmış rəqəmlərin kodlaşdırılmış sətrinə uyğun (hər bir rəqəm ≥ 0 və < N) onluq ədəddir.