Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.10.2020
Сообщений: 5

Сжатие сообщений

19.11.2020, 10:54. Показов 1017. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На планете, где живет инопланетянин Лучик, вся информация передается в шестнадцатеричном виде. Любое битовое сообщение разбивается на блоки по 4 бита и преобразуется в символы от 0 до F (шестнадцатеричные цифры - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). Так как каналы связи очень нагружены, в системах связи используют сжатие данных.
В большинстве систем связи на планете при передаче текстовой информации используется следующий алгоритм сжатия. Исходный текст состоит из заглавных латинских букв от A до Z и пробелов. В процессе работы алгоритма используется упорядоченный словарь. Изначально он заполняется всеми возможными односимвольными последовательностями (буквы от A до Z и пробел). В процессе работы алгоритм посимвольно просматривает исходный текст и обрабатывает его следующим образом.

Записать в текущую фразу T первый символ.
Если исходные данные окончились, вывести код T.
Считать следующий символ Q.
Если фраза TQ есть в словаре, то T = TQ, перейти на шаг 2.
Если фразы TQ нет в словаре, то вывести код T, добавить TQ в словарь, присвоить T = Q и перейти на шаг 2.
Заметим что для разархивации (декодирования) получившийся словарь не нужен. Он легко формируется в процессе разархивации.
Кодом фразы считается порядковый номер этой фразы в словаре. Для удобства перевода в шестнадцатеричный вид коды предварительно записываются в двоичном виде с переменным числом бит. Рассмотрим это на примере.
Пусть исходное сообщение имеет вид
A BIG BLACK BUG BIT A BIG BLACK DOG
В нашем алфавите 27 букв (буквы от A до Z и пробел), поэтому для его кодирования достаточно 5 бит. Начальный словарь имеет вид
A = 00000
B = 00001
....
Z = 11001
(пробел) = 11010
Процесс архивации (кодирования) представлен в таблице ниже (символ “_“ обозначает пробел).
Тек. фразаКод на выходеНовая запись словаряКомментарий
A0 = 00000  
_26 = 1101027: A_ 
B1 = 0000128: _B 
I8 = 0100029: BI 
G6 = 0011030: IG 
_B28 = 1110031: G_далее используем 6-битные группы
L11 = 00101132: _BL 
A0 = 00000033: LA 
C2 = 00001034: AC 
K10 = 00101035: CK 
_B28 = 01110036: K_ 
U20 = 01010037: _BU 
G_31 = 01111138: UG 
BI29 = 01110139: G_B 
T19 = 01001140: BIT 
_26 = 01101041: T_ 
A_27 = 01101142: _A 
BI29 = 01110143: A_B 
G_B39 = 10011144: BIG 
LA33 = 10000145: G_BL 
CK35 = 10001146: LAC 
_26 = 01101047: CK_ 
D3 = 00001148: _D 
O14 = 00111049: DO 
G6 = 00011050: OG 
После таких несложных преобразований, сообщение вместо исходных 35 × 5 = 175 бит, стало занимать 6 × 5 + 19 × 6 = 144 бит. После преобразования к шестнадцатеричному виду заархивированное сообщение будет иметь вид (если длина итоговой последовательности бит не делится на 4, последовательность дополняется справа нулевыми битами)
06828370B00229C51F75369B767863683386
Процесс декодирования происходит аналогично. Единственным отличием является, то словарь заполняется в два этапа.
ДанныеНа выходеПолная новая записьЧастичная новая записьКомментарий
00000 = 0A 27: A? 
11010 = 26_27: A_28: _? 
00001 = 1B28: _B29: B? 
01000 = 8I29: BI30: I? 
00110 = 6G30: IG31: G? 
11100 = 28_B31: G_32: _B?далее используем 6-битные группы
001011 = 11L32: _BL33: L? 
000000 = 0A33: LA34: A? 
000010 = 2C34: AC35: C? 
001010 = 10K35: CK36: K? 
011100 = 28_B36: K_37: _B? 
010100 = 20U37: _BU38: U? 
011111 = 31G_38: UG39: G_? 
011101 = 29BI39: G_B40: BI? 
010011 = 19T40: BIT41: T? 
011010 = 26_41: T_42: _? 
011011 = 27A_42: _A43: A_? 
101000 = 40BI43: A_B44: BI? 
100111 = 39G_B44: BIG45: G_B? 
100001 = 33LA45: G_BL46: LA? 
100011 = 35CK46: LAC47: CK? 
011010 = 26_47: CK_48: _? 
000011 = 3D48: _D49: D? 
001110 = 14O49: DO50: O? 
000110 = 6G50: OG51: G? 
Некоторая проблема при декодировании возникает, когда новый код сразу оказывается в сообщении. Пусть мы расшифровываем сообщение ABABABA:
ДанныеНа выходеПолная новая записьЧастичная новая записьКомментарий
00000 = 0A 27: A? 
00001 = 1B27: AB28: B? 
11011 = 27AB28: BA29: AB? 
11101 = 29AB?29: AB? что с этим делать?
Кажется, это неразрешимая ситуация. Мы знаем наперёд, запись 29 означает ABA, но как алгоритм узнает об этом? Заметим, что запись 29 состоит из записи 27 плюс символ, идущий следующим. Значит запись 29 оканчивается на «символ, идущий следующим». Но, так как эта запись посылается сразу, то она должно начинаться с «символа, идущего следующим», и поэтому она оканчивается тем же символом, что и начинается, в данном случае - A. Это позволяет определить, что запись 29 — это ABA.
Группа путешественников, совершавшая Кругопланетную экспедицию, сбилась с пути и попала на заброшенную станцию. На ее центральный компьютер постоянно приходило одно и тоже сообщение, однако программное обеспечение, отвечающее за разархивацию данных, по странному стечению обстоятельств не работало. Помогите путешественникам понять, что содержится в этом странном сообщении – напишите программу, которая его разархивирует (декодирует).

Формат ввода
В единственной строке записана последовательность шестнадцатеричных цифр, длиной не более 105 – заархивированное сообщение.
Формат вывода
Выведите исходное сообщение до архивации.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2020, 10:54
Ответы с готовыми решениями:

Сжатие строки
# 3 функции нужны для стандартизации программ потом (буду использовать в других программах) def ReadArrInteger(n): L = for i in...

Сжатие строки
Питон изучаю не так давно, сейчас прохожу один курс, столкнулся с таким заданием, где нужно сжать строку по типу: Ввод: aaaabbcaa ...

Сжатие текста
Добрейшего вечера всем) Задача: сшить N-ое количество строк так, чтобы в выходной строке минимальной длины можно было найти эти строки. ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2020, 10:54
Помогаю со студенческими работами здесь

Сжатие символьного файла
Символьный файл содержит пробелы. Необходимо сжать этот файл (убрать пробелы) Вроде простая задачка, но вот с функциями Пайтона не особо...

Задача на сжатие строки
Добрый день, подскажите пожалуйста, как можно наиболее проще и наименьшим кодом решить данную задачу: Стандартное решение: message =...

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

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

Решение задачи на RLE-сжатие
RLE-сжатие – один из самых простых методов сжатия строки, основанный на сокращении подстрок, состоящих из одинаковых символов. Сжатие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru