Изменения

Перейти к: навигация, поиск

Арифметическое кодирование

192 байта добавлено, 20:32, 17 июня 2016
Pseudocode bugfix
*<math>\mathtt{s}\,</math> {{---}} текст, подаваемый на вход;
*<math>\mathtt{n}\,</math> {{---}} длина исходного текста;*<math>\mathtt{m}\,</math> {{---}} мощность алфавита исходного текста;*<math>\mathtt{letters[nm]}\,</math> {{---}} массив символов, составляющих алфавит исходного текста;*<math>\mathtt{probability[nm]}\,</math> {{---}} массив вероятностей обнаружения символа в тексте; *<math>\mathtt{segmentSegment}\,</math> {{---}} структура, задающая подотрезок отрезка <tex>[0; 1)</tex>, соответствующего конкретному символу на основе частотного анализа. Имеет поля:
**<math>\mathtt{left}\,</math> {{---}} левая граница подотрезка;
**<math>\mathtt{right}\,</math> {{---}} правая граница подотрезка;
<code>
'''struct''' segment {Segment:
'''double''' left
'''double''' right
}
'''void''' DefineSegmentsdefineSegments(letters: '''char'''[nm], probability: '''double'''[nm]): '''Segment''' segment[]
'''double''' l = 0
'''for''' i = 1 '''to''' nm
segment[letters[i]].left = l
segment[letters[i]].right = l + probability[i]
'''double''' ArithmeticCoding(s: '''stringchar'''[n]): defineSegments()
'''double''' left = 0
'''double''' right = 1
'''for''' i = 0 '''to''' length(s)n-1
'''char''' symb = s[i]
'''double''' newRight = left + (right - left) * segment[symb].right
*<math>\mathtt{code}\,</math> {{---}} вещественное число, подаваемое на вход;
*<math>\mathtt{length}\,</math> {{---}} длина восстанавливаемого текста;
*<math>\mathtt{nm}\,</math> {{---}} мощность алфавита исходного текста;*<math>\mathtt{letters[nm]}\,</math> {{---}} массив символов, составляющих алфавит исходного текста;*<math>\mathtt{probability[nm]}\,</math> {{---}} массив вероятностей обнаружения символа в тексте;
*<math>\mathtt{segment}\,</math> {{---}} структура, задающая подотрезок отрезка <tex>[0; 1)</tex>, соответствующего конкретному символу на основе частотного анализа. Имеет поля:
** <math>\mathtt{left}\,</math> {{---}} левая граница подотрезка;
<code>
'''struct''' segment {Segment:
'''double''' left
'''double''' right
'''char''' character
}
'''void''' DefineSegmentsdefineSegments(letters: '''char'''[n], probability: '''double'''[n]): '''Segment''' segment[m]
'''double''' l = 0
'''for''' i = 1 0 '''to''' nm-1
segment[i].left = l
segment[i].right = l + probability[i]
segment[i].character = letters[i]
'''string''' ArithmeticDecoding(code: '''double''', length: '''int'''): defineSegments()
'''string''' s = ""
'''for''' i = 1 0 '''to''' length-1 '''for''' j = 1 0 '''to''' nm-1
'''if''' code >= segment[j].left '''and''' code < segment[j].right
s = s + segment[j].character
48
правок

Навигация