Сжатие строки
- From
- Anthone Tikhonov ()
- To
- Evgeniy Jirnov
- Date
- 2002-10-14T11:23:44Z
- Area
- RU.ALGORITHMS
From: "Anthone Tikhonov" <ia26@vtb.ru>
EJ> Объясните мне как можно произвести сабж. То есть на входе обычная строка,
EJ> а на выходе строка меньшей длины. На входе сжатая строка, на выхода
EJ> обычная строка.
EJ> Строка размером или <255 или <65536
Сам никогда не занимался, но то, что помню из лекций по дискре:
1) Поиск наиболее часто повторяющихся участков в строке, и замена их
на более короткую комбинацию символов-код, в начале строки помещается
описание всех таких кодов; если в исходной строке встречается сам
код, его надо заменить на что-то еще
2) Подсчет частоты каждой буквы и замена частых букв на более короткие
битовые коды, а редких - на более длинные
Например, если у нас строка из 3х-битовых байтов
000 001 010 011 100 101 110 111, то их можно закодировать другим
набором - 1 01 001 00000 00001 00010 000110 000111
Здесь почти все коды длиннее чем 3, но зато 1 и 01 - короче,
кодируя ими самые частые буквы, мы можем получить выигрыш
Основная сложность здесь в том, что в наборе кодов ни один код не
должен быть началом другого кода, например 001 - это начало 00110,
иначе мы не сможем раскодировать полученную последовательность битов
Был какой-то алгоритм генерирования этих кодов по частотам букв, но
я не помню, как он даже называется
Вообще, можно покопаться в Инете и поискать алгоритмы построения
архиваторов, там все это и не только это должно быть
Антон
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)