Другие языки программирования и технологии

Закодировать сообщения "AABCDAACCCCDBB", "КИБЕРНЕТИКИ" и "СИНЯЯ СИНЕВА СИНИ", вычислить длины в битах полученных кодов,

используя алгоритмы LZW. Сколько читал и искал, так и не понял как сделать Просьба помочь в решении или указать ответы Заранее спасибо!
А!
Андрей !
345
На примере первой строки:
0) Составить словарь:
----------
A = 00
B = 01
C = 10
D = 11
----------

1) Читаем 1-й символ строки и получаем код:
Буфер = [A]
Код A = 00
Результат = (nul)

2) Читаем следующий символ строки:
Буфер = [A]A
Такого значения в словаре нет. Делаем себе пометку: добавить АА в словарь.
Код А = 00
Результат = (00)
Сдвигаем буфер: [A]А <- сдвиг <- [A]
==========
Добавим в словарь: AA = 100.
Т. к. произошло увеличение разрядности словаря, то и всем остальным символам словаря нужно увеличить разрядность!
Новый словарь:
----------
A = 000
B = 001
C = 010
D = 011
AA = 100
----------

3) Очередной символ:
Буфер = [ A ]B
Такого значения в словаре нет. Делаем себе пометку: добавить АB в словарь.
Код A = 000
Результат = 00(000)
Сдвигаем буфер: [ A ]B <- сдвиг <- [ B ]
==========
Добавим в словарь: AB = 101.

4) Очередной символ:
Буфер = [ B ]C
Такого значения в словаре нет. Делаем себе пометку: добавить BC в словарь.
Код B = 001
Результат = 00000(001)
Сдвигаем буфер: [ B ]C <- сдвиг <- [ C ]
==========
Добавим в словарь: BC = 110.

5) Очередной символ:
Буфер = [ C ]D
Такого значения в словаре нет. Делаем себе пометку: добавить CD в словарь.
Код C = 010
Результат = 00000001(010)
Сдвигаем буфер: [ C ]D <- сдвиг <- [ D ]
==========
Добавим в словарь: CD = 111.

6) Очередной символ:
Буфер = [ D ]A
Такого значения в словаре нет. Делаем себе пометку: добавить DA в словарь.
Код D = 011
Результат = 00000001010(011)
Сдвигаем буфер: [ D ]A <- сдвиг <- [ A ]
==========
Добавим в словарь: DA = 1000.
Т. к. произошло увеличение разрядности словаря, то и всем остальным символам словаря нужно увеличить разрядность!
Новый словарь:
----------
A = 0000
B = 0001
C = 0010
D = 0011
AA = 0100
AB = 0101
BC = 0110
CD = 0111
DA = 1000
----------

7) Очередной символ:
Буфер = [ A ]A
Тут самое интересное!! !
Такое значение в словаре есть!
Буфер = [ AA ]

8) Очередной символ:
Буфер = [ AA ]C
Такого значения в словаре нет. Делаем себе пометку: добавить AAC в словарь.
Код AA = 0100
Результат = 00000001010011(0100)
Сдвигаем буфер: [ AA ]C <- сдвиг <- [ C ]
==========
Добавим в словарь: AAC = 1001.

8) Очередной символ:
Буфер = [ C ]C
Такого значения в словаре нет. Делаем себе пометку: добавить CC в словарь.
Код C = 0010
Результат = 000000010100110100(0010)
Сдвигаем буфер: [ C ]C <- сдвиг <- [ C ]
==========
Добавим в словарь: CC = 1010.

9) Очередной символ:
Буфер = [ C ]C
Такое значение в словаре есть!
Буфер = [ CC ]

10) Очередной символ:
Буфер = [ CC ]C
Такого значения в словаре нет. Делаем себе пометку: добавить CCC в словарь.
Код CC = 1010
Результат = 0000000101001101000010(1010)
Сдвигаем буфер: [ CC ]C <- сдвиг <- [ C ]
==========
Добавим в словарь: CCC = 1011.

11) Очередной символ:
Буфер = [ C ]D
Такое значение в словаре есть!
Буфер = [ CD ]

12) Очередной символ:
Буфер = [ CD ]B
Такого значения в словаре нет. Делаем себе пометку: добавить CDB в словарь.
Код CD = 0111
Результат = 00000001010011010000101010(0111)
Сдвигаем буфер: [ CD ]B <- сдвиг <- [ B ]
==========
Добавим в словарь: CDB = 1100.

13) Очередной символ:
Буфер = [ B ]B
Такого значения в словаре нет. Делаем себе пометку: добавить BB в словарь.
Код B = 0001
Результат = 000000010100110100001010100111(0001)
Сдвигаем буфер: [ B ]B <- сдвиг <- [ B ]

14) Последний символ:
Буфер = [ B ]
Код B = 0001
Результат = 0000000101001101000010101001110001(0001)

= = = = = = = = = = = = = = = = = = = = = =
Как-то так!
00000001010011010000101010011100010001
... если где-то не ошибся.. . ;-)
Руслан Хайруллин
Руслан Хайруллин
59 515
Лучший ответ