LINUX.ORG.RU

Алгоритм Хаффмана для последовательностей/больших алфавитов


0

0

Есть поток 32битных целых, надо его максимально эффективно сжать. Значения распределены неравномерно, скажем так примерно половина влезет в 16 бит, но на деле распределение еще сложнее - хочется построить максимально эффективный код. Нужно что-то типа алгоритма Хаффмана, но напрямую (с алфавитом из 2^32 букв) его не применить. Есть идея отталкиваться от длины последовательности, т.е. разбить значения на 32 класса по числу значащих битов, и для каждого Хоффманом вывести префикс. Но как учитывать в алгоритме длину, просто умножать на частоту? Может есть другие варианты - думаю было бы эффективнее разбить числа на большее число классов.

Ссылки/хинты/идеи?

★★★★★

Т.е. смущает размер дерева (2^32 node) для всех возможных вариантов 32 битного целого?

идеи?

Что если читать 32 бита, делить на четыре 8-битовых значения и кодировать именно 8-битными частями. Тогда если исходное 32-битное влезает в 16 бит то две 8-битных части будут просто нулями, а алгоритм можно заточить на нули (чтобы они были ближайшими в дереве).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

> Тогда если исходное 32-битное влезает в 16 бит то две 8-битных части будут просто нулями, а алгоритм можно заточить на нули (чтобы они были ближайшими в дереве).

Точнее, он сам заточится, не надо его корёжить.

Я бы попробовал ещё делить на 16-битные числа. Причём алгоритм можно применить адаптивный, чтобы не запихивать большой словарь в выходной поток.

const86 ★★★★★
()

Не совсем понял, чем вас смущает Хаффман напрямую? Большой алфавит? Если да, то все равно ничего вразумительного используя 32 битные символы вы не сделаете, поскольку большинство адекватных алгоритмов требуют статистической информации, а её для алфавита мощьностью 2^32 составить не реально. Так что разбивайте например на 8 битные символы и их кодируйте. Тут подойдет либо классический Хаффман, либо, что предпочтительнее, Арифметическое Кодирование. Либо, если поток содержит много повторяющихся цепочек символов, то LZW алгоритм.

Daeloce
()
Ответ на: комментарий от const86

Почему сам? Как реализовать так и будет:

  .
 / \
00  .
   / \
  01  .
     / \
    10  11

или наоборот

  .
 / \
11  .
   / \
  10  .
     / \
    01  00

или вообще

  .
 / \
01  .
   / \
  00  .
     / \
    11  10
quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

> Почему сам? Как реализовать так и будет

Вообще-то конкретное дерево выбирается по частотам символов. Если нулей много, а ТС обещает, что много, то код для него будет короткий.

const86 ★★★★★
()

Юзай liblzo2.so и не выпендривайся.

anonymous
()
Ответ на: комментарий от quasimoto

Т.е. если «у автора будет 32-битное [x][0][0][0]» то алгоритм Хаффмана сам сделает так чтобы 0 был самым близким по дереву.

P.S. моя вина, не правильно понял ваш рисунок. Показалось что листья деревиев у вас это выходной код, а не исходный символ.

Daeloce
()
Ответ на: комментарий от quasimoto

Да, с частотой я подзабыл - действительно, если будет избыточность символа (0), то это позволит получить более короткий выходной код.

quasimoto ★★★★
()

А вообще Хаффман уже давно не Труъ метод!:) Во всем мире от него отказываются в пользу «Арифметического кодирования».

Daeloce
()
Ответ на: комментарий от quasimoto

Хм, там есть какие-то патентные ограничения, но «The Dirac codec uses arithmetic coding and is not patent pending».

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Вообще о методах сжатия есть хорошая книжка: Сжатие данных, изображений и звука - Д. Сэломон

А что такое ТЧ?:)

Daeloce
()
Ответ на: комментарий от Daeloce

А что такое ТЧ?:)

Теория Чисел, как оказалось она там как раз и используется.

Вот такие ссылки силы я нашёл:

http://www.hpl.hp.com/techreports/2004/HPL-2004-76.pdf

http://diracvideo.org/download/arith-speedups/arith-speedups.pdf

Но пока непонятно - это всё самому реализовывать, или есть open source библиотеки для этого? Что-то я ничего не нашёл пока.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

С либами фиг знает... Должны быть! Данное кодирование используется в стандарте jpeg2000 можно попробовать посмотреть как там реализовано, может они не сами реализовывали, а либу юзали.

Daeloce
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.