Что должны немного выстроить некоторые альтернативы?

В моем Rstudio (версия 0.98.1103) я могу изменить, где запускать приложение

Если ваш выбор «Запустить внешний» запустится в браузере

8
задан erickson 30 August 2008 в 18:35
поделиться

7 ответов

Если данные не действительно случайны и имеют симметричное 1/0 распределение, затем это просто становится проблемой сжатия данных без потерь и очень походит на CCITT Group 3 сжатия, используемые для черного цвета и белого цвета (т.е.: Двоичный файл) изображения ФАКСА. CCITT Group 3 использования схема Huffman Coding. В случае ФАКСА они используют фиксированный набор кодов Хаффмана, но для набора определенных данных, можно генерировать определенный набор кодов для каждого набора данных для улучшения достигнутой степени сжатия. Пока только необходимо получить доступ к битам последовательно, когда Вы подразумевали, это будет довольно эффективным подходом. Произвольный доступ создал бы некоторые дополнительные проблемы, но Вы могли, вероятно, генерировать индекс дерева двоичного поиска к различным точкам смещения в массиве, который позволит Вам быть рядом с желаемым местоположением и затем входить оттуда.

Примечание: Схема Huffman все еще работает хорошо, даже если данные случайны, пока 1/0 распределение не совершенно даже. Таким образом, чем менее ровный распределение, тем лучше степень сжатия.

Наконец, если биты действительно случайны с ровным распределением, то, ну, в общем, по словам г-на Claude Shannon, Вы не собираетесь быть способными сжать его любое существенное количество с помощью любой схемы.

16
ответ дан 5 December 2019 в 06:55
поделиться

Я сильно рассмотрел бы использование кодирования диапазона вместо Кодирования методом Хаффмана. В целом кодирование диапазона может использовать асимметрию эффективнее, чем Кодирование методом Хаффмана, но это особенно поэтому, когда размер алфавита является настолько небольшим. На самом деле, когда "собственный алфавит" просто 0s и 1 с, единственный способ, которым Huffman может получить любое сжатие вообще, путем объединения тех символов - который является точно, что кодирование диапазона сделает, эффективнее.

4
ответ дан 5 December 2019 в 06:55
поделиться

Спасибо за ответы. Это - то, что я собираюсь попытаться за то, что динамично выбрал правильный метод:

Я соберу все первые хиты N в стандартном битовом массиве и выберу один из трех методов, на основе симметрии этого образца.

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

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

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

1
ответ дан 5 December 2019 в 06:55
поделиться

Еще одно сжатие думало:

Если битовый массив не сумасшедший длинный, Вы могли бы попытаться подать заявку, Норы-Wheeler преобразовывают перед использованием любого кодирования повторения, такого как Huffman. Наивная реализация взяла бы O (n^2) память во время (de) сжатия, и O (n^2 регистрируют n), время для распаковки - существуют почти наверняка ярлыки, которые будут иметься, также. Но если существует какая-либо последовательная структура к Вашим данным вообще, это должно действительно выручить Кодирование методом Хаффмана.

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

1
ответ дан 5 December 2019 в 06:55
поделиться

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

0
ответ дан 5 December 2019 в 06:55
поделиться

Быстрое combinatoric доказательство, что Вы не можете действительно оставить много свободного места:

Предположим, что у Вас есть произвольное подмножество n/2 набора битов к 1 из n общих битов. Вы имеете (n, выбирают n/2), возможности. Используя формулу Стерлинга, это примерно 2^n / sqrt (n) * sqrt (2/пи). Если каждая возможность одинаково вероятна, то нет никакого способа дать более вероятному выбору более короткие представления. Таким образом, нам нужен log_2 (n, выбирают n/2), биты, который является о n - (1/2) журнал (n) биты.

Это не очень хорошие сбережения памяти. Например, если Вы работаете с n=2^20 (1 meg), затем можно только сохранить приблизительно 10 битов. Это просто не стоит того.

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

0
ответ дан 5 December 2019 в 06:55
поделиться

Возможно, для вас уже поздно, но есть очень быстрая и эффективная по памяти библиотека для разреженных битовых массивов (без потерь) и других типов данных на основе попыток. Посмотрите на массивы Judy

2
ответ дан 5 December 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: