2016-03-09 6 views
2

Прежде всего, я новичок в программировании, поэтому я ожидал бы простых и хорошо объясненных ответов. Во-вторых, это очень конкретный вопрос, и я не хочу, чтобы модераторы и другие пользователи просто закрывали этот вопрос как вне темы или слишком широко.Как использовать структуру данных splay tree в кодировке huffman для сжатия данных?

В любом случае, я хочу реализовать кодировку Хаффмана в java, используя какую-то структуру данных. Но, однако, я думал об использовании splay tree, поскольку это то, что не будет описано в учебном плане курса, а также, поскольку я хочу изучить новую структуру данных. Теперь главный вопрос заключается в том, что если алгоритм кодирования Хаффмана потребовал бы структуру данных Splay tree во-первых?

Что я могу использовать в дереве splay в моем проекте сжатия данных на основе Хаффмана? Или вы предпочтете лучше (для его эффективности и, возможно, для творчества в контексте, что это уникальная и не очень-то известная) структура данных для этого проекта?

Благодаря

+2

Дерево расщепления представляет собой особый тип двоичного дерева с собственными балансирующими свойствами (в частности, элементы, к которым обращаются, обращаются к корню). Для кодирования Хаффмана, я думаю, вы хотите использовать более общее двоичное дерево, поскольку вы будете определять структуру, основанную на частоте символов в строке, а не на частотах доступа. Однако деревья splay часто используются в * онлайн-сжатии, о чем вы можете узнать здесь: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.137.1924&rep=rep1&type=pdf –

+0

Спасибо за ваш комментарий и благодарность за этот PDF. –

ответ

1

Любой код Хаффмана может быть представлен структурой двоичного дерева, листья которого являются символы, которые должны быть закодированы. При переходе от корня к символу, который должен быть закодирован, левая и правая ветви могут быть представлены как 0 или 1 бит; результатом является правильный префиксный код с длиной кода, заданной глубиной символов.

В идеале вы должны использовать структуру дерева splay непосредственно, чтобы определить код Хаффмана для каждого символа. Однако деревья splay сохраняют свои данные в узлах, а не в листьях. Вам нужно будет либо найти способ использования дерева splay на основе данных в листах, либо создать трансформацию, которая вместо этого вычисляет действительный (и эффективный) набор префиксных кодов из узлов узла.

Одна из возможностей состоит в том, чтобы поддерживать левый и правый край каждого поддерева в корневом узле (для обновления, поскольку дерево разворачивается, конечно). Это должно позволить вам искать листья, даже если вы действительно не заботитесь о своих данных узла как таковых. При этом обычные операции разворота должны, естественно, генерировать динамический код Хаффмана, предвзятый относительно недавно встречающихся символов.

+0

Ваш ответ был именно тем, что я искал. Однако что вы подразумеваете под последним предложением? «Обычные операции разворота должны, естественно, генерировать динамический код Хаффмана, предвзятый по отношению к недавно встречающимся символам». Кодирование Huffman генерирует коды для часто встречающихся символов, а деревья с множеством полезны, если нам нужно быстро получить доступ к элементам, доступным недавно. Итак, как бы я объединил их оба? Я имею в виду, зачем нужна такая функциональность в кодировке Хаффмана, функциональность доступа к недавно встречающимся символам? –

+0

Ну, это именно мой вопрос, и я хочу знать, есть ли какие-либо преимущества использования дерева splay здесь, а также есть способ, которым я могу использовать способность splay tree для некоторой дополнительной выгоды в кодировании Хаффмана? - Спасибо –

+0

Различные виды Входы имеют разные частоты символов. Если вы заранее не знаете, какой вход у вас есть, вам придется адаптироваться. Splay деревья перемещают часто используемые узлы к корню для более быстрого доступа; в терминах дерева Хаффмана это означает более короткие битовые коды, которые, предположительно, вы хотите ... – comingstorm