Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование и информатика / ТОИ / Основы комбинаторики и кодирования

.doc
Скачиваний:
72
Добавлен:
03.01.2020
Размер:
261.12 Кб
Скачать

IV) Кодирование. Элементы комбинаторики и теории вероятностей.

Представление информации в ЭВМ отличается от привычной человеку формы. Текст, звук, изображение – все это сигналы физической природы, имеющие свою гамму и палитру оттенков. Для звука это диапазон воспроизводимых частот и тембр, с которым озвучивается информация. Для изображения это палитра оттенков, при помощи которой художник отразил на картине красивый пейзаж. Для текста это алфавит, состоящий из букв определенного языка, на котором общаются между собой люди. Весь спектр частот, оттенков, букв – все это элементы кодирования информации в определенной среде ее хранения или распространения.

Коды появились еще в глубокой древности в форме криптограмм (по-гречески – тайнописи), когда ими пользовались для засекречивания важного сообщения от тех, кому оно не было предназначено. Например, спартанцы имели специальный механический прибор, при помощи которого важные сообщения можно было писать особым способом, обеспечивающим сохранение тайны. Собственная секретная азбука была у Юлия Цезаря. В средние века и эпоху Возрождения над изобретением тайных шифров трудились многие выдающиеся люди, в их числе философ Фрэнсис Бэкон, крупные математики Франсуа Виет, Джероламо Кардано, Джон Валлис. С течением времени начали появляться по-настоящему сложные шифры. Один из них, употребляемый и поныне, связан с именем ученого аббата из Вюрцбурга Тритемиуса, которого к занятиям криптографией побуждало, быть может, не только монастырское уединение, но и потребность сохранять от огласки некоторые духовные тайны. Различные хитроумные приемы кодирования применяли шифровальщики при папском дворе и дворах европейских королей. Вместе с искусством шифрования развивалось и искусство дешифровки, или, как говорят, криптоанализа.

Секретные шифры являются неотъемлемой принадлежностью многих детективных романов, в которых действуют изощренные в хитрости шпионы. Однако для современных потребностей информатики важной задачей является передача сообщений по линиям связи, при решении которой на первый план выходит отнюдь не засекречивание сообщений, а иная цель: сделать передачу сообщений быстрой, удобной и надежной. Предназначенное для этой цели кодирующее устройство сопоставляет каждому символу передаваемого текста (гармонике в составе звука, оттенку в составе изображения), а иногда и целым словам или фразам определенную комбинацию сигналов (приемлемую для среды канала связи), называемую кодом или кодовым словом. При этом операцию перевода сообщений в определенные последовательности сигналов называют кодированием, а обратную операцию, восстанавливающую по принятым сигналам (кодовым словам) передаваемого сообщения, – декодированием. Другими словами, кодирование – это запись сообщения в системе знаков исходного алфавита через систему знаков другого алфавита. Представим кодирование как некоторую функцию, в результате вычисления которой получается закодированное сообщение b из исходного сообщения a, путем преобразованием знаков исходного алфавита A через другой алфавит B: . Тогда декодирование – это восстановление сообщения из записи в системе знаков одного алфавита средствами системы знаков исходного алфавита. Также запишем процесс декодирования через функцию: .

Исторически первый код, предназначенный для передачи сообщений, связан с именем изобретателя телеграфного аппарата Сэмюэля Морзе и известен всем как азбука Морзе. В этом коде каждой букве или цифре сопоставляется своя последовательность из кратковременных (называемых точкой) и длительных (тире) импульсов тока, разделяемых паузами. Также примером является известный алфавит Брайля, используемый в книгопечатании изданий для людей с ослабленным зрением. Книга имеет страницы из плотной бумаги, на которой выдавлены точки. Каждое сочетание из 6 точек представляет собой некоторый знак алфавита. Проводя пальцами рук по такой странице, люди с ослабленным зрением имеют возможность читать. Другой код, столь же широко распространенный в телеграфии (код Бодо), использует для кодирования два элементарных сигнала – импульс и паузу, при этом сопоставляемые буквам кодовые слова состоят из пяти таких сигналов . Коды, использующие два различных элементарных сигнала, называются двоичными кодами. Удобно обозначать эти два сигнала символами 0 и 1, отвлекаясь тем самым от их физической природы. Тогда кодовые слова можно представлять как последовательности из нулей и единиц. Двоичное кодирование тесно связано с принципом дихотомии (деления пополам).

