Есть ответ 👍

Провести кодирование строки "to be or not to be? " кодом хаффмана и определить избыточность кода. текст в ковычках, там получается 19 символов, никак не могу построить правильное дерево, чтобы закодировать.

163
420
Посмотреть ответы 2

Ответы на вопрос:

liza1460
4,4(80 оценок)

Подсчитываются  вероятности  появления  символов  первичного  алфавита  в  исходном  тексте  (если  они  незаданы  заранее)символы  первичного  алфавита  m1  выписывают  в  порядке  убывания  вероятностей.последние  n0  символов  объединяют  в  новый  символ,  вероятность  которого  равна  суммарной  вероятностиэтих  символов,  удаляют  эти  символы  и  вставляют  новый  символ  в  список  остальных  на  соответствующееместо  (по  вероятности).  n0  вычисляется  из  системы: , где  a  —  целое  число,  m1  и  m2  —  мощность  первичного  и  вторичного  алфавита  соответственно.последние  m2  символов  снова  объединяют  в  один  и  вставляют  его  в  соответствующей  позиции,предварительно  удалив  символы,  вошедшие  в  объединение.предыдущий  шаг  повторяют  до  тех  пор,  пока  сумма  всех  m2  символов  не  станет  равной  1. этот  процесс  можно  представить  как  построение  дерева,  корень  которого  —  символ  с  вероятностью  1,получившийся  при  объединении  символов  из  последнего  шага,  его  m2  потомков  —  символы  из  предыдущегошага  и  т.  д. каждые  m2  элементов,  стоящих  на  одном  уровне,  нумеруются  от  0  до  m2-1.  коды  получаются  из  путей  (отпервого  потомка  корня  и  до  листка).  при  декодировании  можно  использовать  то  же  самое  дерево,считывается  по  одной  цифре  и  делается  шаг  по  дереву,  пока  не  достигается  лист  —  тогда  выводится  символ,стоящий  в  листе  и  производится  возврат  в  корень. построение  дерева  хаффмана бинарное  дерево,  соответствующее  коду  хаффмана,  называют  деревом  хаффмана.   построения  кода  хаффмана  равносильна    построения  соответствующего  ему  дерева. общая  схема  построения  дерева  хаффмана: составим  список  кодируемых  символов  (при  этом  будем  рассматривать  каждый  символ  как  одноэлементноебинарное  дерево,  вес  которого  равен  весу  символа).из  списка  выберем  2  узла  с  наименьшим  весом  (под  весом  можно  понимать  частоту  использования  символа—  чем  чаще  используется,  тем  больше  весит).сформируем  новый  узел  и  присоединим  к  нему,  в  качестве  дочерних,  два  узла  выбранных  из  списка.  приэтом  вес  сформированного  узла  положим  равным  сумме  весов  дочерних  узлов.добавим  сформированный  узел  к  списку.если  в  списке  больше  одного  узла,  то  повторить  2-5. пример  реализации пример  реализации  алгоритма  хаффмана  на  языке // скомпилируйте и введите java huffmantest class tree { public tree child0; // потомки "0" и "1" public tree child1; public boolean leaf; // признак листового дерева public int character; // входной символ public int weight; // вес этого символа public tree() {} public tree(int character, int weight, boolean leaf) { this.leaf = leaf; this.character = character; this.weight = weight; } /* обход дерева с генерацией кодов 1. "распечатать" листовое дерево и записать код хаффмана в массив 2. рекурсивно обойти левое поддерево (с генерированием кода). 3. рекурсивно обойти правое поддерево. */ public void traverse(string code, huffman h) { if (leaf) { system.out.println((char)character +" "+ weight +" "+ code); h.code[character] = code; } if ( child0 ! = null) child0.traverse(code + "0", h); if ( child1 ! = null) child1.traverse(code + "1", h); } } class huffman { public static final int alphabetsize = 256; tree[] tree = new tree[alphabetsize]; // рабочий массив деревьев int weights[] = new int[alphabetsize]; //
yliuagulian
4,5(72 оценок)

это легко ответ 40 % были и на 1 и во 2

Популярно: Информатика