Арифметическое кодирование: различия между версиями

Материал из in.wiki
Перейти к навигации Перейти к поиску
м (106 версий импортировано: Импорт из Википедии)
 
(не показаны 64 промежуточные версии 45 участников)
Строка 1: Строка 1:
{{cleanup-rewrite}}
+
'''Арифметическое кодирование''' — один из алгоритмов [[энтропийное сжатие|энтропийного сжатия]].
  
Один из алгоритмов [[энтропийное сжатие|энтропийного сжатия]].
+
В отличие от [[алгоритм Хаффмана|алгоритма Хаффмана]], не имеет жёсткого постоянного соответствия входных символов группам битов выходного потока. Это даёт алгоритму большую гибкость в представлении дробных частот встречаемости символов.
  
В отличие от [[алгоритм Хаффмана|алгоритма Хаффмана]], не имеет жесткого постоянного соответствия входных символов - группам бит выходного потока. Это дает алгоритму большую гибкость в представлении дробных частот встречаемости символов.
+
Как правило, превосходит [[алгоритм Хаффмана]] по эффективности сжатия, позволяет сжимать данные с [[Информационная энтропия|энтропией]], меньшей 1 бита на кодируемый символ, но некоторые версии имеют патентные ограничения от компании [[IBM]]<ref>[http://www.compression.ru/arctest/descript/comp-hist.htm История развития теории сжатия информации] {{Wayback|url=http://www.compression.ru/arctest/descript/comp-hist.htm |date=20101228213932 }} / Compression.ru, Sarmin Alexey, 10 марта 2011</ref>.
 
 
Немного превосходит алгоритм Хаффмена качеством сжатия, но некоторые версии имеют патентные ограничения от компании [[IBM]].
 
  
 
== Характеристики ==
 
== Характеристики ==
Обеспечивает почти оптимальную степень сжатия с точки зрения энтропийной оценки кодирования Шеннона. На каждый символ требуется почти <math>H</math> бит, где <math>H</math> [[информационная энтропия]] источника.
+
Обеспечивает почти оптимальную степень сжатия с точки зрения энтропийной оценки кодирования Шеннона. На каждый символ требуется почти <math>H</math> бит, где <math>H</math> — [[информационная энтропия]] источника.
  
В отличие от [[алгоритм Хаффмана|алгоритма Хаффмана]], метод арифметического кодирования показывает высокую эффективность для дробных неравномерных интервалов распределения вероятностей кодируемых символов. Однако в случае равновероятного распределения символов, например для строки бит ''010101...0101'' длины ''s''  метод арифметического кодирования приближается к префиксному коду Хаффмана и даже может занимать на один бит больше.[http://www.ddj.com/architect/184404644]
+
В отличие от [[алгоритм Хаффмана|алгоритма Хаффмана]], метод арифметического кодирования показывает высокую эффективность для дробных неравномерных интервалов распределения вероятностей кодируемых символов. Однако в случае равновероятного распределения символов, например, для строки бит ''010101…0101'' длины <math>s</math> метод арифметического кодирования приближается к префиксному коду Хаффмана и даже может занимать на один бит больше<ref>[http://www.drdobbs.com/dr-dobbs-data-compression-newsletter/184404644 Dr. Dobb’s Data Compression Newsletter] {{Wayback|url=http://www.drdobbs.com/dr-dobbs-data-compression-newsletter/184404644 |date=20171211054147 }}, August 13, 2001</ref>.
  
 
== Принцип действия ==
 
== Принцип действия ==
Пусть у нас есть некий алфавит, а также данные о частотности использования символов (опционально). Тогда рассмотрим на координатной прямой отрезок от 0 до 1.  
+
Для описания алгоритма на некотором алфавите с данными о частотности использования символов используется отрезок <math>[0;1]</math>, называемый «рабочим», на котором располагаются точки таким образом, что длины образованных отрезков будут равны частоте использования символа, и каждый такой отрезок соответствует одному символу.
  
Назовём этот отрезок рабочим. Расположим на нём точки таким образом, что длины образованных отрезков будут равны частоте использования символа и каждый такой отрезок будет соответствовать одному символу.
+
Для символа из потока выбирается соответствующий ему отрезок, после чего он становится рабочим отрезком. Далее отрезок разбивается его таким же образом, как был разбит <math>[0;1]</math>; операция выполняется для некоторого числа последовательных символов. Затем выбирается произвольное число из рабочего отрезка. Биты этого числа вместе с длиной его битовой записи и считаются результатом арифметического кодирования использованных символов потока.
  
Теперь возьмём символ из потока и найдём для него отрезок, среди только что сформированных, теперь отрезок для этого символа стал рабочим. Разобьём его таким же образом, как разбили отрезок от 0 до 1. Выполним эту операцию для некоторого числа последовательных символов. Затем выберем любое число из рабочего отрезка. Биты этого числа вместе с длиной его битовой записи и есть результат арифметического кодирования использованных символов потока.
+
== Пример ==
  
== Пример работы метода арифметического кодирования ==
 
 
=== Вероятностная модель ===
 
=== Вероятностная модель ===
 +
Используя метод арифметического кодирования, можно достичь почти оптимального представления для заданного набора символов и их вероятностей (согласно [[source coding theorem|теории энтропийного кодирования источника Шеннона]], оптимальное представление будет стремиться к числу <math>-\log_2 P</math> бит на каждый символ, вероятность которого <math>P</math>). Алгоритмы сжатия данных, использующие в своей работе метод арифметического кодирования, перед непосредственным кодированием формируют [[модель]] входных данных на основании количественных или статистических характеристик, а также найденных в кодируемой последовательности повторений или паттернов — любой дополнительной информации, позволяющей уточнить вероятность появления символа <math>P</math> в процессе кодирования. Очевидно, что чем точнее определена или предсказана вероятность символа, тем выше эффективность сжатия.
  
Используя метод арифметического кодирования можно достичь почти оптимального представления для заданного набора символов и их вероятностей (согласно [[source coding theorem|теории энтропийного кодирования источника Шеннона]] оптимальное представление будет стремится к числу −log''<sub>2</sub>P''  бит на каждый символ, вероятность которого ''P''). Алгоритмы сжатия данных использующие в своей работе метод арифметического кодирования перед непосредственным кодированием формируют [[модель]] входных данных на основании количественных  или статистических характеристик, а также, найденных в кодируемой последовательности повторений или паттернов - любой дополнительной информации позволяющей уточнить вероятность появления символа ''P'' в процессе кодирования. Очевидно, что чем точнее определена или предсказана вероятность символа, тем выше эффективность сжатия.
+
В простейшем случае [[статической]] модели для кодирования информации, поступающей с системы обработки сигнала типы сигналов и соответствующие им вероятности распределены следующим образом:
  
Рассмотрим простейший случай [[статической]] модели для кодирования информации поступающей с системы обработки сигнала. Типы сигналов и соответствующие им вероятности распределены следующим образом:
+
* 60%-я вероятность нейтрального значения сигнала, или NEUTRAL.
 +
* 20%-я вероятность положительного значения сигнала, или POSITIVE.
 +
* 10%-я вероятность отрицательного значения сигнала, или NEGATIVE.
 +
* 10%-я вероятность признака конца кодируемой последовательности, или END-OF-DATA.
  
*60% вероятность нейтрального значения сигнала или NEUTRAL
+
Появление последнего символа для декодера означает, что вся последовательность была успешно декодирована ''(в качестве альтернативного подхода, но необязательно более успешно, можно использовать блочный алгоритм фиксированной длины)''.
*20% вероятность положительного значения сигнала или POSITIVE
 
*10% вероятность отрицательного значения сигнала или NEGATIVE
 
*10% вероятность признака конца кодируемой последовательности или END-OF-DATA.
 
  
Появление последнего символа для декодера означает, что вся последовательность была успешно декодирована. ''(В качестве альтернативного подхода, но необязательно более успешно, можно использовать блочный алгоритм фиксированной длины.)''
+
В качестве алфавита вероятностной модели метода можно рассматривать любой набор символов, исходя из особенностей решаемой задачи. Более [[эвристика|эвристические]] подходы, использующие основную схему метода арифметического кодирования, применяют '' [[контекстное моделирование|динамические или адаптивные модели]]''. Идея данных методов заключается в уточнении вероятности кодируемого символа за счёт учёта вероятности предшествующего или будущего контекста (то есть, вероятность появления кодируемого символа после определённого k-го числа символов слева или справа, где k — это порядок контекста).
  
Следует также отметить, что в качестве алфавита вероятностной модели метода можно рассматривать любой  набор символов, исходя из особенностей решаемой задачи. Более [[эвристика|эвристические]] подходы, использующие основную схему метода арифметического кодирования, применяют '' [[контекстное моделирование|динамические или адаптивные модели]]''. Идея данных методов заключается в уточнении вероятности кодируемого символа, за счет учёта вероятности предшествующего или будущего контекста (т.е. вероятность появления кодируемого символа после определённого k-го числа символов слева или справа, где k - это порядок контекста).
+
=== Кодирование сообщения ===
 +
Для кодирования последовательности «NEUTRAL POSITVE NEGATIVE END-OF-DATA» сначала разбивается отрезок от 0 до 1 согласно частотам сигналов: NEUTRAL — от 0 до 0,6; POSITVE — от 0,6 до 0,8; NEGATIVE — от 0,8 до 0,9; END-OF-DATA — от 0,9 до 1. Далее, осуществляется кодирование, начиная с первого символа: NEUTRAL соответствует отрезок от 0 до 0,6. Отрезок от 0 до 0,6 разбивается, и кодируется второй символ — NEGATIVE, на отрезке от 0 до 0,6 ему соответствует отрезок от 0,48 до 0,54. На полученном рабочем отрезке кодируется END-OF-DATA, этому символу соответствует отрезок от 0,534 до 0,54.
 +
 
 +
Так как это был последний символ, то кодирование завершено. Закодированное сообщение — отрезок от 0,534 до 0,54 или любое число из него, например, 0,538.
  
=== Кодирование сообщения. ===
 
 
=== Декодирование сообщения ===
 
=== Декодирование сообщения ===
[[Файл:Arithmetic encoding.svg|400px|thumb|right|На диаграмме представлено декодирование итогового интервального значения 0.538 согласно модели в приведённом примере. Область интервала разбивается на подинтервальные области согласно вероятностным характеристикам появления соответствующих символов. Затем, очередной выбранный интервал разбивается аналогичным способом.]]
+
[[Файл:Arithmetic encoding.svg|400px|thumb|right|На диаграмме представлено декодирование итогового интервального значения 0,538 согласно модели в приведённом примере. Область интервала разбивается на подынтервальные области согласно вероятностным характеристикам появления соответствующих символов. Затем, очередной выбранный интервал разбивается аналогичным способом.]]
 +
Если необходимо раскодировать сообщение методом арифметического кодирования, закодированное значением 0,538, то в начальном состоянии процесса рассматривается интервал от 0 до 1; на основании известной вероятностной модели дробное значение 0,538 попадает в интервал от 0 до 0,6, что позволяет определить первый символ, который был выбран кодировщиком, поэтому его значение выводится как первый символ декодированного сообщения.
  
Предположим, что нам необходимо раскодировать сообщение методом арифметического кодирования  согласно описанной выше модели. <!-- модель нужно взять из английского текста --> Сообщение в закодированном виде представлено дробным значением 0.538 (для простоты используется десятичное представление дроби, вместо двоичного основания). Предполагается, что закодированное сообщение содержит ровно столько знаков в рассматриваемом числе, сколько необходимо для однозначного восстановления первоначальных данных.
+
== Адаптивное арифметическое кодирование ==
 +
Как и [[алгоритм Хаффмана]], арифметическое кодирование может быть адаптивным ([[адаптивный алгоритм Хаффмана]]). Такой алгоритм позволяет строить разбиение каждого интервала на подынтервалы в поточном режиме (без предварительного сканирования данных), не имея никаких начальных знаний из исходного распределения, что позволяет за один проход сжать данные. Преимуществом этого способа является возможность кодировать на лету (аналогично адаптивному алгоритму Хаффмана).
  
Начальное состояние процесса декодирования совпадает с процессом кодирования и рассматривается интервал <nowiki>[0,1)</nowiki>. На основании известной вероятностной модели дробное значение 0.538 попадает в интервал <nowiki>[0, 0.6)</nowiki>. Это позволяет определить первый символ, который был выбран кодировщиком, поэтому его значение выводится как первый символ декодированного сообщения.
+
Известно<ref name="salomon">{{книга | автор = Д. Сэломон | заглавие = Сжатие данных, изображений и звука | место = М. | издательство = Техносфера | год = 2004}}</ref>, что совсем необязательно, чтобы подынтервалы более частых символов располагались ближе к началу рабочего интервала, порядок может быть абсолютно любым. Поэтому для адаптивного арифметического кодирования можно расставить подынтервалы, соответствующие каждому символу, в порядке появления этих символов в тексте, зарезервировав последний подынтервал для случая, когда очередной символ встречается во входном потоке первый раз. В этом случае передаётся сначала этот последний подынтервал, а затем сам символ, что позволяет декодеру «опознать» его. Когда известных с начала входного потока символов несколько, их кумулятивные частоты можно хранить в обычном [[Массив (тип данных)|массиве]], если же их число достигает сотни и больше, удобно применять такую структуру данных, как [[Двоичное дерево|бинарное сбалансированное дерево]]<ref name="salomon"/>, в котором каждая ветвь хранит два значения: непосредственную частоту символа и сумму частот всех символов, входящих в эту ветвь.<ref group="Комм.">А также ссылку на родительскую ветвь в качестве «служебного» поля: когда частота изменяется, дерево должно автоматически изменить соответствующие суммы частот для родительской ветви, для родительской от родительской ветви и так далее до корня.</ref> При появлении очередного символа его частота в дереве увеличивается на 1, но лишь после изменения рабочего интервала, иначе декодирование станет невозможным.
  
<!-- закомментировано под перевод
+
== Комментарии ==
 +
{{Примечания|group="Комм."}}
  
We start, as the encoder did, with the interval <nowiki>[0,1)</nowiki>, and using the same model, we divide it into the same four sub-intervals that the encoder must have.  Our fraction 0.538 falls into the sub-interval for NEUTRAL, <nowiki>[0, 0.6)</nowiki>; this indicates to us that the first symbol the encoder read must have been NEUTRAL, so we can write that down as the first symbol of our message.
+
== Примечания ==
 
+
{{примечания}}
We then divide the interval <nowiki>[0, 0.6)</nowiki> into sub-intervals:
 
* the interval for NEUTRAL would be <nowiki>[0, 0.36)</nowiki> ''-- 60% of <nowiki>[0, 0.6)</nowiki>''
 
* the interval for POSITIVE would be <nowiki>[0.36, 0.48)</nowiki> ''-- 20% of <nowiki>[0, 0.6)</nowiki>''
 
* the interval for NEGATIVE would be <nowiki>[0.48, 0.54)</nowiki> ''-- 10% of <nowiki>[0, 0.6)</nowiki>''
 
* the interval for END-OF-DATA would be <nowiki>[0.54, 0.6)</nowiki>. ''-- 10% of <nowiki>[0, 0.6)</nowiki>''
 
 
 
Our fraction of .538 is within the interval <nowiki>[0.48, 0.54)</nowiki>; therefore the second symbol of the message must have been NEGATIVE.
 
 
Once more we divide our current interval into sub-intervals:
 
* the interval for NEUTRAL would be <nowiki>[0.48, 0.516)</nowiki>
 
* the interval for POSITIVE would be <nowiki>[0.516, 0.528)</nowiki>
 
* the interval for NEGATIVE would be <nowiki>[0.528, 0.534)</nowiki>
 
* the interval for END-OF-DATA would be <nowiki>[0.534, 0.540)</nowiki>.
 
 
 
Our fraction of .538 falls within the interval of the END-OF-DATA symbol; therefore, this must be our next symbol.  Since it is also the internal termination symbol, it means our decoding is complete.  (If the stream was not internally terminated, we would need to know where the stream stops from some other source -- otherwise, we would continue the decoding process forever, mistakenly reading more symbols from the fraction than were in fact encoded into it.)
 
 
 
The same message could have been encoded by the equally short fractions .534, .535, .536, .537 or .539. This suggests that our use of decimal instead of binary introduced some inefficiency.  This is correct; the information content of a three-digit decimal is approximately 9.966 [[bit]]s; we could have encoded the same message in the binary fraction .10001010 (equivalent to .5390625 decimal) at a cost of only 8 bits.  (Note that the final zero must be specified in the binary fraction, or else the message would be ambiguous without external information such as compressed stream size.)
 
 
 
This 8 bit output is larger than the information content, or [[information entropy|entropy]] of our message, which is 1.57 * 3 or 4.71 bits.    The large difference between the example's 8 (or 7 with external compressed data size information) bits of output and the entropy of 4.71 bits is caused by the short example message not being able to exercise the coder effectively.  We claimed symbol probabilities of <nowiki>[.6, .2, .1, .1]</nowiki>, but the actual frequencies in this example are <nowiki>[.33, 0, .33 .33]</nowiki>.  If the intervals are readjusted for these frequencies, the entropy of the message would be 1.58 bits and you could encode the same NEUTRAL NEGATIVE ENDOFDATA message as intervals <nowiki>[0, 1/3); [1/9, 2/9); [5/27, 6/27);</nowiki> and a binary interval of <nowiki>[1011110, 1110001)</nowiki>.  This could yield an output message of 111, or just 3 bits.  This is also an example of how statistical coding methods like arithmetic encoding can yield a size gain, especially if the probability model is off.
 
 
 
-->
 
  
 
== Ссылки ==
 
== Ссылки ==
* [http://www.ddj.com/architect/184404644 (August 13, 2001) Dr. Dobb's Data Compression Newsletter]
+
* [http://www.ddj.com/architect/184404644 (August 13, 2001) Dr. Dobb’s Data Compression Newsletter]
 +
* [https://github.com/VVVaSoft/WindowsFormsACC Реализация арифметического кодирования на C#]  
  
 
{{методы сжатия}}
 
{{методы сжатия}}
 +
{{перевести|en|Arithmetic Coding}}
  
 
[[Категория:Теория кодирования]]
 
[[Категория:Теория кодирования]]
 
[[Категория:Сжатие данных]]
 
[[Категория:Сжатие данных]]
 
[[Категория:Алгоритмы сжатия без потерь]]
 
[[Категория:Алгоритмы сжатия без потерь]]
 
[[cs:Aritmetické kódování]]
 
[[de:Arithmetisches Kodieren]]
 
[[en:Arithmetic coding]]
 
[[fr:Codage arithmétique]]
 
[[it:Codifica aritmetica]]
 
[[ja:算術符号]]
 
[[ko:산술 부호화]]
 
[[nl:Aritmetische codering]]
 
[[pl:Kodowanie arytmetyczne]]
 
[[pt:Codificação aritmética]]
 
[[zh:算术编码]]
 

Текущая версия от 00:48, 20 августа 2025

Арифметическое кодирование — один из алгоритмов энтропийного сжатия.

В отличие от алгоритма Хаффмана, не имеет жёсткого постоянного соответствия входных символов группам битов выходного потока. Это даёт алгоритму большую гибкость в представлении дробных частот встречаемости символов.

Как правило, превосходит алгоритм Хаффмана по эффективности сжатия, позволяет сжимать данные с энтропией, меньшей 1 бита на кодируемый символ, но некоторые версии имеют патентные ограничения от компании IBM[1].

Характеристики[править | править код]

Обеспечивает почти оптимальную степень сжатия с точки зрения энтропийной оценки кодирования Шеннона. На каждый символ требуется почти H H бит, где H H  — информационная энтропия источника.

В отличие от алгоритма Хаффмана, метод арифметического кодирования показывает высокую эффективность для дробных неравномерных интервалов распределения вероятностей кодируемых символов. Однако в случае равновероятного распределения символов, например, для строки бит 010101…0101 длины s s метод арифметического кодирования приближается к префиксному коду Хаффмана и даже может занимать на один бит больше[2].

Принцип действия[править | править код]

Для описания алгоритма на некотором алфавите с данными о частотности использования символов используется отрезок [ 0 ; 1 ] [0;1] , называемый «рабочим», на котором располагаются точки таким образом, что длины образованных отрезков будут равны частоте использования символа, и каждый такой отрезок соответствует одному символу.

Для символа из потока выбирается соответствующий ему отрезок, после чего он становится рабочим отрезком. Далее отрезок разбивается его таким же образом, как был разбит [ 0 ; 1 ] [0;1] ; операция выполняется для некоторого числа последовательных символов. Затем выбирается произвольное число из рабочего отрезка. Биты этого числа вместе с длиной его битовой записи и считаются результатом арифметического кодирования использованных символов потока.

Пример[править | править код]

Вероятностная модель[править | править код]

Используя метод арифметического кодирования, можно достичь почти оптимального представления для заданного набора символов и их вероятностей (согласно теории энтропийного кодирования источника Шеннона, оптимальное представление будет стремиться к числу log 2 P -\log_2 P бит на каждый символ, вероятность которого P P ). Алгоритмы сжатия данных, использующие в своей работе метод арифметического кодирования, перед непосредственным кодированием формируют модель входных данных на основании количественных или статистических характеристик, а также найденных в кодируемой последовательности повторений или паттернов — любой дополнительной информации, позволяющей уточнить вероятность появления символа P P в процессе кодирования. Очевидно, что чем точнее определена или предсказана вероятность символа, тем выше эффективность сжатия.

В простейшем случае статической модели для кодирования информации, поступающей с системы обработки сигнала типы сигналов и соответствующие им вероятности распределены следующим образом:

  • 60%-я вероятность нейтрального значения сигнала, или NEUTRAL.
  • 20%-я вероятность положительного значения сигнала, или POSITIVE.
  • 10%-я вероятность отрицательного значения сигнала, или NEGATIVE.
  • 10%-я вероятность признака конца кодируемой последовательности, или END-OF-DATA.

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

В качестве алфавита вероятностной модели метода можно рассматривать любой набор символов, исходя из особенностей решаемой задачи. Более эвристические подходы, использующие основную схему метода арифметического кодирования, применяют динамические или адаптивные модели. Идея данных методов заключается в уточнении вероятности кодируемого символа за счёт учёта вероятности предшествующего или будущего контекста (то есть, вероятность появления кодируемого символа после определённого k-го числа символов слева или справа, где k — это порядок контекста).

Кодирование сообщения[править | править код]

Для кодирования последовательности «NEUTRAL POSITVE NEGATIVE END-OF-DATA» сначала разбивается отрезок от 0 до 1 согласно частотам сигналов: NEUTRAL — от 0 до 0,6; POSITVE — от 0,6 до 0,8; NEGATIVE — от 0,8 до 0,9; END-OF-DATA — от 0,9 до 1. Далее, осуществляется кодирование, начиная с первого символа: NEUTRAL соответствует отрезок от 0 до 0,6. Отрезок от 0 до 0,6 разбивается, и кодируется второй символ — NEGATIVE, на отрезке от 0 до 0,6 ему соответствует отрезок от 0,48 до 0,54. На полученном рабочем отрезке кодируется END-OF-DATA, этому символу соответствует отрезок от 0,534 до 0,54.

Так как это был последний символ, то кодирование завершено. Закодированное сообщение — отрезок от 0,534 до 0,54 или любое число из него, например, 0,538.

Декодирование сообщения[править | править код]

На диаграмме представлено декодирование итогового интервального значения 0,538 согласно модели в приведённом примере. Область интервала разбивается на подынтервальные области согласно вероятностным характеристикам появления соответствующих символов. Затем, очередной выбранный интервал разбивается аналогичным способом.

Если необходимо раскодировать сообщение методом арифметического кодирования, закодированное значением 0,538, то в начальном состоянии процесса рассматривается интервал от 0 до 1; на основании известной вероятностной модели дробное значение 0,538 попадает в интервал от 0 до 0,6, что позволяет определить первый символ, который был выбран кодировщиком, поэтому его значение выводится как первый символ декодированного сообщения.

Адаптивное арифметическое кодирование[править | править код]

Как и алгоритм Хаффмана, арифметическое кодирование может быть адаптивным (адаптивный алгоритм Хаффмана). Такой алгоритм позволяет строить разбиение каждого интервала на подынтервалы в поточном режиме (без предварительного сканирования данных), не имея никаких начальных знаний из исходного распределения, что позволяет за один проход сжать данные. Преимуществом этого способа является возможность кодировать на лету (аналогично адаптивному алгоритму Хаффмана).

Известно[3], что совсем необязательно, чтобы подынтервалы более частых символов располагались ближе к началу рабочего интервала, порядок может быть абсолютно любым. Поэтому для адаптивного арифметического кодирования можно расставить подынтервалы, соответствующие каждому символу, в порядке появления этих символов в тексте, зарезервировав последний подынтервал для случая, когда очередной символ встречается во входном потоке первый раз. В этом случае передаётся сначала этот последний подынтервал, а затем сам символ, что позволяет декодеру «опознать» его. Когда известных с начала входного потока символов несколько, их кумулятивные частоты можно хранить в обычном массиве, если же их число достигает сотни и больше, удобно применять такую структуру данных, как бинарное сбалансированное дерево[3], в котором каждая ветвь хранит два значения: непосредственную частоту символа и сумму частот всех символов, входящих в эту ветвь.[Комм. 1] При появлении очередного символа его частота в дереве увеличивается на 1, но лишь после изменения рабочего интервала, иначе декодирование станет невозможным.

Комментарии[править | править код]

  1. А также ссылку на родительскую ветвь в качестве «служебного» поля: когда частота изменяется, дерево должно автоматически изменить соответствующие суммы частот для родительской ветви, для родительской от родительской ветви и так далее до корня.

Примечания[править | править код]

  1. История развития теории сжатия информации Архивная копия от 28 декабря 2010 на Wayback Machine / Compression.ru, Sarmin Alexey, 10 марта 2011
  2. Dr. Dobb’s Data Compression Newsletter Архивная копия от 11 декабря 2017 на Wayback Machine, August 13, 2001
  3. 3,0 3,1 Д. Сэломон. Сжатие данных, изображений и звука. — М.: Техносфера, 2004.

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

Ошибка Lua в Модуль:Navbox на строке 353: attempt to index local 'listText' (a nil value).