Рассмотрим пример, некто задумал число, заключенное между 0 и 7. Угадывающему разрешено задавать вопросы, ответы на которые даются лишь в форме "да" или "нет". Самый быстрый и простой способ – перебирать числа в произвольном порядке, надеясь на удачу. В этом случае при везении может хватить и одного вопроса, но если не повезет, то может потребоваться и целых семь. Построим такую систему вопросов, чтобы любой из ответов – "да" или "нет" – давал одинаковую (пусть поначалу и неполную) информацию о задуманном числе. Например, первый вопрос может быть таким: "Заключено ли задуманное число в диапазоне от 0 до 3?" Оба ответа одинаково приблизят к цели: в любом случае остаются четыре возможности для неизвестного числа (первоначально их было восемь).

Если на первый вопрос получен утвердительный ответ, то во второй раз можно спросить: "Не является ли задуманное число нулем или единицей?"; если же ответ был отрицательным, спросим: "Не является ли задуманное число четверкой или пятеркой?" В любом случае после ответа на второй вопрос останется выбор из двух возможностей. Для того чтобы его осуществить, достаточно одного вопроса. Таким образом, для угадывания числа достаточно трех вопросов.

Если возможные ответы "да" или "нет" обозначить условно 0 и 1, то ответы запишутся в виде последовательности, состоящей из нулей и единиц. Так, например, если задуманное число было нулем, то на каждый из трех вопросов ответом будет "да". Трем "да" соответствует последовательность 000.

Если было задумано число 3, то ответами будут "да", "нет", "нет", что соответствует последовательности 011. По результатам ответов можно составить следующую таблицу:

Задуманное число

0

1

2

3

4

5

6

7

Ответы

000

001

010

011

100

101

110

111

Вместо множества чисел от 0 до 7 можно рассматривать любое другое множество, состоящее из восьми сообщений, и каждое из них можно закодировать последовательностями из нулей и единиц длины 3 знака. Если использовать более длинные двоичные последовательности, то ими можно закодировать любое конечное множество сообщений. M сообщений можно закодировать двоичными последовательностями длины n тогда и только тогда, когда выполняется условие или .

Первый, кто понял, что для кодирования достаточно двух символов, был Фрэнсис Бэкон. Двоичный код, который он использовал в криптографических целях, содержал пятиразрядные (как и в коде Бодо) слова, составленные из символов 0, L. Однако наряду с двоичными кодами применяют коды, использующие не два, а большее число элементарных сигналов, или, как их еще называют, кодовых символов. Их число d называют основание кода, а множество кодовых символов – кодовым алфавитом. При этом общее число n-буквенных слов, использующих d символов, вычисляется как . Если взять привычную нам десятичную систему счисления с основанием кода 10, то в качестве кодового алфавита выступает набор цифр от 0 до 9. При записи количественной меры, когда число знаков алфавита не позволяет с помощью одного кодового символа записать числовую характеристику, в составе кодового слова добавляется еще один знак в соседней слева позиции. Цифра справа означает количество единиц, а слева – количество десятков. Как только задаваемый диапазон становится исчерпанным, добавляется еще один знак слева, занимающий дополнительную позицию в составе кодового слова, которая называется разрядом и означает сотни . Добавленный разряд расширяет диапазон значений в кодовом слове от 000 до 999. По тому же принципу в двоичном кодировании каждый разряд, а нумерацию разрядов принято начинать с 0, соответствует определенной составляющей в количественной мере числа, которая соответствует . Так разряд на 0 позиции в двоичном коде измеряет единицы, разряд под номером 1 – двойки, 2 разряд соответствует четверкам, 3 разряд – восьмеркам и так далее. Система счисления, в которой за основание d принято значение 2, называется двоичной системой счисления. Также в информатике приняты к использованию восьмеричная и шестнадцатеричная системы счисления.

В шестнадцатеричной системе счисления к цифровым знакам добавлены буквы латинского алфавита A, B, C, D, E, F, за которыми закреплены значения 10, 11, 12, 13, 14, 15 соответственно. Для кодирования десятичного числа в двоичном коде (перехода от используемой системы счислений в кодовом слове a к b с основанием кода ) можно раскрыть содержание функции кодирования так:

