В моем Rstudio (версия 0.98.1103) я могу изменить, где запускать приложение
Если ваш выбор «Запустить внешний» запустится в браузере
Если данные не действительно случайны и имеют симметричное 1/0 распределение, затем это просто становится проблемой сжатия данных без потерь и очень походит на CCITT Group 3 сжатия, используемые для черного цвета и белого цвета (т.е.: Двоичный файл) изображения ФАКСА. CCITT Group 3 использования схема Huffman Coding. В случае ФАКСА они используют фиксированный набор кодов Хаффмана, но для набора определенных данных, можно генерировать определенный набор кодов для каждого набора данных для улучшения достигнутой степени сжатия. Пока только необходимо получить доступ к битам последовательно, когда Вы подразумевали, это будет довольно эффективным подходом. Произвольный доступ создал бы некоторые дополнительные проблемы, но Вы могли, вероятно, генерировать индекс дерева двоичного поиска к различным точкам смещения в массиве, который позволит Вам быть рядом с желаемым местоположением и затем входить оттуда.
Примечание: Схема Huffman все еще работает хорошо, даже если данные случайны, пока 1/0 распределение не совершенно даже. Таким образом, чем менее ровный распределение, тем лучше степень сжатия.
Наконец, если биты действительно случайны с ровным распределением, то, ну, в общем, по словам г-на Claude Shannon, Вы не собираетесь быть способными сжать его любое существенное количество с помощью любой схемы.
Я сильно рассмотрел бы использование кодирования диапазона вместо Кодирования методом Хаффмана. В целом кодирование диапазона может использовать асимметрию эффективнее, чем Кодирование методом Хаффмана, но это особенно поэтому, когда размер алфавита является настолько небольшим. На самом деле, когда "собственный алфавит" просто 0s и 1 с, единственный способ, которым Huffman может получить любое сжатие вообще, путем объединения тех символов - который является точно, что кодирование диапазона сделает, эффективнее.
Спасибо за ответы. Это - то, что я собираюсь попытаться за то, что динамично выбрал правильный метод:
Я соберу все первые хиты N в стандартном битовом массиве и выберу один из трех методов, на основе симметрии этого образца.
Границы между асимметричными, умеренными, и симметричными регионами будут зависеть от времени, требуемого различными алгоритмами, сбалансированными относительно пространства, в котором они нуждаются, где относительное значение времени по сравнению с пространством было бы корректируемым параметром. Пространство, необходимое для Кодирования методом Хаффмана, является функцией симметрии, и я представлю это с тестированием. Кроме того, я протестирую все три метода для определения требований времени моей реализации.
Это возможно (и на самом деле я надеюсь), что средний метод сжатия всегда будет лучше, чем список или битовый массив или оба. Возможно, я могу поощрить это путем выбора ряда кодов Хаффмана, адаптированных к выше, или понизить симметрию. Затем я могу упростить систему и просто использовать два метода.
Еще одно сжатие думало:
Если битовый массив не сумасшедший длинный, Вы могли бы попытаться подать заявку, Норы-Wheeler преобразовывают перед использованием любого кодирования повторения, такого как Huffman. Наивная реализация взяла бы O (n^2) память во время (de) сжатия, и O (n^2 регистрируют n), время для распаковки - существуют почти наверняка ярлыки, которые будут иметься, также. Но если существует какая-либо последовательная структура к Вашим данным вообще, это должно действительно выручить Кодирование методом Хаффмана.
Вы могли также применить ту идею одному блоку за один раз для хранения времени/использования памяти более практичным. Используя один блок во время мог позволить Вам всегда сохранять большую часть структуры данных сжатой, если Вы читаете/пишете последовательно.
Прямое сжатие без потерь является способом пойти. Для создания этого доступным для поиска, необходимо будет сжать относительно маленькие блоки и создать индекс в массив блоков. Этот индекс может содержать разрядное смещение стартового бита в каждом блоке.
Быстрое 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 битов. Это просто не стоит того.
Сказав все это, также кажется очень маловероятным, что любые действительно полезные данные действительно случайны. В случае, если больше существует структура к Вашим данным, существует, вероятно, более оптимистический ответ.
Возможно, для вас уже поздно, но есть очень быстрая и эффективная по памяти библиотека для разреженных битовых массивов (без потерь) и других типов данных на основе попыток. Посмотрите на массивы Judy