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

Дискретная математика и теория алгоритмов. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Механико-математический факультет

Н. Т. Когабаев

ДИСКРЕТНАЯ МАТЕМАТИКА И ТЕОРИЯ АЛГОРИТМОВ

Учебное пособие

Новосибирск

2023

УДК 510.5+519.1 (075) ББК В127я73-1 К 570

Рецензент канд. физ.-мат. наук С. С. Оспичев

Когабаев, Н. Т.

К570 Дискретная математика и теория алгоритмов : учеб. пособие / Н. Т. Когабаев ; Новосиб. гос. ун-т. — Новосибирск : ИПЦ НГУ, 2023. — 126 с.

ISBN 978-5-4437-1324-3

В настоящем учебном пособии изложены математические основы теории алгоритмов. Пособие отражает содержание лекций основного курса «Дискретная математика и теория алгоритмов» для студентов 1-го курса механико-математического факультета НГУ и охватывает материал из нескольких областей математики, так или иначе связанных с понятием алгоритма: алгоритмы на графах и их временн´ая сложность, теория автоматов и регулярных языков, формальные грамматики, машины Тьюринга и частично рекурсивные функции, классическая теория вычислимости.

Предназначено для студентов 1-го курса механико-математического факультета НГУ, изучающих курс «Дискретная математика и теория алгоритмов», а также для всех желающих познакомиться с основами упомянутых в пособии математических теорий.

УДК 510.5+519.1 (075) ББК В127я73-1

 

© Новосибирский государственный

ISBN 978-5-4437-1324-3

университет, 2023

Оглавление

Глава I. Предварительные сведения

4

§ 1.

Некоторые аксиомы теории множеств . . . . . . . . . . . . . . . . . . . .

4

§ 2.

Время работы алгоритмов и сортировки чисел . . . . . . . . . . . . . .

8

Глава II. Алгоритмы для работы с графами

15

§ 3.

Базовые понятия теории графов . . . . . . . . . . . . . . . . . . . . . . .

15

§ 4.

Поиск в ширину . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

§ 5.

Поиск в глубину . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

§6. Алгоритм Дейкстры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

§7. Алгоритм Крускала . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Глава III. Конечные автоматы и формальные грамматики

49

§8. Алфавиты и формальные языки . . . . . . . . . . . . . . . . . . . . . . . 49

§9. Детерминированные конечные автоматы . . . . . . . . . . . . . . . . . . 51

§10. Недетерминированные конечные автоматы . . . . . . . . . . . . . . . . . 54

§ 11. Недетерминированные конечные автоматы с пустыми переходами . . .

58

§ 12. Свойства автоматных языков . . . . . . . . . . . . . . . . . . . . . . . .

65

§ 13. Регулярные выражения и языки . . . . . . . . . . . . . . . . . . . . . . .

70

§ 14. Формальные грамматики . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

Глава IV. Формализации понятия вычислимой функции

82

§ 15.

Определение машины Тьюринга . . . . . . . . . . . . . . . . . . . . . . .

82

§ 16.

Базовые машины Тьюринга . . . . . . . . . . . . . . . . . . . . . . . . .

85

§ 17.

Частично рекурсивные функции . . . . . . . . . . . . . . . . . . . . . . .

89

§ 18.

Рекурсивность некоторых функций и отношений . . . . . . . . . . . . .

96

§19. Кодирование машин Тьюринга . . . . . . . . . . . . . . . . . . . . . . . . 102

§20. Машины Тьюринга vs частично рекурсивные функции . . . . . . . . . . 107

§ 21.

Универсальные функции . . . . . . . . . . . . . . . .

. . . . . . . . . . . 109

Глава V. Теория вычислимости

 

113

§ 22.

Теорема о параметризации . . . . . . . . . . . . . . .

. . . . . . . . . . . 113

§ 23.

Теорема о неподвижной точке . . . . . . . . . . . . .

. . . . . . . . . . .

116

§ 24.

