
подготовка к экзамену 4 сем
.pdf
|
Оглавление |
|
1. |
кодирование информации .............................................................................................................................................................. |
1 |
2. |
равномерное/неравномерное кодирование символов ................................................................................................................. |
3 |
3. |
юникод и кодировки, содержащие utf, кодировку ascii .............................................................................................................. |
4 |
5.преобразование барроуза уильяра (bwt). обратное преобразование. эффективная реализация обратного преобразования.12
6.информация. энтропия. собственная энтропия. вероятностная модель источника сообщения. энтропийные
кодировщики. .................................................................................................................................................................................... |
14 |
|
7. |
алгоритм хаффмана. статический и динамический алгоритмы. канонические коды хаффмана. ......................................... |
17 |
8. |
арифметическое кодирование. арифметическое кодирование на длинном целом. ............................................................... |
26 |
9. |
преобразование движения к началу (mtf). .................................................................................................................................. |
29 |
10. |
неравенство крафта-макмиллана. неравенство йенсена. доказательство ограничения снизу средней длины разделимых |
|
кодов энтропией. ............................................................................................................................................................................... |
31 |
|
11. lz77, lz78 ....................................................................................................................................................................................... |
34 |
|
12. |
суффиксный массив. связь суффиксного массива и матрицы барроза-уиллера, альгоритм sa-is. ..................................... |
36 |
13. |
граф, ориентированный граф. способы хранения графа. ........................................................................................................ |
40 |
14. |
быстрое возведение в степень. модульная арифметика. нахождение свободного времени по имени поул н. ................. |
43 |
15. |
алгоритм генерация ключей для rsa. ......................................................................................................................................... |
49 |
16. |
процедура шифрования/расшифровки rsa. доказательство корректности ............................................................................ |
53 |
1.
КОДИРОВАНИЕ
ИНФОРМАЦИИ
ПРЕЗА СТИВЕНА Символ – это элемент алфавита, из которого составляется сообщение.
Алфавит Σ – множество всех символов
Сообщение – элемент множества Σ* Код – числовое представление символа, которое удобно для хранения/передачи/обработки
Чуть более формально: c: Σ→Ω где Ω – кодовый алфавит, ω Ω – код (кодовое
слово).
В нашем случае код – битовая строка: c: Σ→{0,1}
Пример: c(A)=11010111_2
Кодирование -процесс присваивания символов кодов, то есть выбор какой-то конкретной функции c.
ТЕПЕРЬ ИНФОРМАЦИЯ ИЗ ДРУГИХ ИСТОЧНИКОВ
Кодирование информации(англ.
Information coding)
—
отображение
данных
на
кодовые слова. Пусть u — множество исходных символов, z — кодовый алфавит, z — множество всех строк
конечной
длины
из
z.
(короче,
то
же
самое,
только
буковки
другие)
Код (англ. Code) — отображение c:U→z* и c :U →z так,
что c (x1x2...xn)=c(x1)c(x2)..c(xn)
Примеры кодов
Ascii — блочный.
Код хаффмана (англ. Huffman code) — префиксный.
Азбука морзе — не является ни блочным, ни префиксным, тем не менее, однозначно декодируемый засчет использования пауз.
Префиксный код — код, в котором, никакое кодовое слово не является началом другого. Аналогично, можно определить постфиксный код — это код, в котором никакое кодовое слово не является концом другого.
Все вышеперечисленные коды являются однозначно декодируемыми — для такого кода любое слово, составленное из кодовых слов, можно декодировать только единственным способом.
Изначальное кодирование

Перекодирование
Не знаю, надо или нет...
Основные методы кодирования
1. Безусловное кодирование Безусловное кодирование — это метод кодирования данных, в котором каждому символу или
значению присваивается определенный уникальный код, который не зависит от содержания информации. Этот метод включает в себя простые коды, такие как бинарный код, ASCII код, и т. д. Бинарный код — это двоичная система кодирования, где каждый символ или число представлены битами '0' и '1'. ASCII код — это таблица, которая содержит набор символов для представления текстовых значений.
Пример кода для бинарного кодирования: def decimal_to_binary(decimal_num):
binary_num = bin(decimal_num) return binary_num[2:]
result = decimal_to_binary(10) print(result) # Output: 1010
2. Условное кодирование
Условное кодирование — это метод bкодирования данных, в котором каждый символ или значение имеет сложный код, который зависит от содержания информации. Этот метод включает в себя арифметическое кодирование, Хаффмана кодирование, и т. д. Арифметическое кодирование — это метод, который закодирует каждый символ в последовательность цифр от 0 до 1, которые представляют вероятность появления символа в сообщении.
Пример кода для арифметического кодирования: def arithmetic_encoding(data):
freq_dict = {}

