Алгоритм кодирования Хаффмана, дающий странное дерево (Java)
Я пробовал здесь много разных вещей и не могу заставить его работать. Ввод был "abbcccddddeeeee", который дает связанный список a, b, c, d, e с частотами 1, 2, 3, 4, 5 соответственно.
Однако, по какой-то причине, мне кажется, что я получаю следующее дерево, основанное на множестве разных тестов:
f15
/ \
f6 f9
/ \
d4 e5
/ \
f3 c3
/ \
a1 b2
public static HTree createHuffmanTree(HLinkedList list)
{
while (list.size() != 1)
{
list = getSortedLinkedList(list);
HTreeNode p = list.head;
HTreeNode q = p.next;
HTreeNode r = new HTreeNode('f');
r.left = p;
r.right = q;
r.frequency = (p.frequency + q.frequency);
list.insertIntoPosition(r, 2);
list.remove(0);
list.remove(0);
list = getSortedLinkedList(list);
}
return new HTree(list.head);
}
Было бы совершенно удивительно, если бы кто-то мог мне помочь, я невероятно, невероятно расстроен.
Спасибо!
1 ответ
Проблема в getSortedLinkedList
, Похоже, что вы меняете значения частоты, а не сами узлы, поэтому указатели не перемещаются вместе со значением частоты.
Обычно, когда вы имеете дело со связанными списками, действительно полезно рисовать картинки каждого этапа:
a1->b2->c3->d4->e5
первый шаг:
f3->c3->d4->e5
/\
a1 b2
сортировка: без изменений
следующий шаг:
f6->d4->e5
/\
f3 c3
/\
a1 b2
сортировка делает это:
d4->e5->f6 (forgot to move child nodes with frequency)
/\
f3 c3
/\
a1 b2
следующий шаг:
f9->f6
/\
d4 e5
/\
f3 c3
/\
a1 b2
Сортировать:
f6->f9 (forgetting to move child nodes with frequency)
/\
d4 e5
/\
f3 c3
/\
a1 b2
Заключительный этап:
f15
/\
f6 f9
/\
d4 e5
/\
f3 c3
/\
a1 b2