2014-01-19 6 views
0

Я сжимаю 8 бит байтов, и алгоритм работает только в том случае, если количество уникальных одиночных байтов, найденных в данных, равно 128 или меньше.Улучшить этот алгоритм сжатия?

Я беру все уникальные байты. В начале я храню таблицу, содержащую один раз каждый уникальный байт. Если они равны 120, я храню 120 байт.

Затем, вместо хранения каждого элемента в пространстве 8 бит, я сохраняю каждый элемент в 7 бит один за другим. Эти 7 бит содержат позицию позиции в таблице.

Вопрос: Как я могу избежать хранения этих 120 байт в начале, путем хранения возможных таблиц в моем коде?

+0

Вы не можете, ваш алгоритм находится на этой странице. Вас может заинтересовать кодировка huffman, которая очень похожа на вашу: http://en.wikipedia.org/wiki/Huffman_coding – BlackBear

+0

Я могу уменьшить размер таблицы двумя способами: a) сжать таблицу; b) сохранить возможную таблицы в моем коде. Возможно ли? – Luka

+0

нет, у вас будет 120! (6.7e198) возможные таблицы для хранения. Если вам удастся создать всегда одну и ту же таблицу, вам не нужно ее отправлять, хотя – BlackBear

ответ

3

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

Но если вы собираетесь использовать один и тот же алгоритм, а затем рассмотреть этот способ: -

Dont магазин 120 байт магазин 256 бит (32 байта), где 1 указывают, если значение присутствует , потому что это даст вам все Информация. Вы используете бит для получения значений, которые находятся в файле, и снова создайте таблицы отображения.

+1

+1. хороший ответ. –

+1

Owh, умный !!!!! – Luka

1

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

Существует один способ избежать написания этих 120 байт: когда вы знаете содержимое этих байтов заранее. Например, когда вы знаете, что все, что вы собираетесь отправлять, будет содержать только эти байты. Затем вы можете просто сделать таблицу известной с обеих сторон и просто сохранить все, кроме этих 120 байт.

+0

Факт, то, что я описываю выше, является вторым проходом сжатия. Вот и все: я сжимаю сжатые данные, поэтому у меня нет возможности узнать возможные символы. Есть ли способ сохранить возможные комбинации в коде? – Luka

+0

Если вы попытаетесь сохранить все возможные комбинации, вам все равно придется определять все возможные комбинации. Из них 2^(8 * 128), который является точно таким же объемом пространства для хранения, что и байты, которые вы храните. – kokx

+0

Если вы попытаетесь сохранить все возможные комбинации <- прежде всего, возможно ли это? – Luka

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