Хаффман "терминатор" цепочка - PullRequest
1 голос
/ 09 февраля 2011

Мотивация

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

Способ предварительного выделения дискового пространства теперь важен: давайте предположим, что у нас есть начало потока Хаффмана, но он не завершен, поэтому мы сталкиваемся с предварительно выделенным дисковым пространством. Обычно это пробел равен 0, поэтому мы продолжаем декодировать символы с кодом Хаффмана 00... Если это не наш конечный код, мы не замечаем «неверные» данные и т. Д. если есть 2 ГБ заранее выделенного пространства, мы делаем много бесполезного декодирования.

Таким образом, мы хотели бы предварительно распределить пространство таким образом, чтобы декодирование было остановлено как можно скорее.

Вопрос

Я ищу самую короткую цепочку битов, которая действует как «терминатор Хаффмана». Это означает, что если мы декодируем эту строку, мы декодируем каждый код Хаффмана хотя бы один раз, поэтому мы обязательно получим код конца. Это должно работать для каждой комбинации кодов Хаффмана длиной 1..n бит.

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

Пример

Давайте рассмотрим возможные комбинации кодов Хаффмана для n = 2: [0, 1], [00, 01, 1], [0, 10, 11], [00, 01, 10, 11]. Теперь давайте начнем с цепочки битов, которая содержит все возможные битовые последовательности длиной 1..n (0, 1, 00, 01, 10, 11):

001011

Декодирование с использованием различных комбинаций кодов Хаффмана дает (коды Хаффмана присваиваются символам A..D):

Combination   Decoded symbols
[0, 1]        AABABB
[00,01,1]     ACBC
[0,10,11]     AABC
[00,01,10,11] ACD

Это хорошее начало, и оно уже декодирует каждый код Хаффмана для первых трех, но если мы декодируем его с помощью [00, 01, 10, 11], мы пропускаем символ B (код Хаффмана 01). Итак, давайте просто добавим это к нашей цепочке:

00101101

Это действительный «терминатор Хаффмана» для n=2, длиной 8 бит. Если бы мы распределили наше дисковое пространство этим байтом, мы бы обязательно завершили все коды Хаффмана, которые не превышают 2 бита. Мы даже знаем, что не будет более коротких терминаторных строк для n=2, потому что это минимальная длина комбинации [00, 01, 10, 11] для декодирования каждого символа один раз.

Я также нашел «терминатор Хаффмана» для n=3, 0001011001110100111010011100010101111101110 (43 бита), но я не уверен на 100%, верен ли он, и я не знаю, является ли он самым коротким.

Что я ищу

  • Алгоритмы / идеи для поиска или генерации терминаторов Хаффмана для заданного n. Моя попытка была бы похожа на пример: генерирование стартовой строки и добавление битов, необходимых для удовлетворения всех различных комбинаций кода Хаффмана. Но я уверен, что есть лучшие способы.

  • Определенные терминаторы Хаффмана, n=8 и n=16, хотя их генерация может быть вычислительно дорогой, и они, возможно, будут очень длинными.

  • Статьи / ссылки об этой проблеме (или аналогичные), если таковые имеются.

Бонус

Бонусные баллы за нахождение «терминаторов Хаффмана», которые также работают, если мы начинаем с позиции бита 1..n, поэтому он даже заканчивается, если данные были декодированы ранее, и мы не прибудем и не начнем новый код Хаффмана с первого бита.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Если я правильно понимаю, то любой универсальный терминатор для кода Хаффмана с точностью до n-бит требует по меньшей мере n * 2 ^ n битов, поскольку это может быть случай, когда есть 2 ^ n исходных символов (включая неизвестный символ завершения), каждый из которых встречается с равной вероятностью, что требует n-битного кода для каждого символа. Это также говорит вам, что любой такой универсальный терминатор минимальной длины будет перестановкой этих 2 ^ n блоков из n битов.

Так, например, для n = 16 ни один универсальный терминатор не может быть короче 1048576 бит или 128 КБ. (И, конечно, может потребоваться гораздо больше времени.)

1 голос
/ 09 февраля 2011

Возможно, вам не следует использовать Хаффмана в этом сценарии.

Или лучше отслеживайте, какие сегменты (не) загружаются.

...