for char in data:
freq_dict[char] = freq_dict.get(char, 0) + 1
prob_dict = {char: freq_dict[char]/len(data) for char in freq_dict} low, high = 0.0, 1.0
for char in data: range_width = high - low
high = low + range_width * prob_dict[char]
low = low + range_width * sum(prob_dict[c] for c in prob_dict if c < char) return (high + low) / 2
result = arithmetic_encoding('hello') print(result) # Output: 0.625
3. Блочное кодирование Блочное кодирование — это метод кодирования данных, в котором информация разбивается на
блоки определенного размера, и каждый блок кодируется независимо от других. Этот метод включает в себя код Хэмминга, код Рида-Соломона, и т. д. Код Хэмминга — это метод, который добавляет дополнительный бит в сообщение, чтобы обеспечить коррекцию ошибок.
Пример кода для кодирования сообщения с помощью кода Хэмминга: def hamming_encode(data):
n = len(data)
k = 2**int(math.log(n, 2)) - int(math.log(n, 2)) - 1 r = n - k
encoded_data = "" for i in range(r):
encoded_data += '0' for i in range(1, n + 1):
if not math.log(i, 2).is_integer(): encoded_data += data[i - 1]
for i in range(1, r + 1): pos = 2**(i - 1) count = 0
for j in range(1, n + 1): if j & pos == pos:
count ^= int(data[j - 1]) encoded_data += str(count)
return encoded_data
result = hamming_encode('0101') print(result) # Output: 0110001
2.РАВНОМЕРНОЕ/НЕРАВНОМЕРНОЕ
КОДИРОВАНИЕ
СИМВОЛОВ
Равномерное кодирование
Код фиксированной длины (англ. Fixed-length code) — кодирование каждого символа производится с помощью строк одинаковой длины. Также он называется равномерным или блоковым кодом.
Преза:
Алфавит - Σ={A,B,C,D,E,…}
Мощность алфавита |Σ|=N Выбрать такое M, что N≤2^M C:Σ→{0,…,N−1}