Вычислимо перечислимые множества . . . . . . . . .

. . . . . . . . . . .

119

Список литературы

124

Глава I

Предварительные сведения

§ 1. Некоторые аксиомы теории множеств

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

Для работы с множествами и формализации определённых понятий нам потребуются некоторые аксиомы теории множеств Цермело — Френкеля ZF. Теория ZF является формальной (синтаксической) теорией в языке с одним символом двухмест-

ного предиката и символом равенства . Однако мы будем формулировать понятия

и аксиомы данной теории на естественном (общематематическом) языке. Подобная «нестрогость» не должна пугать читателя, поскольку при желании все формулировки можно «перевести» на формальный язык ZF, но в рамках данного курса в этом нет необходимости. Для более глубокого и подробного ознакомления с системой ZF можно порекомендовать книги [3,4].

Понятия множества и отношения принадлежности являются неопределяе-

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

элементом совокупности . Мы также будем использовать термины семейство и

совокупность для описания некоторых множеств. Часто множества задают перечислением всех его элементов, используя запись вида = { , , . . . }.

Определение. Говорят, что множество является подмножеством множества , и пишут , если ( → ). Другими словами, , если каждый элемент множества является элементом множества .

Равенство двух множеств и определяется следующей аксиомой.

Аксиома экстенсиональности: = тогда и только тогда, когда справедливо( ↔ ). Таким образом, множества и равны, если и .

Следующая естественная аксиома постулирует существование наименьшего по включению множества.

Аксиома пустого множества: существует пустое множество ?, т. е. множество, не содержащее ни одного элемента.

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

Аксиома пары: если и — множества, то существует неупорядоченная пара { , }, составленная из этих множеств.

§ 1. Некоторые аксиомы теории множеств

5

 

 

Аксиома суммы: если — множество, то существует множество = { |для некоторого }, которое называется объединением множества .

Аксиома степени: если — множество, то существует множество ( ) = { |} всех подмножеств множества .

Аксиома выделения: если — множество, а ( ) — некоторое условие на множество , то существует множество { | ( )}.

Пример. Пусть множество = {{1, 3, 4}, {3, 6}, {4, 6}}. Тогда его объединением будет множество = {1, 3, 4} {3, 6} {4, 6} = {1, 3, 4, 6}.

Множество всех подмножеств множества = {0, 1, 2} состоит из восьми элементов, т. е. ( ) = {?, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}}.

Из аксиомы пары и аксиомы суммы следует, что если — множество, то { }

— множество, а значит, и { } тоже является множеством, которое мы будем обозначать через + 1.

Из аксиомы пустого множества с помощью введённой операции + 1 получаем существование множеств вида ?, {?}, {?, {?}}, {?, {?}, {?, {?}}} и т. д. (каждое следующее состоит из всех предыдущих), эти множества мы будем называть натуральными числами и обозначать их соответственно через 0, 1, 2, 3 и т. д.

Заметим, что, используя только те пять аксиом «существования», которые сформулированы выше, можно получить лишь конечные множества. В частности, из этих пяти аксиом невозможно вывести, что «совокупность» всех натуральных чисел образует множество. Для разрешения этого вопроса вводится следующая аксиома.

Аксиома бесконечности: существует множество такое, что ? и если

, то { } .

Множество , существование которого постулируется аксиомой бесконечности,

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

= {0, 1, 2, 3, . . .},

состоящее из всех натуральных чисел. Для обозначения множества всех натуральных чисел также используют символ N.

Теперь, располагая каноническим бесконечным множеством , можно строить

другие бесконечные множества. В следующем определении вводятся стандартные теоретико-множественные операции объединения, пересечения, разности и дополнения (до некоторого множества).

Определение. Если и — множества, то их объединением называется множество={ | или }, пересечением — множество ∩ ={ | и }, разностью — множество = { | и / }.

Если рассматриваемые множества являются подмножествами некоторого фиксированного множества , то можно говорить о дополнении = множества

(до множества ).

