Изменения

Перейти к: навигация, поиск
Передача алфавита
Алфавит нам будет дан изначально, не будет лишь кодов каждого символа, следовательно нам нужно просто указать, какой лист в дереве соответствует каждому символу. Занумеруем подряд все символы алфавита. Сопоставим каждому символу алфавита код фиксированной <tex>c'</tex> длины <tex> \lceil \log _2 \rceil n</tex> — его порядковый номер в алфавите, записанный в двоичной системе счисления. Все коды имеют фиксированную длину, а значит легко понять где заканчивается один, и начинается другой код. Тогда, если выписать подряд коды <tex>c'</tex> для всех символов в том порядке, в котором обход в глубину посещает соответствующие им листы, несложно восстановить, какому символу какой код <tex>c</tex> соответствует. Когда мы, в результате обхода в глубину, пришли в вершину, у которой нет детей, мы возьмем следующий переданный нам номер, посмотрим в нашем алфавите что это за символ, и присвоим текущей вершине этот символ.
=== Передача алфавита Отсутствие некоторых символов в тексте ===Предположим теперь, что не все символы из алфавита были использованы в тексте, тогда возникает вопрос: получив очередной код, как узнать какому символу он принадлежит? Для решения этой проблемы поступим следующим образом: будем передавать маску размером <tex>|\Sigma|</tex> бит. Если <tex>i</tex>-й бит маски равен единицевыпишем подряд коды c' в том порядке, в котором обход в глубину посещает соответствующие им листы, лишь для тех символов, это означает что <tex>i</tex>-й символ алфавита используется были использованы в нашем сообщении. Тогда получив встретив очередной кодсимвол, мы понимаемгарантированно будем знать, что он принадлежит следующему символу, бит которого встречался в маске равен единице. Заметим, что из-за маски в обоих способах прибавится <tex>|\Sigma|</tex> бит, которые нужно передатьнашем сообщении.
=== Используемая память ===
32
правки

Навигация