项目作者: manmolecular

项目描述 :
Arithmetic coding - common algorithm used in both lossless and lossy data compression algorithms
高级语言: C++
项目地址: git://github.com/manmolecular/Arithmetic-coding.git
创建时间: 2017-05-17T12:35:01Z
项目社区:https://github.com/manmolecular/Arithmetic-coding

开源协议:

下载


Arithmetic-coding

Арифметическое кодирование / Arithmetic coding

Арифметическое кодирование — один из алгоритмов энтропийного сжатия.

В отличие от алгоритма Хаффмана, не имеет жесткого постоянного соответствия входных символов группам бит выходного потока. Это даёт алгоритму большую гибкость в представлении дробных частот встречаемости символов.

Как правило, превосходит алгоритм Хаффмана по эффективности сжатия, позволяет сжимать данные с энтропией, меньшей 1 бита на кодируемый символ, но некоторые версии имеют патентные ограничения от компании IBM. (wikipedia)

Интерфейс (visual studio 2015):

alt tag
alt tag
alt tag
alt tag
alt tag

Общий принцип (алгоритм) работы:

Кодирование:

  1. На вход программы поступает текст - вводится либо с клавиатуры, либо из файла.
  2. Из полученного текста создается алфавит - массив символов, исключающий повторы.
  3. Создается массив накапливаемых частот (размер которого равен размеру алфавита) для символов из алфавита.
  4. Вызывается классовый метод кодирования, преобразующий исходный текст в последовательность 0 и 1

Раскодирование:

  1. На вход поступает строка, состоящая из закодированных символов (т.е. кодовая строка из 0 и 1).
  2. Вызывается классовый метод декодирования, преобразующий последовательность 0 и 1 в исходный текст

Структура класса arithmetic:

  1. class arithmetic
  2. {
  3. private:
  4. /* Определение половины, четверти и 3/4 */
  5. const int first_qtr = _high_edge / 4 + 1;
  6. const int half = 2 * first_qtr;
  7. const int third_qtr = 3 * first_qtr;
  8. /* Основные объекты для работы с текстом */
  9. string text;
  10. string abc;
  11. string encode;
  12. string decode;
  13. /* Массив частот */
  14. int *freq;
  15. protected:
  16. /* Режим вывода дебаг-информации */
  17. static bool debug_mode;
  18. public:
  19. /* Показать таблицу частот и символов */
  20. void show_table();
  21. /* Вернуть закодированную строку */
  22. string get_encode();
  23. /* Вернуть раскодированную строку */
  24. string get_decode();
  25. /* Вернуть исходный текст */
  26. string get_text();
  27. /* Поместить текст из файла в string text*/
  28. void get_file(string filename);
  29. /* Поместить текст из входной input строки в string text */
  30. void input_string(string input);
  31. /* Ввести входной текст с клавиатуры */
  32. void input_keyboard();
  33. /* Создать алфавит */
  34. void get_abc();
  35. /* Создать массив частот */
  36. void get_frequency();
  37. /* Получение индекса следующего символа */
  38. void get_next_symbol(int i, int *current);
  39. /* Записать биты */
  40. string write_bits(bool bit, int bits_to_foll);
  41. /* Вывести полученный текст в файл */
  42. void output_file(string filename);
  43. /* Метод кодирования текста */
  44. void encode_text();
  45. /* Перевод 16 бит строки в int */
  46. int to_int(int _pos);
  47. /* Перевод int в биты */
  48. string to_bits_16(int _value);
  49. /* Метод добавления бита к int числу */
  50. int add_bit(int value, int count_taken, bool &flag);
  51. /* Метод раскодирования текста */
  52. void decode_text();
  53. };