Объединением семейства множеств называется множество = { | ( )}, а пересечением непустого семейства множеств — множество ∩ = { |( )}.

6

Глава I. Предварительные сведения

 

 

Из перечисленных выше аксиом следует, что, применяя эти операции к множествам, мы снова получаем множества. Например, если , — множества, то в силу

аксиомы пары существует неупорядоченная пара { , }, а в силу аксиомы суммы

— объединение = { , }. Затем, используя аксиому выделения, заключаем, что существует пересечение ∩ = { | и }.

Определение. Разбиением множества называется такое множество ( ), что = и для любых различных , справедливо ∩ = ?.

Аксиома пары постулирует существование множества { , }. Однако порядок расположения элементов в паре формально никак не задаётся, поскольку { , } = { , }. Более того, если = , то пара { , } превращается в одноэлементное множество { }. Чтобы всё-таки упорядочить элементы пары, вводится следующее определение.

Определение. Упорядоченной парой элементов и называется множество , = = {{ }, { , }}. В упорядоченной паре мы задаём строгий порядок расположения элементов: — первый, — второй. Следует различать , ̸= { , }!

Предложение 1. Для любых элементов , , , имеет место , = , тогда и только тогда, когда = и = .

Доказательство. Предлагается читателю в качестве упражнения.

Определение. Пусть , > 1. Упорядоченная -ка (кортеж длины ) определяется по индукции: 1 = 1, 1, . . . , −1, = 1, . . . , −1 , .

Пустое множество ? по определению называем кортежем длины 0.

Следствие 2. 1, . . . , = 1, . . . , тогда и только тогда, когда имеет место

1 = 1, . . . , = .

Доказательство. Следует из предыдущего предложения по индукции.

Определение. Декартовым произведением множеств 1, . . . , называется мно- жество

1 × . . . × = { 1, . . . , | 1 1, . . . , }.

 

 

 

 

-й декартовой степенью множества называется множество

= × . . . × .

При = 0 по определению полагаем 0 = {?}.

 

 

 

 

 

Определение. Любое подмножество 1 × . . . × называется отношением (предикатом) на множествах 1, . . . , . Если 1, . . . , , то говорят, что предикат истинен на элементах 1, . . . , , и пишут ( 1, . . . , ), иначе говорят, что

предикат ложен на элементах 1, . . . , , и пишут ¬ ( 1, . . . , ).

Любое подмножество называется -местным отношением (предикатом)

на множестве . В частности, бинарное отношение (предикат) на множестве — это любое подмножество 2.

Определение. Бинарное отношение × на множестве называется:

(а) рефлексивным, если для всех справедливо , ;

(б) симметричным, если для всех , из , следует , ;

(в) транзитивным, если для всех , , из , и , следует , ;

(г) отношением эквивалентности, если оно рефлексивно, симметрично и транзитивно.

§ 1. Некоторые аксиомы теории множеств

7

 

 

Определение. Пусть — отношение эквивалентности на множестве . Классом эквивалентности элемента по отношению называют множество / = = { | , }, состоящее из всех элементов , эквивалентных . Множество/ = { / | } всех классов эквивалентности называют фактор-множеством

по отношению .

Предложение 3. Для любого отношения эквивалентности на множестве классы эквивалентности по отношению образуют разбиение множества , и обратно, любое разбиение множества определяет отношение эквивалентности

на , для которого множества в разбиении являются классами эквивалентности.

Доказательство. Предлагается читателю в качестве упражнения.

Определение. Композицией отношений 1 × и 2 × называется отношение 1 2 = { , | ( , 1 и , 2)}.

Определение. Обратным отношением к отношению × называется отношение −1 = { , | , }.

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

Для данного , если существует со свойством , , то говорят, что значение ( ) определено и равно , и пишут ( ) ↓, в противном случае говорят, что

значение ( ) не определено, и пишут ( ) ↑.

Областью определения называется множество dom( ) = { | ( ) ↓}. Областью значений называется множество range( ) = { ( ) | , ( ) ↓}.