Опишем вычислительные действия по шагам на примере. Число 25 из десятичной системы счисления необходимо закодировать в двоичном коде. Выполняем операцию деления "столбиком" нацело с остатком по приведенной выше схеме. Результат состоит из знаков остатка операции деления и собирается поразрядно справа налево, начиная с результата последней операции, то есть согласно схеме .

25

2

12*2

12

2

1

6*2

6

2

0

3*2

3

2

0

1*2

1

1

В результате выполнения вычислений получаем ответ 2510=110012.

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

.

Результат дробной части кодового слова будет равен .

Рассмотрим пример. Необходимо представить в двоичном коде дробное десятичное число 0,25. Следуя вышеприведенной схеме расчетов, выполняем действия умножения на основание требуемой системы счисления .

0,25*2=0,5

0,5*2=1,0

В результате произведенных операций собираем разряды дробной части двоичного кода. Получаем ответ 0,2510=0,012.

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

Рассмотрим пример. Необходимо декодировать из восьмеричного кода в десятичный код число 25,25. Воспользуемся формулой декодирования, которая раскрыта выше.

25,258=2*8+5+2*8-1+5*8-2=16+5+1/4+5/64=21+0,25+0,078125=21,32812510

Следует отметить, что при кодировании или декодировании, если основание результирующего кода больше исходного, то запись получаемого кода будет представлена в меньшем количестве знаков (разрядов).

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

С аналогичными задачами, получившими название комбинаторных, люди столкнулись в глубокой древности. Уже несколько тысячелетий назад в Древнем Китае увлекались составлением магических квадратов, в которых заданные числа располагались так, что их сумма по всем горизонталям, вертикалям и главным диагоналям была одной и той же. В Древней Греции подсчитывали число различных комбинаций длинных и коротких слогов в стихотворных размерах, занимались теорией фигурных чисел, изучали фигуры, которые можно составить из частей особым образом разрезанного квадрата.

Комбинаторика – раздел математики, в котором изучаются вопросы о том, сколько различных комбинаций, подчиненных тем или иным условиям, можно составить из заданных объектов. Комбинаторные задачи возникали и в связи с такими настольными играми, как шашки, шахматы, домино, карты, кости. Например, задача о расстановке восьми ферзей на шахматной доске так, чтобы ни один из них не оказался под боем, об обходе всех полей доски шахматным конем. Однако, комбинаторика становится наукой лишь в XVII веке, в период, когда возникла теория вероятностей. Чтобы решать теоретико-вероятностные задачи, нужно было уметь подсчитывать число различных комбинаций, подчиненных тем или иным условиям. После первых работ, выполненных в XVI веке итальянскими учеными Джероламо Кардано, Никколо Тартальей и Галилео Галилеем, такие задачи изучали французские математики Блез Паскаль и Пьер Ферма. Первым рассматривал комбинаторику как самостоятельную ветвь науки немецкий философ и математик Готфрид Лейбниц. Замечательные достижения в области комбинаторики принадлежат Леонарду Эйлеру.

Комбинаторными задачами интересовались и математики, занимавшиеся составлением и разгадыванием шифров, изучением древних письменностей. Сейчас комбинаторика находит приложения во многих областях науки: в биологии, где она применяется для изучения состава белков и ДНК, в химии, механике сложных сооружений. По мере развития комбинаторики выяснилось, что, несмотря на внешнее различие изучаемых ею вопросов, многие из них имеют одно и то же математическое содержание и сводятся к задачам о конечных множествах и их подмножествах. Так, француз де Мере многократно наблюдая игру в кости подметил, что при одновременном бросании трех игральных костей более часто выпадает комбинация, дающая в сумме 11 очков, чем комбинация, дающая в сумме 12 очков, хотя, с его точки зрения, эти комбинации были равновероятны. В математике мерой частоты появления того или иного события является его вероятность. Вероятность наступления события A обозначают обычно через префиксную форму P(A) или просто буквой P. Вероятность наступления некоторого события можно представить как долю тех случаев в которых оно происходит (фиксируется), от общего числа наступивших (предполагаемых) событий. Де Мере рассуждал следующим образом: 11 очков можно получить шестью различными способами (6-4-1, 6-3-2, 5-5-1, 5-4-2, 4-4-3) и столькими же способами моно получить 12 очков (6-5-1, 6-4-2, 6-3-3, 5-5-2, 5-4-3, 4-4-4), а равенство числа исходов, в результате которых наступают соответствующие события A11 и A12, означает равенство их вероятностей P(A11) и P(A12).

