2014-12-23 3 views
-1

Я работаю над кодировкой Хаффмана на Java. Я не понимаю, как и где хранить дерево. Я знаю, как сделать дерево, а затем сохранить его как двоичный файл, но для цели декодирования нам снова понадобится то же дерево для декодирования. Как сохранить это дерево в файле, чтобы связать его с двоичным файлом?Как сохранить дерево Хаффмана в файле?

+0

Где мой код? Какой язык программирования? – Raptor

+0

он сказал java, если вы обратили внимание –

+0

показать код, который вы пробовали. –

ответ

1

Напишите дерево как последовательность бит: 0 представляет лист, 1 представляет собой внутренний узел. Выход для двоичного дерева (Huffman или иначе) с N листовыми узлами и внутренними узлами N-1 будет представлять собой последовательность из 2N-1 бит. (Фактически вы можете сохранить два бита, поскольку вы знаете, что первый и последний узлы в дереве будут листовыми узлами, но, вероятно, не стоит усложнять алгоритм для сохранения двух бит.)

Возможно, проще всего расположить биты в предварительном порядке:

function write_tree (top_node) { 
    if is_leaf(top_node) { 
     write "0" 
     // optionally, write any date associated with the leaf node 
     // although in practice it's easier to write the leaf data 
     // to a separate output stream. That lets this stream contain 
     // actual bits rather than the characters "0"/"1" 
     } 
    else { 
     write "1" 
     write_tree (top_node.left) 
     write_tree (top_node.right) }} 

function read_tree (bit_stream) -> returns tree 
    next_bit = bit_stream.read() 
    if next_bit = "0" { 
     root = new leaf 
     // optionally read data associated with the leaf node 
     } 
    else { 
     root = new internal node 
     root.left = read_tree (bit_stream) 
     root.right = read_tree (bit_stream) } 
    return root } 

я не заметил сначала, что вы упомянули Java, так что я написал выше, в псевдо-коде, который я уверен, что у вас не будет никаких проблем переписывания в Java ,

+0

Спасибо за вашу помощь, но я не сталкиваюсь с проблемой в создании дерева и присваивании кодов символам. Я не понимаю, как мы можем сохранить дерево в файле, чтобы такое же дерево можно было использовать для декодирования кода? см. дерево, которое мы создаем, в нашей памяти, используя связанный список, то как мы можем сохранить его в файле? – 5400824

+0

Но это именно то, что я вам дал код! Последовательность бит точно кодирует ** форму ** дерева. Чтение этих бит позволяет построить новое дерево с точно такой же формой. Очевидно, что биты будут записаны и позже будут прочитаны из файла. В дереве Хаффмана все внутренние узлы имеют валентность 2, и все данные привязаны к листовым узлам (которые имеют валентность 0). Данные могут быть записаны отдельно в последовательном порядке в отдельный файл или в другую часть того же файла или, как указано, вкратце с битами точно там, где указан соответствующий листовой узел. – ganbustein

+0

Извините, может быть, я не понимаю вашу точку зрения. Спасибо, теперь я понял. – 5400824

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