Определение. Запись : → означает, что для некоторых множеств , отношение × является функцией такой, что dom( ) = и range( ) . При этом говорят, что является функцией из в .

Определение. Говорят, что функция : → является инъективной, и пишут

1−1

: −−→ , если для любого существует не более одного такого, что

( ) = .

Определение. Говорят, что функция : → является сюръективной, и пишут

на

: −→ , если range( ) = .

Определение. Говорят, что функция : → является биективной, и пишут

1−1

: −−→ , если одновременно инъективна и сюръективна.

на

Определение. Если × , × — функции, то их композиция × определяется как композиция отношений. Легко видеть, что тоже является функцией.

1−1

Определение. Если : −−→ — биективная функция, то

на

−1 определяется как обратное отношение. Легко видеть, что −1

−1 1−1

вида : −−→ .

на

обратная функция

является биекцией

Определение. Функция вида : → , где называется -местной частичной функцией на .

8

Глава I. Предварительные сведения

 

 

Замечание. Заметим, что существуют только два вида 0-местных частичных функций — это либо нигде не определенная функция =?, либо функция вида ={?, } для некоторого . Во втором случае мы будем называть функцию константой и отождествлять её с элементом , т. е. = .

Упражнения

1.Пусть , , — произвольные множества. Верно ли, что если и , то ?

2.Пусть 0 1 2 . . . . . . — счётная невозрастающая последова-

тельность множеств. Доказать, что пересечение любой бесконечной подпоследовательности этих множеств совпадает с пересечением всей последовательности.

3.Доказать, что теоретико-множественную операцию нельзя определить через операции и .

4.Доказать, что теоретико-множественную операцию нельзя определить через операции и .

5.Доказать предложение 1 и следствие 2.

6.Используя аксиомы пары, суммы, степени и выделения, доказать, что для любых множеств и существует множество × .

7.Доказать предложение 3.

8.Найти −1, , −1 и −1 для отношения = { , R2 | 2 > 3 }.

9.Доказать, что отношение × является биекцией из на тогда и только тогда, когда −1 = { , | } и −1 = { , | }.

§2. Время работы алгоритмов и сортировки чисел

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

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

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

мера . Для этого мы используем -символику, удобную для записи асимптотической верхней границы для функции времени работы.

§ 2. Время работы алгоритмов и сортировки чисел

9

 

 

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

константа > 0 и натуральное 0 такие, что ( ) 6 · ( ) для всех > 0.

Таким образом, фраза «время работы алгоритма составляет ( ( ))» означает, что на входных данных достаточно большого размера время работы алгоритма не превосходит · ( ), где — положительная константа.

Разберём вычисление времени работы алгоритма на примере задачи сортировки конечных наборов чисел. Входными данными в этой задаче является упорядочен-

ный набор 1, 2, . . . , действительных чисел, при этом длина набора считает-

ся размером входных данных. Необходимо путём перестановки чисел преобразовать входной набор в набор 1, 2, . . . , таким образом, чтобы выполнялось условие

1 6 2 6 · · · 6 .

Сортировка вставкой (insertion sort) — это простой и естественный алгоритм, решающий указанную задачу. Перейдём к описанию данного способа сортировки.

Описание алгоритма

На вход алгоритма подаётся массив [1], . . . , [ ] длины [ ] = , состоящий

из действительных чисел. Алгоритм последовательно выбирает ключевой элемент[ ] из массива и, предполагая, что элементы [1], . . . , [ −1] уже отсортированы в

порядке неубывания, помещает [ ] в нужное место среди элементов [1], . . . , [ −1].

Чтобы определить, куда нужно поместить ключевой элемент, алгоритм сравнивает [ ] с элементами массива [1], . . . , [ −1], двигаясь по нему справа налево. По

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

Insertion_Sort( )

{Вход: массив [1], . . . , [ ].} {Выход: отсортированный массив [1], . . . , [ ].}

01

