48
правок
Изменения
м
→Псевдокод
'''void''' defineSegments(letters: '''char'''[n], probability: '''double'''[n]):
'''Segment''' segment[m]segment
'''double''' l = 0
'''for''' i = 0 '''to''' m - 1
Несмотря на преимущества арифметического кодирования, существует проблема при его практическом применении из-за несовершенства представления чисел с плавающей точкой в памяти компьютера {{---}} поскольку некоторые дробные числа не могут быть точно представлены в двоичном коде, используемом современными процессорами (например, <tex>\dfrac{1}{3}</tex>), границы символов будут округлены, что может повлечь за собой неверную работу алгоритма при больших объёмах данных. В общем случае, алгоритм можно модифицировать так, чтобы результатом было дробное число. В такой реализации вероятность встречи символа представляется в виде дроби, числитель которой представляет количество использований символа в тексте, знаменатель {{---}} длину <tex>n</tex> исходного текста. Поскольку в каждой итерации будет переход из текущего отрезка в один из его <tex>m</tex> подотрезков, кратных по длине <tex>n</tex>, а всего итераций <tex>n</tex>, в конечном результате в качестве знаменателя дроби будет <tex>n^{n}</tex>, а числитель можно найти, рассматривая отрезок <tex>[0; n^{n})</tex> на первой итерации.
== Пример работы ==
Рассмотрим в качестве примера строку <tex>abacaba</tex>: