Заранее извиняюсь за длинный пост.
С 1999 года все мечтал написать себе архиватор с собственным методом сжатия. Первые "алгоритмы" я уже не помню. До сих пор меня эта мысль мучает. Постоянно пробую написать свой метод сжатия, но никак не могу. Постоянно начинаю, но либо получаю отрицательные результаты (в результате сжатия файл становится больше), либо бросаю реализацию. Через полгода опять приходит эта мысль и все по-новому.
Одним из первых алгоритмов был: берем первый символ, и сравниваем следующие n байт с этим символом. = устанавливаем n бит 1, иначе 0. После этого эти байты удалялись, и весь массив сдвигался, заполняя свободное место. В большинстве случаев, после "архивации" файл получался большего размера чем был. Приходила идея сравнивать не 1 байт, а блоками. Т.е. бьем файл на блоки до тех пор, пока не появятся 2 одинаковых. Записываем вышеописанным методом. Блоки, соответственно, "архивируются" таким же способом. Данный метод не реализовывал.
Следующий алгоритм мне пришел в голову, когда мне надо было отправить много однотипных файлов. Один из файлов выбирался в качестве "шаблона". Хранился без сжатия. По нему сверялись все остальные. Если n байт файла-шаблона=n байту архивируемого файла, то n бит=1, иначе 0. То, что не совпало, дописывалось в без архивации. Следующий файл сверялся как с первым, так и со вторым файлом этим же способом. Выбирался наилучший вариант и сохранялся... Написание этого варианта забросил (недописал). Результат неизвестен.
Вчера опять пришли мысли о новом алгоритме. Вернее даже 2. Находим (не обязательно в одном файле) 2 одинаковых блока и записываем их в словарь, а в файле ставил ссылку на него (1 байт:0-неархивированный блок+8байт его размер;>0-архивированный блок+4/8байт номер блока). Или без словаря: 0-тоже, >0-размер блока (мин.размер блока+этот байт*const)+адрес в файле, откуда читать. Т.е. как бы частичные link. (почему-то ни один мной испытанный архиватор не поддерживает link'и. WinRAR честно архивирует файл 2 раза)
Каждый раз меня мучает сомнение в целесообразности/эффективности данного алгоритма. Хочется узнать мнение других, в частности — специалистов по алгоритмам сжатия, чтобы не мучатся и окончательно забросить эту идею (или может развивать ее дальше), т.к. свободного времени для этого не очень много. Да и реализовывать его лучше на C++, который я не очень хорошо знаю.
Модераторам: если написанное мною является бредом, удалить этот пост, или перенесите в соответствующий раздел.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>