for ← 2 to [ ]

02

do ← [ ]

03

← − 1

04

while > 0 и [ ] >

05

do [ + 1] ← [ ]

06

← − 1

07

[ + 1] ←

Процедура Insertion_Sort работает следующим образом. В строках 01–07 организуется цикл for, на каждой итерации которого в строке 02 выбирается ключевой

элемент [ ]. В строках 03–07 происходит вставка элемента [ ] в отсортированный набор [1], . . . , [ −1]. Для этого в строке 03 инициализируется убывающий счётчик

с начальным значением = − 1. Цикл while в строках 04–06 последовательно уменьшает до тех пор, пока не станет равным нулю либо пока не выполнится условие [ ] 6 [ ]. В строке 07 после выхода из цикла while ключевой элемент помещается на ( +1)-е место в массиве. Если > 0 и [ ] > [ ] в теле цикла while, то в строке 05 элемент [ ] переставляется с -го на ( +1)-е место в массиве, а счётчик

в строке 06 уменьшается на единицу.

Пример. Продемонстрируем, как работает процедура Insertion_Sort на входном массиве 5, 1, 4, 7, 1, 3 . Элементы массива обозначены квадратами. Части (а)–(д) это-

10

Глава I. Предварительные сведения

 

 

го рисунка соответствуют итерациям цикла for в строках 01–07. На каждой итерации чёрный квадрат содержит значение ключа, которое сравнивается со значениями серых квадратов, расположенных слева от него (строка 04). Стрелками указаны перемещения элементов массива на одну позицию вправо (строка 05) и перемещения ключа (строка 07). Часть (е) показывает конечное состояние сортируемого массива.

(а)

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

5

1

4

7

 

1

 

3

 

(б)

1

5

 

4

 

7

 

1

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(в)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

?

?

?

 

 

1

4

 

5

 

7

 

 

1

 

3

 

(г)

1

4

 

5

 

7

 

1

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(д)

 

 

 

 

 

 

 

 

 

 

?

 

?

 

?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

 

4

 

5

 

 

7

 

3

 

(е)

1

1

 

3

 

4

 

5

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Время работы алгоритма

Обозначим через ( ) время работы процедуры Insertion_Sort на входе размера . Значение ( ) зависит от времени исполнения каждой строки псевдокода и количества их повторений. Для 1 6 6 7 обозначим время исполнения -й строки

через , где — константа. Для 2 6 6 обозначим через количество прове-

рок условия в заголовке цикла while в строке 04. Отметим, что при нормальном завершении циклов for или while (т.е. когда перестаёт выполняться условие, заданное в заголовке цикла) условие проверяется на один раз больше, чем выполняется тело цикла. Поэтому количество исполнений каждой из семи строк псевдокода будет следующим:

Insertion_Sort( )

 

 

 

время

количество раз

 

01

for ← 2 to [ ]

 

 

 

1

 

 

 

 

 

 

 

02

do ← [ ]

 

 

 

2

 

− 1

 

 

 

03

 

 

1

 

 

 

 

3

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

while > 0 и [ ] >

 

 

 

=2

 

 

 

05

 

 

 

 

 

do [ + 1]

 

[ ]

 

5

 

 

=2(

 

1)

 

06

 

[

 

 

 

 

← − 1

 

 

6

 

=2( − 1)

 

 

 

 

+ 1] ←

 

 

 

 

7

 

− 1

 

 

 

07

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтобы вычислить значение ( ), необходимо просуммировать произведения зна-

чений, стоящих в столбцах время и количество раз:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( ) = 1 + 2( − 1) + 3( − 1) + 4

 

 

 

 

 

 

+ 5

( − 1) + 6

( − 1) + 7( − 1).

 

 

 

 

 

 

 

 

 

 

 

 

=2

 

=2

 

 

 

 

=2

Даже если размер массива фиксирован, значения , 2 6 6 , зависят от степени упорядоченности входного массива. Самый благоприятный случай — это когда все

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]