изменение файла

программирование математика

Вот в общем такая ситуация: есть какой-то файл, к примеру возьмем однобайтный - 10111100. Рассматриваем наш файл как набор из 2ух битных частиц, образованных двумя подряд идущими битами: 10|11|11|00 в примере.
Как изменить файл, чтобы в нем не было две единицы подряд в одном наборе, но чтобы после можно было вернуть файл в первоначальный вид, для произвольного расположения таких частиц в файле?
(...01|10... - допускается; ...|11|... - то от чего надо избавиться)
Можно, конечно, взять и, увеличив файл в 2 раза, просто вставить между всеми битами 0, но вот вопрос: возможно ли так обратимо преобразовать файл, чтобы он увеличивался менее, чем на 1/4 (25%) ?

Примечание:
независимо от формата и размера файла
какая разница какой формат? все равно файл состоит из 0 и 1

Примечание:
если тут что-то неудобно выкладывать, то отправляйте на почту
[email protected], спасибо

Примечание:
alarmeria
был бы очень благодарен, если бы Вы разъяснили откуда берутся некоторые результаты, как кол-во выписываемых файлов в столбиках...и остальные
Ответы:
Какой формат файла?
Подобная задача встречается при кодировании аналогового сигнала в виде 0 и 1 в компьютерных сетях. Почитайте про скремблирование.
Для произвольного файла невозможно гарантировать увеличение размера менее, чем на 25%.
Это будет очевидно, если рассмотреть файл, состоящий из одних 1.
Я бы сделал так: Для каждой группы из двух бит, ввел бы первый начальный флаговый бит, который бы означал например если "1" - то следующие два бита остаются как есть, если "0" - то следующие два бита, содержали/содержат "11" (то есть, то что нужно выкинуть или вернуть, при обратном процессе). Т.к. в байте таких групп 4, мы увеличиваем число бит на 4, то есть в два раза :) Боюсь, уложиться именно в 25% максимум - просто невозможно. Теперь, мы работаем с файлом как с обычным набором данных, помятуя о том, что каждый третий бит (и первый, в первом блоке) - у нас лишние, и нужны для кодирования
Короткий ответ: нельзя.
Пока ехал домой, понял, что мой предыдущий пост содержал ошибку.
решение по крайней мере лучшее, чем увеличение файла в 2 раза, это ставить нули межу не всеми битами:)
например разбиваем последовательность по 7 бит
если встречается 11, то вставляем нули, а перед блоком записываем 1, иначе оставляем как есть, а перед блоком записываем 0.
учитываем это при обработке.
полагаю есть какая-то оптимальная длина блока.
можно закодировать способ обработки блока 2-мя битам, варьируя длинной блока, или способом расстановки нулей (например ставить через один), или на что хватит фантазии.
Пусть длина исходного файла 2m  (в битах; 2m потому, что она чётная). Мы хотим получить файл длины 2n
согласен с господами ub и gaosipov. а для реализуемости идеи с преобразованием входного потока из четверичной системы в троичную можно разбить входной поток на блоки четверичных цифр максимально приемлемого размера и конвертировать блоками. для решения проблемы с нулями в конце входного потока можно в начало выходного потока дописывать их число в той же троичной системе, тогда однозначность отображения входных потоков на выходные будет обеспечена.
Если мы разобъём на блоки, то время ухудшится: будет O(n^2) вместо O(n log n) (это потому, что время деления у нас теперь будет равно не логарифму, а количеству блоков, которое есть O(n)), зато бедт маленькая константа при n^2 (чем боле блок - ткм меньше) и в памяти можно  будет хранить не всё, а только блок.
Допустим, мы придумали алгоритм, как превратить файл длины 2n
в "хороший файл длины 125/100 от 2n, то есть длины 5n/2,
с возможностью последующего восстановления.
сколько всего возможных файлов длины не больше 2n:
Замеченные опечатки.


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.