N=30
C(E)=4=00100_2
Неравномерное кодирование
Вики: Код переменной длины (англ. Variable-length code) — кодирование производится с помощью строк переменной длины. Также называется неравномерным кодом.
Преза: Заголовочная часть
Первые n бит отводятся на запись длины символа. Пример – utf-8
Префиксные коды
Ни один из кодов не является префиксом другого кода
Пример:
{10, 01, 001, 11} - префиксный код {10, 01, 010, 11} – не префиксный код {10, 01, 100, 11} - суффиксный код
Примеры:
Ascii – равномерное кодирование 7-битным кодом Extended ascii – равномерное кодирование 8-битным кодом
Utf-8 – кодирование кодом переменной длины от 1 до 4 байт
Перекодирование
Сжатие – в среднем коды символов становятся короче Помехоустойчивое кодирование – в среднем коды символов становятся длиннее, но становится возможным исправлять ошибки при передаче информации
Шифрование – в среднем коды символов остаются такими же, но перемешиваются между собой.
3.ЮНИКОД
И
КОДИРОВКИ,
СОДЕРЖАЩИЕ
UTF,
КОДИРОВКУ
ASCII
Unicode
Юнико́д (Unicode) — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.
Создание и развитие Unicode
Стандарт состоит из двух основных частей: универсального набора символов (англ. Universal character set, UCS) и семейства кодировок (англ. Unicode transformation format, UTF). Универсальный набор символов перечисляет допустимые по стандарту Юникод символы и присваивает каждому символу код в виде неотрицательного целого числа, записываемого обычно в шестнадцатеричной форме с префиксом U+, например, U+040F. Семейство кодировок определяет способы преобразования кодов символов для передачи в потоке или в файле.
Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII, и коды этих символов совпадают с их кодами в ASCII. Далее расположены области символов других систем письменности, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от
U+A640 до U+A69F.
Проблемы других кодировок:
Неправильная раскодировка
Ограниченность набора символов
Проблема преобразования одной кодировки в другую
Проблема дублирования шрифтов
Первая версия Юникода: фиксированный размер символа 16 бит (общее число кодов 216 = 65536). Символы стали обозначать четырьмя шестнадцатеричными цифрами (например, U+04F0).
Со временем было принято решение расширить кодовую область и коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа, которые в компьютере могут представляться множеством разных способов. (Эти способы представления как раз и есть разновидности UTF).
Поскольку в ряде компьютерных систем фиксированные 16-битные символы уже использовались в качестве кодировки по умолчанию, было решено все наиболее важные знаки кодировать только в пределах первых 65 536 позиций.
Для совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65 536 позиций, за исключением позиций из интервала U+D800…U+DFFF, отображаются непосредственно как 16-битные числа, а остальные представляются в виде «суррогатных пар» (первый элемент пары из области U+D800…U+DBFF, второй элемент пары из области U+DC00…U+DFFF). Для суррогатных пар была использована часть кодового пространства (2048 позиций), отведённого «для частного использования».
Поскольку в UTF-16 можно отобразить только 220+216−2048 (1 112 064) символов, то это число и было выбрано в качестве окончательной величины кодового пространства Юникода
(диапазон кодов: 0x000000-0x10FFFF).
Хотя кодовая область Юникода была расширена за пределы 216 уже в версии 2.0, первые символы в «верхней» области были размещены только в версии 3.1.
Кодовое пространство
Хотя форма записи UTF-8 позволяет кодировать до 221 (2 097 152) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, этого в данный момент достаточно — в версии 15.1 используется всего 149 878 кодовых позиций.
Кодовое пространство разбито на 17 плоскостей по 216 (65 536) символов. Нулевая плоскость называется базовой и содержит символы наиболее употребительных письменностей. Остальные плоскости — дополнительные.
Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов 0…FFFF),
или «U+xxxxx» (для кодов 10000…FFFFF), или «U+xxxxxx» (для кодов 100000…10FFFF), где xxx —
шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код 044F16 = 110310.
Система кодирования
Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.
Общие принципы:
Гарантия стабильности (как только символ появился в кодировке, он не сдвинется и не исчезнет)
Динамическая компоновка (иногда для удобства делают и монолитные символы, но в целом A + ¨ = Ä)
Логический порядок (символы в строке записываются приблизительно в порядке прочтения)
Преобразуемость
Простой текст (юникод кодирует простой текст без оформления)
Семантика (свойства символов задаются формально, с помощью формата CSV)
Символы, а не глифы (Символ — единица смысла. Глиф — изображение, содержащееся в шрифте и выводящееся на экран/печать)
Универсальность
Унификация (юникод старается не дублировать символы. Так, английская буква «вай», французская «игрек» и немецкая «ипсилон» — одна и та же кодовая позиция Y)
Эффективность

