2015-11-13 3 views
1

Скажем, у вас есть программа на С ++, которая должна читать текст из заданного .txt-файла. Программа будет:Создать дерево кода Хаффмана из min-heap C++

  • вычислить число появлений каждого полукокса в файле, то каждый уникального полукокс (и его частоту) будет сохранена в качестве нового узла дерева
  • Затем программа строит мин-кучу, содержащую эти узлы, то Дерево кодов Хаффмана строится с использованием этой мини-кучи.
  • Переходы (предварительный заказ и порядок) будут записаны в выходной файл. Каждый внутренний узел дерева будет иметь метку I: xxx, где xxx - это метка int, а листья имеют L: xxx
  • Программа, наконец, создает таблицу, содержащую кодировку (на основе ASCII, а не true .bin version) каждого символ хранится в виде строки

Я полагаю, я бы хранить каждый узел в пределах HUFFMAN класса, как это:

struct CharNode { 

     char value; 
     int frequency; 
     bool internal; 
     int label; 
     CharNode *parent; 
     CharNode *left_child; 
     CharNode *right_child; 
}; 

Я точно не знаю, куда двигаться. Любая помощь приветствуется!

+0

Первый шаг читается из .txt-файла. Удачи. –

ответ

1

Начните с использования массива, который достаточно длинный, чтобы иметь один элемент для каждого символа, который должен быть распознан вашим приложением. Теперь перейдем к строке, чтобы увеличить элементы массива, соответствующие их значениям ASCII. (Вам может потребоваться вычесть определенную базовую сумму начального значения ASCII, поэтому вы начинаете считать первый элемент массива для 'a')

Эта часть также может быть выполнена довольно легко на C, поскольку она использует символы и ints в качестве эквивалентов.

После того, как вы сделали все, у вас есть все символы и их количество вхождений. Теперь вы можете выполнять итерацию через массив после начала создания узлов дерева. И используйте ваши алгоритмы кучи на этом дереве.

Или просто отсортируйте массив, чтобы построить свое дерево оттуда.

Удачи и счастливого кодирования :)

+0

Я очень смущен тем, как построить мини-кучу из этого массива, и как это могло бы даже перевести на дерево хаффмана :( –

+0

сделать один узел из каждого элемента массива и поместить его в структуру, упорядоченную множеством ocurrences. Создайте новый узел, сделайте два маленьких узла его дочерними элементами и задайте номер этого узла как сумму обоих его дочерних элементов. Удалите дочерние узлы из структуры, вставьте в нее этот новый узел, повторите его сортировку и повторите пока у вас не останется только один узел. Он будет/должен быть корнем вашего дерева хаффмана – Nils

Смежные вопросы