Ошибка де Мере была указана впоследствии Паскалем. Она заключалась в том, что рассматриваемые де Мере исходы вовсе не равновероятны. Нужно учитывать не только выпадающие очки, но и то, на каких именно костях они выпали. Например, пронумеровав кости и выписывая выпадающие очки в соответствующей последовательности, видно, что комбинация 6-4-1 выпадает, когда наступает один из шести исходов 6-4-1, 6-1-4, 4-6-1, 4-1-6, 1-6-4, 1-4-6, а комбинация 4-4-4 выпадает лишь при одном единственном исходе. Равновероятными в данном опыте являются исходы, описываемые тройками чисел a-b-c, где а – число очков на первой кости, b – число очков на второй кости, c – число очков на третьей кости. Нетрудно подсчитать, что всего имеется N=mn=63=216 равновероятных исходов. Из них событию A11 – "сумма выпавших очков равна 11" – благоприятствуют N(A11)=27 исходов, а событию A12 – "сумма выпавших очков равна 12" – благоприятствует лишь N(A12)=25 исходов. Это и объясняет подмеченную де Мере тенденцию к более частому выпадению 11 очков.

При подсчете вероятностей большую пользу оказывают комбинаторные формулы. Одна из них описывает количество комбинаций элементов, выбираемых из различных групп. Пусть имеется r различных групп, состоящих из каких-либо элементов. Первая группа содержит n1 элементов , , …, , вторая содержит n2 элементов , , …, , последняя r-я группа содержит nr элементов , , …, . Составляются всевозможные комбинации из r элементов, принадлежащих различным группам, так что в отдельную комбинацию входит лишь по одному элементу из каждой группы. Комбинации a-b-…-c и --…- считаются различными, если имеется хотя бы одна пара различных между собой элементов a и , b и , …, c и . Число всех таких комбинаций есть .

Пример. Найти вероятность того, что при бросании трех игральных костей выпадает максимальное количество очков.

Если обозначить через a, b и c соответствующие очки на первой, второй и третьей костях, то результат бросания можно описать упорядоченной тройкой чисел a-b-c, каждое из которых выбирается из своей "группы" (принадлежит определенной кости) и пробегает значения от 1 до 6. Таким образом, в каждой из трех "групп" имеется 6 "элементов", и всего насчитывается N=mn=63=216 всевозможных исходов a-b-c. Все они равновероятны, а максимальное количество очков a+b+c=18 выпадает лишь при одном единственном исходе, когда a=b=c=6. Поэтому искомая вероятность равна 1/216.

Выбор с возвращением представляет еще один вид комбинаторной формулы. Пусть имеется некоторая совокупность n различных предметов a1, a2, …, an. Из этой совокупности последовательно выбирается r предметов таким образом, что каждый выбранный предмет фиксируется и возвращается обратно. Результатом такого выбора является комбинация вида --…-. Комбинации --…- и --…- считаются различными, если на каком-либо шаге были выбраны разные предметы, то есть , хотя бы при одном k. Можно представить себе, что имеется r одинаковых групп по n элементов в каждой и на каждом k-м шаге выбирается элемент из k-й группы. Получаем выражение для числа N различных комбинаций: N=nr.

Число размещений или выбор без возвращения является еще одной комбинаторной формулой. Предположим, что r различных предметов размещаются по некоторым ячейкам. При этом ячейки различимы для наблюдателя и число их равно n. Предположим, что предметы размещаются таким образом, что в каждую ячейку попадает не более одного предмета. Пронумеруем все имеющиеся предметы и ячейки. Тогда каждое размещение можно описать комбинацией вида (i1, i2, …, ir), где i1 – номер ячейки в которую попадает 1-й предмет, i2 – номер ячейки, в которую попадает 2-й предмет, ir – номер ячейки, в которую попадает r-й предмет. В комбинации (i1, i2, …, ir) i1 – один из n элементов (ячеек), i2 – один из n-1 оставшихся элементов, ir – один из n-r+1 возможных элементов. Всего существует различных размещений r предметов по n ячейкам.