Кодировки семейства UTF
Юникод имеет несколько форм представления (англ. Unicode transformation format, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт.
UTF-8
UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-
бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII.
Алгоритм кодирования:
1.Определить количество октетов (байтов), требуемых для кодирования символа. Номер символа берётся из стандарта Юникода.
2.Установить старшие биты первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:
0xxxxxxx — если для кодирования потребуется один октет; 110xxxxx — если для кодирования потребуется два октета; 1110xxxx — если для кодирования потребуется три октета; 11110xxx — если для кодирования потребуется четыре октета.
Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 102 (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 102.
3. Установить значащие биты октетов в соответствии с номером символа Юникода, выраженном в двоичном виде. Начать заполнение с младших битов номера символа, поставив

их в младшие биты последнего октета, продолжить справа налево до первого октета. Свободные биты первого октета, оставшиеся незадействованными, заполнить нулями.
Маркер UTF-8
Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен маркер последовательности байтов (англ. Byte order mark, BOM), который в случае кодирования в UTF-8 принимает форму трёх байтов: EF BB BF16.
UTF-16
UTF-16 (англ. Unicode Transformation Format, 16-bit) в информатике — метод сериализации юникодного текста (то есть последовательности кодовых позиций Юникода) в последовательность 16-битных слов.
Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (последнее называется суррогатная пара).
UTF-16 хранит каждый символ Unicode в 1 или 2 16-битных единицах. В следующей таблице показано, как распределяются диапазоны скалярных значений в UTF-16:
Принцип кодирования:
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в диапазонах 000016..D7FF16 и E00016..FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16битными словами.
Символы Unicode до FFFF16 включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом.
Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) кодируются по следующей схеме:
Из кода символа вычитается 1000016. В результате получится значение от нуля до FFFFF16, которое помещается в разрядную сетку 20 бит.
Старшие 10 бит (число в диапазоне 000016..03FF16) суммируются с D80016, и результат идёт в ведущее (первое) слово, которое входит в диапазон D80016..DBFF16.
Младшие 10 бит (тоже число в диапазоне 000016..03FF16) суммируются с DC0016, и результат идёт в последующее (второе) слово, которое входит в диапазон DC0016..DFFF16.

Порядок байтов
Для определения порядка байтов используется метка порядка байтов (англ. Byte order mark). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный (little endian), поскольку код U+FFFE в Юникоде не кодирует символ и зарезервирован как раз для целей определения порядка байтов. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8.
UTF-32
UTF-32 (англ. Unicode Transformation Format) в информатике — один из способов кодирования символов Юникода, использующий для кодирования любого символа ровно 32 бита. Остальные кодировки, UTF-8 и UTF-16, используют для представления символов переменное число байтов. Символ UTF-32 является прямым представлением его кодовой позиции.
UTF-32 представляет каждый символ Unicode в одном 32-битной единице. В следующей ниже показано, как распределяются диапазоны скалярных значений в UTF-32:
Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод непосредственно индексируемы. Получение n-ой кодовой позиции является операцией, занимающей одинаковое время. Напротив, коды с переменной длиной требует последовательного доступа к n-ой кодовой позиции. Это делает замену символов в строках UTF-32 простой, для этого используется целое число в качестве индекса, как обычно делается для строк ASCII.
Главный недостаток UTF-32 — это неэффективное использование пространства, так как для хранения символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства, редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства, не оправдано.
UTF-32 применяется, главным образом, не в строках символов, а во внутренних API, где данные являются единственной кодовой позицией или глифом. Например, при прорисовке текста на последнем шаге происходит построение списка структур, каждая из которых включает в себя позиции x и у, атрибуты и единственный символ UTF-32, идентифицирующий глиф для прорисовки. Часто в «неиспользуемых» 11 битах каждого 32-битного символа хранится посторонняя информация.
Стандарт HTML5 гласит, что «авторы не должны использовать UTF-32, поскольку алгоритмы определения кодировки, описанные в данной спецификации, не отличают его от UTF-16».
Кодировка ASCII
ASCII — это таблица кодировки символов, в которой каждой букве, числу или знаку соответствует определенное число. В стандартной таблице ASCII 128 символов, пронумерованных от 0 до 127. В них входят латинские буквы, цифры, знаки препинания и управляющие символы.

Таблица восьмибитная, а числа, которые соответствуют символам, переводятся в двоичный код, чтобы компьютер мог их распознавать.
ASCII появилась раньше Юникода и включает в себя меньше символов. В стандартной таблице их всего 128, если не считать расширений для других языков. А в «Юникоде», который реализуют кодировки UTF-8 и UTF-32, сейчас 2²¹ символов — это больше чем два миллиона. В набор входят практически все существующие сегодня символы, он очень широкий.
Unicode можно рассматривать как «продолжение», расширение ASCII. Первые 128 символов в «Юникоде» кодируются так же, как в ASCII, и это те же самые символы.
Статья на Хабре, если нужны более подробные вещи про ASCII - https://habr.com/ru/companies/ruvds/articles/548672/
Расширенная кодировка ASCII
Расширенная кодировка ASCII, также известная как Extended ASCII, — это 8-битная кодировка символов, которая расширяет стандартный 7-битный ASCII. Она позволяет представить 256 различных символов, в отличие от стандартного ASCII, который поддерживает 128 символов.
Существуют разные варианты расширенного ASCII, например, ISO 8859-1 (Latin-1) и Windows-1252, которые дополняют базовый набор символов ASCII.
Расширенный ASCII полезен для работы с текстом на разных языках, а также при создании программ, где требуется отображение специальных символов.
4. RUN-LENGTH ENCODING. ПРИМЕНЕНИЕ К БИНАРНЫМ/ТЕКСТОВЫМ ФАЙЛАМ, ИЗОБРАЖЕНИЯМ
