~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ E7F3F9F89B4EE1CB41ABDF8AB074CE14__1701964260 ✰
Заголовок документа оригинал.:
✰ Adaptive Huffman coding - Wikipedia ✰
Заголовок документа перевод.:
✰ Адаптивное кодирование Хаффмана — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Adaptive_Huffman_coding ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/e7/14/e7f3f9f89b4ee1cb41abdf8ab074ce14.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/e7/14/e7f3f9f89b4ee1cb41abdf8ab074ce14__translat.html ✰
Дата и время сохранения документа:
✰ 18.06.2024 17:54:56 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 7 December 2023, at 18:51 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Адаптивное кодирование Хаффмана — Википедия Jump to content

Адаптивное кодирование Хаффмана

Из Википедии, бесплатной энциклопедии

Адаптивное кодирование Хаффмана (также называемое динамическим кодированием Хаффмана ) — это метод адаптивного кодирования, основанный на кодировании Хаффмана . Это позволяет строить код по мере передачи символов, не имея начальных знаний о распространении источников, что позволяет осуществлять однопроходное кодирование и адаптацию к изменяющимся условиям в данных. [1]

Преимущество однопроходной процедуры в том, что исходный код может быть закодирован в реальном времени, однако он становится более чувствительным к ошибкам передачи, поскольку всего лишь одна потеря разрушает весь код, требуя обнаружения и исправления ошибок .

Алгоритмы [ править ]

Существует ряд реализаций этого метода, наиболее заметными из которых являются алгоритм FGK ( Фаллер - Галлагер - Кнут ) и Виттера алгоритм .

Алгоритм ФГК [ править ]

Это метод онлайн-кодирования, основанный на кодировании Хаффмана. Не имея начальных знаний о частотах появления, он позволяет динамически корректировать дерево Хаффмана по мере передачи данных. В дереве FGK Хаффмана специальный внешний узел, называемый 0-узлом , используется для идентификации нового персонажа. То есть всякий раз, когда встречаются новые данные, выведите путь к 0-узлу, за которым следуют данные. Для персонажа прошлого просто выведите путь к данным в текущем дереве Хаффмана. Самое главное, нам нужно при необходимости скорректировать дерево ФГК Хаффмана и, наконец, обновить частоту связанных узлов. По мере увеличения частоты данных родственные свойства дерева Хаффмана могут нарушаться. По этой причине срабатывает регулировка. Это достигается путем последовательной замены узлов, поддеревьев или того и другого. Узел данных заменяется узлом самого высокого порядка той же частоты в дереве Хаффмана (или поддеревом, корнем которого является узел самого высокого порядка). Все родительские узлы узла также должны обрабатываться таким же образом.

Поскольку алгоритм FGK имеет некоторые недостатки в отношении замены узлов или поддеревьев, Виттер предложил другой алгоритм для его улучшения.

Алгоритм Виттера [ править ]

Некоторые важные термины и ограничения: -

  • Неявная нумерация : это просто означает, что узлы нумеруются в порядке возрастания уровня и слева направо. т.е. узлы нижнего уровня будут иметь меньшее неявное число по сравнению с узлами верхнего уровня, а узлы на том же уровне нумеруются в порядке возрастания слева направо. Другими словами, когда мы построили дерево Хаффмана, при объединении двух узлов в родительский узел мы установили узел с меньшим значением в качестве левого дочернего элемента, а узел с более высоким значением — в качестве правого дочернего элемента.
  • Инвариант : для каждого веса w все листья веса w предшествуют всем внутренним узлам, имеющим вес w. Другими словами, когда мы строили дерево Хаффмана, если несколько узлов имели одинаковое значение, мы отдавали приоритет слиянию листьев над внутренними узлами.
  • Блоки : узлы одинакового веса и типа (т. е. листовой узел или внутренний узел) образуют блок.
  • Лидер : узел с наибольшим номером в блоке.

Блоки связаны между собой по возрастанию их весов.

Листовой блок всегда предшествует внутреннему блоку того же веса, таким образом сохраняя инвариант.

NYT (Not Yet Transferred) — это специальный узел, используемый для представления символов, которые «еще не переданы» .

