Схема сжатия данных, математика - PullRequest
1 голос
/ 10 января 2011

У меня есть около 42 000 списков из 24 случайных чисел, все в диапазоне [0, 255]. Например, первый список может быть [32, 15, 26, 27, ... 11]. Второй список может быть [44, 44, 18, 19, .. 113]. Как я могу выбрать число из каждого списка, чтобы (так что в итоге я получил новый список из примерно 42 000 номеров), чтобы этот новый список был наиболее сжимаемым с помощью ZIP?

- этот вопрос касается математики, сжатия данных

Ответы [ 2 ]

1 голос
/ 11 января 2011

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

В общем, тогда списки с большим количеством повторных прогонов ([111,2,44,93,111,2,44,93 ...]) хорошо сжимаются при первом проходе.Списки с большим количеством повторяющихся чисел в других случайных вещах (т. Е. [111,34,43,50,111,34,111,111,2,34,22,60,111,98,2], где часто встречаются 34 и 111) будут хорошо сжиматься ввторой проход.

Чтобы найти подходящие числа, я думаю, что проще всего просто отсортировать каждый список, затем объединить их, сохранив сортировку, пока вы не получите 42000 выходных чисел.Вы получите пробеги, как они случаются.Это не будет оптимальным, у вас может быть число 255 в каждом входном списке, и вы бы пропустили их, используя эту технику, но это было бы легко.

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

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

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

0 голосов
/ 11 января 2011

Это пахнет NP-полной для меня, но я далеко не в состоянии доказать это.Снаружи имеется приблизительно 7,45e + 57968 (!) Возможных конфигураций для тестирования.Не похоже, что вы можете отказаться от конкретной конфигурации на раннем этапе, так как несжимаемый начальный раздел может впоследствии сильно сжиматься.

Мой лучший вариант для «хорошего» сжатия - подсчитать количество вхожденийкаждого числа по всему набору миллионов элементов и выберите из каждого списка числа с наибольшим количеством вхождений.Например, если в каждом списке присутствует 42, выбор только этого даст вам очень сжимаемый массив из 42 000 экземпляров того же значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...