итак, на чём мы там остановились...
итог моих поисков:
1) код Хаффмана понятен с третьего раза в теории, вменяем на практике (реализовал)
2) арифметическое кодирование идеально в теории, НЕВМЕНЯЕМО на практике %)
(прямо таки утопия для длинных файлов. Ну нету типов данных с ТАКОЙ точностью
Ну его нафик...)
3) LZ (Лемпеля-Зива алгоритм) - в теории понятен с 4-го с половиной раза, (вскоре приступаю к реализации, вроде проблем больше не вижу)
предполагаю, что использование в последовательности
...1 LZ
...2 Хаффман
улучшит степень сжатия, нежели по отдельности этими алгоритмами...
Почему считаю именно такую последовательность верной - LZ работает с целыми байтами, а Хаффман с битами, следовательно Хаффману достанется уже меньше работы-> выигрыш ещё и во времени. Если ошибаюсь - поправьте
Хотя , реализую LZ - сам всё увидю...
4) PPM мутен даже в теории... Если не лень кому нибудь - кратко на пальцах объясните, пожалуйста, из теории с теми голыми формулами я мало что понял...
----------
Если кому интересно или нужно, вот реализация кода Хаффмана в виде класса CHuffman (в аттаче)
(критика принимается и приветствуется!! Помидоры
тоже, если свежие
)
пример работы с классом:
//СЖАТИЕ БУФЕРА
CHuffman Huff;
BYTE* pFile=...;//буфер
DWORD dwdFileLen=...;//длина буфера
DWORD dwdPressedDataLen=0;
if(!Huff.PackData(pFile,dwdFileLen,&dwdPressedDataLen))
{
//ошибка
//...
}
//Huff.pArhivBuffer - буфер со сжатыми данными
//dwdPressedDataLen - длина сжатых данных
///////////////////////////////////////
//РАСПАКОВКА
BYTE* pArhiv=...;//буфер с архивом
DWORD dwdArhLen=...;//длина архива
CHuffman Huff;
DWORD dwdUnpackedFileLen=0;
if(!Huff.UnPackData(pArhiv,dwdArhLen,dwdUnpackedFileLen))
{
MessageBox("ошибка при распаковке");
return false;
}
//Huff.pUnpackBuffer - буфер со разжатыми данными
//dwdUnpackedFileLen - длина данных