Начинается скольжение Slide_And_Increment(листовой узел). P — листовой узел.
Slide_And_Increment(листовой узел) шаг скольжения 2. Поскольку P является листовым узлом, он скользит перед узлами следующего блока равного веса.
Slide_And_Increment(листовой узел) шаг скольжения 3. Здесь мы увеличиваем текущий вес на 1.
Slide_And_Increment(листовой узел) шаг скольжения 4. Метод подходит к концу. P — новый родитель.
Начинается скольжение Slide_And_Increment(внутренний узел). P — внутренний узел.
Slide_And_Increment (внутренний узел) шаг скольжения 2. Узел P перемещается перед следующим блоком узлов листьев с весом wt+1.
Slide_And_Increment(внутренний узел) шаг скольжения 3. Теперь мы увеличиваем вес до 9. Таким образом, инвариант сохраняется , поскольку текущий узел является внутренним узлом и должен располагаться перед листовыми узлами равного веса, поскольку мы увеличили вес.
Slide_And_Increment (внутренний узел), шаг скольжения 4. Теперь «P» указывает на бывшего родителя (как в случае внутреннего узла в соответствии с алгоритмом)
алгоритм  добавления  символа 
      Leaf_to_increment := NULL 
      p := указатель на листовой узел, содержащий следующий символ 

      если  (p — Нью-Йорк Таймс),  то 
          Расширьте p, добавив двух дочерних элементов. 
          Левый дочерний элемент становится новым NYT, а правый дочерний элемент – новым узлом листа символа. 
          p  := родительский элемент нового листового узла символа 
          Leaf_to_increment := Правый дочерний элемент p 
      еще 
          Поменяйте местами p с лидером своего блока. 
          если  (новый p является родственным NYT),  то 
              Leaf_to_increment := p 
              p  := родительский элемент p 

      пока  (p ≠ NULL)  делайте 
          Слайд_И_Инкремент(п) 

      если  (leaf_to_increment != NULL)  , то 
          Slide_And_Increment(leaf_to_increment) 
 
функция  Slide_And_Increment(p  ) 
      previous_p := родительский элемент  p 

     if  (p — внутренний узел)  , то 
          Сдвиньте p в дереве выше, чем листовые узлы веса wt + 1. 
          увеличить вес  p  на 1 
          р  := предыдущий_р 
      еще 
          Сдвиньте p в дереве выше внутренних узлов веса wt. 
          увеличить вес  p  на 1 
          p  := новый родительский элемент  p  . 
 

Кодер и декодер начинаются только с корневого узла, имеющего максимальное число. Вначале это наш первоначальный узел NYT.

Когда мы передаем символ NYT, мы должны передать код для узла NYT, а затем для его общего кода.

Для каждого символа, который уже есть в дереве, нам нужно передать только код его листового узла.

Пример [ править ]

Кодировка «abb» дает 01100001 001100010 11.

Шаг 1:

Начните с пустого дерева.

Для «а» передайте его двоичный код.

Шаг 2:

NYT порождает два дочерних узла: 254 и 255, оба с весом 0. Увеличьте вес для корня и 255. Код для «a», связанного с узлом 255, равен 1.

Для «b» передайте 0 (для узла NYT), а затем его двоичный код.

Шаг 3:

NYT порождает два дочерних узла: 252 для NYT и 253 для листового узла, оба с весом 0. Увеличьте веса для 253, 254 и корневого узла. Чтобы сохранить инвариант Виттера, согласно которому все листья веса w предшествуют (в неявной нумерации) всем внутренним узлам веса w, ветвь, начинающаяся с узла 254, должна поменяться местами (с точки зрения символов и весов, но не порядка чисел) с узлом 255. Код для «b» — 11.

Для второго «б» передайте 11.

Для удобства объяснения этот шаг не совсем соответствует алгоритму Виттера. [2] но эффекты эквивалентны.

Шаг 4:

Перейдите к листовому узлу 253. Обратите внимание, что у нас есть два блока с весом 1. Узел 253 и 254 — это один блок (состоящий из листьев), узел 255 — это другой блок (состоящий из внутренних узлов). Для узла 253 самое большое число в его блоке равно 254, поэтому поменяйте местами веса и символы узлов 253 и 254. Теперь узел 254 и ветвь, начинающаяся с узла 255, удовлетворяют условию SlideAndIncrement. [2] и, следовательно, должны быть заменены. Наконец увеличьте вес узлов 255 и 256.

Будущий код для «b» — 1, а для «a» теперь — 01, что отражает их частоту.

Ссылки [ править ]

  1. ^ Цзэнянь Ли; Марк С. Дрю; Цзянчуань Лю (9 апреля 2014 г.). Основы мультимедиа . Springer Science & Business Media. ISBN  978-3-319-05290-8 .
  2. ^ Перейти обратно: а б «Адаптивное кодирование Хаффмана» . Cs.duke.edu . Проверено 26 февраля 2012 г.
  • Оригинальная статья Виттера: Дж. С. Виттер, « Разработка и анализ динамических кодов Хаффмана », Журнал ACM, 34 (4), октябрь 1987 г., стр. 825–845.
  • Дж. С. Виттер, «АЛГОРИТМ 673 Динамическое кодирование Хаффмана», Транзакции ACM в математическом программном обеспечении, 15 (2), июнь 1989 г., стр. 158–167. Также появляется в Сборнике алгоритмов ACM.
  • Дональд Э. Кнут, «Динамическое кодирование Хаффмана», Journal of Algorithm, 6 (2), 1985, стр. 163–180.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: E7F3F9F89B4EE1CB41ABDF8AB074CE14__1701964260
URL1:https://en.wikipedia.org/wiki/Adaptive_Huffman_coding
Заголовок, (Title) документа по адресу, URL1:
Adaptive Huffman coding - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)