Алгоритм Гаффмана (або коди Гафмена) — адаптивний жадібний алгоритм оптимального префіксного кодування алфавіту з мінімальною надмірністю. Був розроблений аспірантом Массачусетського технологічного інституту Девідом Гаффманом при написанні ним курсової роботи та надрукований в статті 1952 року «A Method for the Construction of Minimum-Redundancy Codes». Нині[] використовується в багатьох програмах стиснення даних без втрат.
На відміну від алгоритму Шеннона — Фано, алгоритм Гаффмана залишається завжди оптимальним і для m2 з більш ніж двома символами.
Цей метод кодування складається з двох основних етапів:
- Побудова оптимального кодового дерева
- Побудова відображення код-символ на основі побудованого дерева
Кодування Гаффмана
Один з перших алгоритмів ефективного кодування інформації був запропонований 1952 року Девідом Гаффманом. Ідея алгоритму така: знаючи ймовірності появи символів у повідомленні, можна описати процедуру побудови кодів змінної довжини, що складаються з цілої кількості бітів. Символам з більшою ймовірністю ставляться у відповідність коротші коди. Коди Гаффмана володіють властивістю префіксності (тобто жодне кодове слово не є префіксом іншого), що дозволяє однозначно їх декодувати.
Класичний алгоритм Гаффмана на вході отримує таблицю частот з якими зустрічаються символи у повідомленні. Далі на підставі цієї таблиці будується дерево кодування Гаффмана (Н-дерево).
- Символи вхідного алфавіту утворюють список вільних вузлів. Кожен лист має вагу, яка може бути рівною або ймовірності, або кількості входжень символу у стиснене повідомлення.
- Вибираються два вільних вузли дерева з найменшими вагами.
- Створюється їхній батьківський вузол з вагою, рівною їх сумарній вазі.
- Вузол-батько додається в список вільних вузлів, а два його нащадки видаляються з цього списку.
- Одній дузі, котра виходить з вузла батька, ставиться у відповідність біт 1, інший — біт 0.
- Кроки, починаючи з другого, повторюються доти, поки в списку вільних вузлів не залишиться тільки один вільний вузол. Він і буде вважатися коренем дерева.
Припустимо, у нас є наступна таблиця частот:
15 | 7 | 6 | 6 | 5 |
---|---|---|---|---|
A | B | C | D | E |
Цей процес можна подати як побудову дерева, корінь якого — символ з сумою ймовірностей об'єднаних символів, отриманий при об'єднанні символів з останнього кроку, його n0 нащадків — символи з попереднього кроку і т. д.
Щоб визначити код для кожного із символів, що входять у повідомлення, потрібно пройти шлях від листка дерева, який відповідає поточному символу, до його кореня, накопичуючи біти при переміщенні по гілках дерева (перша гілка в шляху відповідає молодшому біту). Отримана таким чином послідовність бітів є кодом цього символу, записаним у зворотному порядку.
Для даної таблиці символів коди Гаффмана будуть виглядати так:
A | B | C | D | E |
---|---|---|---|---|
0 | 100 | 101 | 110 | 111 |
Оскільки жоден з отриманих кодів не є префіксом іншого, вони можуть бути однозначно декодовані при читанні їх з потоку. Крім того, найчастіший символ повідомлення А закодований найменшою кількістю біт, а найрідкісніший символ E — найбільшою.
При цьому загальна довжина повідомлення, що складається з наведених у таблиці символів, складе 87 біт (в середньому 2,2308 біта на символ). При використанні рівномірного кодування загальна довжина повідомлення склала б 117 біт (рівно 3 біти на символ). Зауважимо, що ентропія джерела, яке незалежним чином породжує символи із зазначеними частотами, складає ~ 2,1858 біта на символ, тобто надмірність побудованого для такого джерела коду Гаффмана, що розуміється, як відмінність середнього числа біт на символ від ентропії, становить менше 0,05 біта на символ.
Класичний алгоритм Гаффмана має ряд істотних недоліків. По-перше, для відновлення вмісту стиснутого повідомлення декодер повинен знати таблицю частот, якою користувався кодер. Отже, довжина стиснутого повідомлення збільшується на довжину таблиці частот, яка повинна надсилатися попереду даних, що може звести нанівець всі зусилля щодо стиснення повідомлення. Крім того, необхідність наявності повної частотної статистики перед початком власне кодування вимагає двох проходів по повідомленню: одного для побудови моделі повідомлення (таблиці частот і Н-дерева), іншого для власне кодування. По-друге, надмірність кодування обертається на нуль лише в тих випадках, коли ймовірності кодованих символів є оберненими степеням числа 2. По-третє, для джерела з ентропією, що не перевищує 1 (наприклад, для двійкового джерела), безпосереднє застосування коду Гаффмана позбавлене сенсу.
Адаптивне стиснення
Адаптивне стиснення дозволяє не передавати модель повідомлення разом з ним самим і обмежитися одним проходом по повідомленню як при кодуванні, так і при декодуванні.
У створенні алгоритму адаптивного кодування Гаффмана найбільші складнощі виникають при розробці процедури поновлення моделі чергових символів. Теоретично можна було би просто вставити всередину цієї процедури повну побудову дерева кодування Гаффмана, однак, такий алгоритм стиснення мав би неприйнятно низьку швидкодію, оскільки побудова Н-дерева — це занадто велика робота і виконувати її при обробці кожного символу нерозумно. На щастя, існує спосіб модифікувати вже наявне Н-дерево так, щоб відобразити обробку нового символу.
Оновлення дерева при зчитуванні чергового символу повідомлення складається з двох операцій.
Перша — збільшення ваги вузлів дерева. Спочатку збільшуємо вагу листка, який відповідає прочитаному символу, на одиницю. Потім збільшуємо вагу батька, щоб узгодити її з новими значеннями ваг нащадків. Цей процес продовжується до тих пір, поки ми не дістанемося кореня дерева. Середнє число операцій збільшення ваги дорівнює середній кількістю бітів, необхідних для того, щоб закодувати символ.
Друга операція — перестановка вузлів дерева — потрібна тоді, коли збільшення ваги вузла призводить до порушення властивості впорядкованості, тобто тоді, коли збільшена вага вузла стає більшою, ніж вага наступного за порядком вузла. Якщо і далі продовжувати обробляти збільшення ваги, рухаючись до кореня дерева, то дерево перестане бути деревом Гаффмана.
Щоб зберегти упорядкованість дерева кодування, алгоритм працює в такий спосіб. Нехай нова збільшена вага вузла дорівнює W+1. Тоді починаємо рухатися по списку у бік збільшення ваги, поки не знайдемо останній вузол з вагою W. Переставимо поточний і знайдений вузли між собою в списку, відновлюючи таким чином порядок у дереві (при цьому батьки кожного з вузлів теж зміняться). На цьому операція перестановки закінчується.
Після перестановки операція збільшення ваги вузлів продовжується далі. Наступний вузол, вага якого буде збільшена алгоритмом, — це новий батько вузла, збільшення ваги якого викликало перестановку.
Переповнення
У процесі роботи алгоритму стиснення ваги вузлів у дереві кодування Гаффмана неухильно зростають. Перша проблема виникає тоді, коли вага кореня дерева починає перевищувати місткість комірки, в якій він зберігається. Як правило, це 16-бітове значення і, отже, не може бути більшим, ніж 65535. Друга проблема, яка заслуговує ще більшої уваги, може виникнути значно раніше, коли розмір найдовшого коду Гаффмана перевищує місткість комірки, яка використовується для того, щоб передати його у вихідний потік. Декодеру все одно, якої довжини код він декодує, оскільки він рухається зверху вниз по дереву кодування, вибираючи з вхідного потоку по одному біту. А кодер повинен починати від листа дерева і рухатися вгору до кореня, збираючи біти, які потрібно передати. Зазвичай для цього використовують змінну цілого типу і, коли довжина коду Гаффмана перевершує розмір цілого типу в бітах, настає переповнення.
Можна довести, що максимальну довжину код Гаффмана для повідомлень з одним і тим самим вхідним алфавітом матиме, якщо частоти символів утворюють послідовність Фібоначчі. Повідомлення з частотами символів, рівними числам Фібоначчі до Fib(18), — це відмінний спосіб випробувати роботу програми стиснення за Гаффманом.
Масштабування ваг вузлів дерева Гаффмана
Беручи до уваги сказане вище, алгоритм поновлення дерева Гаффмана повинен бути змінений таким чином: при збільшенні ваги потрібно перевіряти її на досягнення допустимого максимуму. Якщо ми досягли максимуму, то необхідно «масштабувати» вагу, зазвичай поділивши вагу листка на ціле число, наприклад, 2, а потім перерахувавши ваги всіх інших вузлів.
Однак при діленні ваги навпіл виникає проблема, пов'язана з тим, що після виконання цієї операції дерево може змінити свою форму. Пояснюється це тим, що ми ділимо цілі числа і при діленні відкидаємо дробову частину.
Правильно організоване дерево Гаффмана після масштабування може мати форму, яка значно відрізняється від початкової. Це відбувається тому, що масштабування призводить до втрати точності нашої статистики. Але зі збором нової статистики наслідки цих «помилок» практично сходять нанівець. Масштабування ваги — досить дорога операція, оскільки вона призводить до необхідності заново будувати все дерево кодування. Але оскільки необхідність у ній виникає відносно рідко, то з цим можна змиритися.
Виграш від масштабування
Масштабування ваги вузлів дерева через певні інтервали дає несподіваний результат. Незважаючи на те, що при масштабуванні відбувається втрата точності статистики, тести показують, що воно призводить до кращих показників стиснення, ніж якщо б масштабування відкладалося. Це можна пояснити тим, що поточні символи стисненого потоку більше «схожі» на своїх близьких попередників, ніж на тих, які зустрічалися набагато раніше. Масштабування призводить до зменшення впливу «давніх» символів на статистику і до збільшення впливу на неї «недавніх» символів. Це дуже складно виміряти кількісно, але, в принципі, масштабування позитивно впливає на ступінь стиснення інформації. Експерименти з масштабуванням в різних точках процесу стиснення показують, що ступінь стиснення сильно залежить від моменту масштабування ваги, але не існує правила вибору оптимального моменту масштабування для програми, орієнтованої на стиск будь-яких типів інформації.
Застосування
Стиснення даних Гаффмана застосовується під час стиснення фото- і відеозображень (JPEG, стандарти стиснення MPEG), в архіваторах (PKZIP, та інших), в протоколах передачі даних MNP5 і MNP7.
Примітки
- Томас Кормен; Чарльз Лейзерсон, Рональд Рівест, Кліфорд Стайн (2009) [1990]. 16.3: Коди Гафмена. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- Huffman, D. (1952). (PDF). . 40 (9): 1098—1101. doi:10.1109/JRPROC.1952.273898. Архів оригіналу (PDF) за 15 Грудня 2010. Процитовано 30 Вересня 2017.
Посилання
- Код Гаффмана (WebArchive)
- Стиск по алгоритму Гаффмана [ 5 Квітня 2013 у Wayback Machine.] на algolist.manual.ru
Ця стаття потребує додаткових для поліпшення її . (грудень 2015) |
Це незавершена стаття про алгоритми. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm Gaffmana abo kodi Gafmena adaptivnij zhadibnij algoritm optimalnogo prefiksnogo koduvannya alfavitu z minimalnoyu nadmirnistyu Buv rozroblenij aspirantom Massachusetskogo tehnologichnogo institutu Devidom Gaffmanom pri napisanni nim kursovoyi roboti ta nadrukovanij v statti 1952 roku A Method for the Construction of Minimum Redundancy Codes Nini koli vikoristovuyetsya v bagatoh programah stisnennya danih bez vtrat Na vidminu vid algoritmu Shennona Fano algoritm Gaffmana zalishayetsya zavzhdi optimalnim i dlya m2 z bilsh nizh dvoma simvolami Cej metod koduvannya skladayetsya z dvoh osnovnih etapiv Pobudova optimalnogo kodovogo dereva Pobudova vidobrazhennya kod simvol na osnovi pobudovanogo derevaKoduvannya GaffmanaOdin z pershih algoritmiv efektivnogo koduvannya informaciyi buv zaproponovanij 1952 roku Devidom Gaffmanom Ideya algoritmu taka znayuchi jmovirnosti poyavi simvoliv u povidomlenni mozhna opisati proceduru pobudovi kodiv zminnoyi dovzhini sho skladayutsya z ciloyi kilkosti bitiv Simvolam z bilshoyu jmovirnistyu stavlyatsya u vidpovidnist korotshi kodi Kodi Gaffmana volodiyut vlastivistyu prefiksnosti tobto zhodne kodove slovo ne ye prefiksom inshogo sho dozvolyaye odnoznachno yih dekoduvati Klasichnij algoritm Gaffmana na vhodi otrimuye tablicyu chastot z yakimi zustrichayutsya simvoli u povidomlenni Dali na pidstavi ciyeyi tablici buduyetsya derevo koduvannya Gaffmana N derevo Simvoli vhidnogo alfavitu utvoryuyut spisok vilnih vuzliv Kozhen list maye vagu yaka mozhe buti rivnoyu abo jmovirnosti abo kilkosti vhodzhen simvolu u stisnene povidomlennya Vibirayutsya dva vilnih vuzli dereva z najmenshimi vagami Stvoryuyetsya yihnij batkivskij vuzol z vagoyu rivnoyu yih sumarnij vazi Vuzol batko dodayetsya v spisok vilnih vuzliv a dva jogo nashadki vidalyayutsya z cogo spisku Odnij duzi kotra vihodit z vuzla batka stavitsya u vidpovidnist bit 1 inshij bit 0 Kroki pochinayuchi z drugogo povtoryuyutsya doti poki v spisku vilnih vuzliv ne zalishitsya tilki odin vilnij vuzol Vin i bude vvazhatisya korenem dereva Koduvannya Gaffmana Pripustimo u nas ye nastupna tablicya chastot 15 7 6 6 5 A B C D E Cej proces mozhna podati yak pobudovu dereva korin yakogo simvol z sumoyu jmovirnostej ob yednanih simvoliv otrimanij pri ob yednanni simvoliv z ostannogo kroku jogo n0 nashadkiv simvoli z poperednogo kroku i t d Shob viznachiti kod dlya kozhnogo iz simvoliv sho vhodyat u povidomlennya potribno projti shlyah vid listka dereva yakij vidpovidaye potochnomu simvolu do jogo korenya nakopichuyuchi biti pri peremishenni po gilkah dereva persha gilka v shlyahu vidpovidaye molodshomu bitu Otrimana takim chinom poslidovnist bitiv ye kodom cogo simvolu zapisanim u zvorotnomu poryadku Dlya danoyi tablici simvoliv kodi Gaffmana budut viglyadati tak A B C D E 0 100 101 110 111 Oskilki zhoden z otrimanih kodiv ne ye prefiksom inshogo voni mozhut buti odnoznachno dekodovani pri chitanni yih z potoku Krim togo najchastishij simvol povidomlennya A zakodovanij najmenshoyu kilkistyu bit a najridkisnishij simvol E najbilshoyu Pri comu zagalna dovzhina povidomlennya sho skladayetsya z navedenih u tablici simvoliv sklade 87 bit v serednomu 2 2308 bita na simvol Pri vikoristanni rivnomirnogo koduvannya zagalna dovzhina povidomlennya sklala b 117 bit rivno 3 biti na simvol Zauvazhimo sho entropiya dzherela yake nezalezhnim chinom porodzhuye simvoli iz zaznachenimi chastotami skladaye 2 1858 bita na simvol tobto nadmirnist pobudovanogo dlya takogo dzherela kodu Gaffmana sho rozumiyetsya yak vidminnist serednogo chisla bit na simvol vid entropiyi stanovit menshe 0 05 bita na simvol Klasichnij algoritm Gaffmana maye ryad istotnih nedolikiv Po pershe dlya vidnovlennya vmistu stisnutogo povidomlennya dekoder povinen znati tablicyu chastot yakoyu koristuvavsya koder Otzhe dovzhina stisnutogo povidomlennya zbilshuyetsya na dovzhinu tablici chastot yaka povinna nadsilatisya poperedu danih sho mozhe zvesti nanivec vsi zusillya shodo stisnennya povidomlennya Krim togo neobhidnist nayavnosti povnoyi chastotnoyi statistiki pered pochatkom vlasne koduvannya vimagaye dvoh prohodiv po povidomlennyu odnogo dlya pobudovi modeli povidomlennya tablici chastot i N dereva inshogo dlya vlasne koduvannya Po druge nadmirnist koduvannya obertayetsya na nul lishe v tih vipadkah koli jmovirnosti kodovanih simvoliv ye obernenimi stepenyam chisla 2 Po tretye dlya dzherela z entropiyeyu sho ne perevishuye 1 napriklad dlya dvijkovogo dzherela bezposerednye zastosuvannya kodu Gaffmana pozbavlene sensu Adaptivne stisnennyaAdaptivne stisnennya dozvolyaye ne peredavati model povidomlennya razom z nim samim i obmezhitisya odnim prohodom po povidomlennyu yak pri koduvanni tak i pri dekoduvanni U stvorenni algoritmu adaptivnogo koduvannya Gaffmana najbilshi skladnoshi vinikayut pri rozrobci proceduri ponovlennya modeli chergovih simvoliv Teoretichno mozhna bulo bi prosto vstaviti vseredinu ciyeyi proceduri povnu pobudovu dereva koduvannya Gaffmana odnak takij algoritm stisnennya mav bi neprijnyatno nizku shvidkodiyu oskilki pobudova N dereva ce zanadto velika robota i vikonuvati yiyi pri obrobci kozhnogo simvolu nerozumno Na shastya isnuye sposib modifikuvati vzhe nayavne N derevo tak shob vidobraziti obrobku novogo simvolu Onovlennya dereva pri zchituvanni chergovogo simvolu povidomlennya skladayetsya z dvoh operacij Persha zbilshennya vagi vuzliv dereva Spochatku zbilshuyemo vagu listka yakij vidpovidaye prochitanomu simvolu na odinicyu Potim zbilshuyemo vagu batka shob uzgoditi yiyi z novimi znachennyami vag nashadkiv Cej proces prodovzhuyetsya do tih pir poki mi ne distanemosya korenya dereva Serednye chislo operacij zbilshennya vagi dorivnyuye serednij kilkistyu bitiv neobhidnih dlya togo shob zakoduvati simvol Druga operaciya perestanovka vuzliv dereva potribna todi koli zbilshennya vagi vuzla prizvodit do porushennya vlastivosti vporyadkovanosti tobto todi koli zbilshena vaga vuzla staye bilshoyu nizh vaga nastupnogo za poryadkom vuzla Yaksho i dali prodovzhuvati obroblyati zbilshennya vagi ruhayuchis do korenya dereva to derevo perestane buti derevom Gaffmana Shob zberegti uporyadkovanist dereva koduvannya algoritm pracyuye v takij sposib Nehaj nova zbilshena vaga vuzla dorivnyuye W 1 Todi pochinayemo ruhatisya po spisku u bik zbilshennya vagi poki ne znajdemo ostannij vuzol z vagoyu W Perestavimo potochnij i znajdenij vuzli mizh soboyu v spisku vidnovlyuyuchi takim chinom poryadok u derevi pri comu batki kozhnogo z vuzliv tezh zminyatsya Na comu operaciya perestanovki zakinchuyetsya Pislya perestanovki operaciya zbilshennya vagi vuzliv prodovzhuyetsya dali Nastupnij vuzol vaga yakogo bude zbilshena algoritmom ce novij batko vuzla zbilshennya vagi yakogo viklikalo perestanovku PerepovnennyaU procesi roboti algoritmu stisnennya vagi vuzliv u derevi koduvannya Gaffmana neuhilno zrostayut Persha problema vinikaye todi koli vaga korenya dereva pochinaye perevishuvati mistkist komirki v yakij vin zberigayetsya Yak pravilo ce 16 bitove znachennya i otzhe ne mozhe buti bilshim nizh 65535 Druga problema yaka zaslugovuye she bilshoyi uvagi mozhe viniknuti znachno ranishe koli rozmir najdovshogo kodu Gaffmana perevishuye mistkist komirki yaka vikoristovuyetsya dlya togo shob peredati jogo u vihidnij potik Dekoderu vse odno yakoyi dovzhini kod vin dekoduye oskilki vin ruhayetsya zverhu vniz po derevu koduvannya vibirayuchi z vhidnogo potoku po odnomu bitu A koder povinen pochinati vid lista dereva i ruhatisya vgoru do korenya zbirayuchi biti yaki potribno peredati Zazvichaj dlya cogo vikoristovuyut zminnu cilogo tipu i koli dovzhina kodu Gaffmana perevershuye rozmir cilogo tipu v bitah nastaye perepovnennya Mozhna dovesti sho maksimalnu dovzhinu kod Gaffmana dlya povidomlen z odnim i tim samim vhidnim alfavitom matime yaksho chastoti simvoliv utvoryuyut poslidovnist Fibonachchi Povidomlennya z chastotami simvoliv rivnimi chislam Fibonachchi do Fib 18 ce vidminnij sposib viprobuvati robotu programi stisnennya za Gaffmanom Masshtabuvannya vag vuzliv dereva GaffmanaBeruchi do uvagi skazane vishe algoritm ponovlennya dereva Gaffmana povinen buti zminenij takim chinom pri zbilshenni vagi potribno pereviryati yiyi na dosyagnennya dopustimogo maksimumu Yaksho mi dosyagli maksimumu to neobhidno masshtabuvati vagu zazvichaj podilivshi vagu listka na cile chislo napriklad 2 a potim pererahuvavshi vagi vsih inshih vuzliv Odnak pri dilenni vagi navpil vinikaye problema pov yazana z tim sho pislya vikonannya ciyeyi operaciyi derevo mozhe zminiti svoyu formu Poyasnyuyetsya ce tim sho mi dilimo cili chisla i pri dilenni vidkidayemo drobovu chastinu Pravilno organizovane derevo Gaffmana pislya masshtabuvannya mozhe mati formu yaka znachno vidriznyayetsya vid pochatkovoyi Ce vidbuvayetsya tomu sho masshtabuvannya prizvodit do vtrati tochnosti nashoyi statistiki Ale zi zborom novoyi statistiki naslidki cih pomilok praktichno shodyat nanivec Masshtabuvannya vagi dosit doroga operaciya oskilki vona prizvodit do neobhidnosti zanovo buduvati vse derevo koduvannya Ale oskilki neobhidnist u nij vinikaye vidnosno ridko to z cim mozhna zmiritisya Vigrash vid masshtabuvannya Masshtabuvannya vagi vuzliv dereva cherez pevni intervali daye nespodivanij rezultat Nezvazhayuchi na te sho pri masshtabuvanni vidbuvayetsya vtrata tochnosti statistiki testi pokazuyut sho vono prizvodit do krashih pokaznikiv stisnennya nizh yaksho b masshtabuvannya vidkladalosya Ce mozhna poyasniti tim sho potochni simvoli stisnenogo potoku bilshe shozhi na svoyih blizkih poperednikiv nizh na tih yaki zustrichalisya nabagato ranishe Masshtabuvannya prizvodit do zmenshennya vplivu davnih simvoliv na statistiku i do zbilshennya vplivu na neyi nedavnih simvoliv Ce duzhe skladno vimiryati kilkisno ale v principi masshtabuvannya pozitivno vplivaye na stupin stisnennya informaciyi Eksperimenti z masshtabuvannyam v riznih tochkah procesu stisnennya pokazuyut sho stupin stisnennya silno zalezhit vid momentu masshtabuvannya vagi ale ne isnuye pravila viboru optimalnogo momentu masshtabuvannya dlya programi oriyentovanoyi na stisk bud yakih tipiv informaciyi ZastosuvannyaStisnennya danih Gaffmana zastosovuyetsya pid chas stisnennya foto i videozobrazhen JPEG standarti stisnennya MPEG v arhivatorah PKZIP ta inshih v protokolah peredachi danih MNP5 i MNP7 PrimitkiTomas Kormen Charlz Lejzerson Ronald Rivest Kliford Stajn 2009 1990 16 3 Kodi Gafmena Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 Huffman D 1952 PDF 40 9 1098 1101 doi 10 1109 JRPROC 1952 273898 Arhiv originalu PDF za 15 Grudnya 2010 Procitovano 30 Veresnya 2017 PosilannyaKod Gaffmana WebArchive Stisk po algoritmu Gaffmana 5 Kvitnya 2013 u Wayback Machine na algolist manual ru Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno gruden 2015 Ce nezavershena stattya pro algoritmi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi