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

В этом сообщении в блоге я объясню, как работает кодирование Хаффмана и почему оно так полезно.

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

Символ в компьютере обычно представляется с помощью 8 битов, которые известны как байты. Это означает, что один символ можно сохранить, используя 8 бит или 1 байт памяти.

Схема кодирования ASCII использует 7 бит для представления символа, в то время как схема Unicode использует 16 бит на символ.

A имеет код ascii 65 и может быть представлен в битах как 01000001.

Предположим, у нас есть строка из 20 символов:

let str = "BACABABCCACDIAIDACAB";

Общее количество используемых битов: 20 X 8 бит = 160 бит.

нам нужно 160 бит для хранения строки длиной 20.

Он использует двоичное дерево для представления частоты символов в данном тексте. Первым шагом в процессе кодирования Хаффмана является вычисление частоты каждого символа в тексте. Двоичное дерево построено таким образом, что наиболее часто встречающиеся символы представляются более короткими битовыми строками, а менее часто встречающиеся символы представляются более длинными битовыми строками.

В нашей строке «BACABABCCACDIAIDACAB» у нас есть 5 повторяющихся символов, поэтому нам нужно максимум 3 бита для их хранения.

Как видите, мы можем представить каждый символ, используя 3 бита, и каждый символ имеет свой битовый код.

Теперь, если мы подсчитаем, сколько бит нам нужно, то это будет 20 X 3 бита = 60 бит.

Уменьшение размера со 160 до 60 бит.

у нас есть собственное битовое представление исходного сообщения.

Но вопрос в том, как другой человек узнает, просто взглянув на битовое представление сообщения, что именно оно означает?

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

Итак, нам нужно отправить таблицу вместе с сообщением, чтобы ее было легко преобразовать. нам также нужно рассчитать размер таблицы.

  • у нас есть 5 символов, которые нужно отправить в кодах ASCII, поэтому потребуется 5 X 8 = 40 бит.
  • Для каждого пользовательского битового представления символа нам нужно: 5 X 3 бита = 15 бит.
  • поэтому общее количество битов, необходимых для отправки сжатого сообщения с таблицей, составляет 60 + 40 + 15 = 115 бит.

Это также называется кодом фиксированного размера.

Кодирование Хаффмана использует оптимальный шаблон слияния. В нем говорится, что каждый алфавит должен быть расположен в порядке возрастания их появления. и объедините 2 самых маленьких, чтобы сделать узел.

  • мы перечислили наши уникальные символы на основе их появления в порядке возрастания. Предположим, что каждый символ в базе является узлом.
  • нам нужно объединить два самых маленьких узла, а затем создать узел.
  • вот так выглядит наше дерево:

Теперь на основе этого дерева можно создать новую таблицу с динамическим размером кода. давай сделаем это:

Давайте разберемся, как мы создали коды:

мы начнем сверху, а затем будем двигаться вниз, чтобы добраться до нашего персонажа, и мы также будем отслеживать наш код.

  • Чтобы получить код для символа А, давайте начнем сверху, чтобы добраться до А, нам нужно двигаться вниз. поэтому наш путь равен 1 и 1, поэтому наш код для A равен 11.

  • Чтобы добраться до персонажа B сверху, нам нужно переместить 0 и 1.

  • Аналогично для C:

  • Для Д:

  • Для меня:

если мы посчитаем сейчас, нам нужно:

2 бита для хранения A, B и C. 3 бита для хранения D и I.

Таким образом, общий размер сообщения составляет (7*2)+(4*2)+(5*2)+(2*3)+(2*3) = 44 бита.

И 40 бит для 5 символов плюс 12 бит для отправки новых кодов.

Общий размер нового сообщения вместе с таблицей составляет 96 бит.

Это также называется кодом динамического размера.

Заключение:

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

В целом кодирование Хаффмана является полезным методом сжатия данных и может применяться в широком диапазоне приложений.