55
правок
Изменения
→Алгоритм декодирования
=== Алгоритм декодирования ===
При декодировании последовательности символов также используется множество весов <tex>w</tex> символов алфавита <tex>\sum</tex>. В начале работы алгоритма все веса символов равны <tex>1</tex>. На каждом шаге определяется интевал, содержащий данный код, по интервалу находится символ, который потом записывается в выходную последовательность. Вес полученного символа <tex>\alpha</tex> увеличивается на <tex>1</tex>. Отрезки, соответствующие символам алфавита, перестраиваются в зависимости от изменённых весов символов и размера текущего подотрезка. При получении символа конца последовательности или обработки нужного числа символов алгоритм завершает работу.
==== Декодирование ====
* <tex>\mathtt{code}</tex> {{---}} вещественное число, подаваемое на вход;
* <tex>\mathtt{n}</tex> {{---}} длина декодируемой строки;
* <tex>\mathtt{m}</tex> {{---}} мощность алфавита;
* <tex>\mathtt{weight}</tex> {{---}} веса символов алфавита;
* <tex>\mathtt{segments}</tex> {{---}} веса символов алфавита;
'''string''' '''decode('''code : '''double''', alphabet : '''set<char>''', '''int''' len):
'''map<char, int>''' weight = '''defineWeights('''alphabet''')'''
'''map<char, Segment>''' segments = '''defineSegments('''alphabet''')'''
'''string''' ans = ""
<font color=green>// декодирование строки</font>
'''for''' i = 0 '''to''' n - 1:
<font color=green>// поиск нужного символа исходной строки по текущему значению кода</font>
'''for''' j = 0 '''to''' m - 1:
'''char''' c = alphabet[j]
'''if''' code >= segments[c].left '''and''' code < segments[c].right
ans = ans + c
weight[c]++
<font color=green>// вычисление следующего значения кода, с учетом декодированного символа c</font>
code = (code - segments[c].left) / segments[c].right - segments[c].left)
<font color=green>// перестроение подотрезков, с учётом декодированного символа c </font>
resizeSegments(alphabet, weight, segments)
'''break;'''
'''return''' ans
== См. также ==