- •Конспект лекций по дисциплине “Дискретная математика”
- •Санкт Петербург Содержание.
- •Раздел I. Множества, функции, отношения. Лекция № 1. Множества и операции над ними.
- •1. Основные понятия теории множеств.
- •2. Операции над множествами и их свойства.
- •3. Векторы и прямые произведения.
- •Лекция № 2. Соответствия и функции.
- •Соответствия.
- •Отображения и функции.
- •Лекция № 3. Отношения и их свойства.
- •Основные понятия и определения.
- •Свойства отношений.
- •Лекция № 4. Основные виды отношений.
- •Отношения эквивалентности.
- •Отношения порядка.
- •Лекция № 4. Пересчёт.
- •Раздел II. Введение в общую алгебру. Лекция № 6. Элементы общей алгебры.
- •1. Свойства бинарных алгебраических операций.
- •2. Алгебраические структуры.
- •Гомоморфизм и изоморфизм.
- •Лекция № 7. Различные виды алгебраических структур.
- •Полугруппы.
- •Группы.
- •Поля и кольца.
- •Раздел III. Введение в логику. Лекция № 8. Элементы математической логики.
- •Булевы функции.
- •Лекция № 9. Логические функции.
- •Функции алгебры логики.
- •Примеры логических функций.
- •Суперпозиции и формулы.
- •Лекция № 10. Булевы алгебры.
- •Разложение функций по переменным. Совершенная дизъюнктивная нормальная форма.
- •Булева алгебра функций.
- •Эквивалентные преобразования.
- •Лекция № 11. Булевы алгебры и теория множеств.
- •Двойственность.
- •Булева алгебра и теория множеств.
- •Днф, интервалы и покрытия.
- •Лекция № 12. Полнота и замкнутость.
- •Функционально полные системы.
- •Алгебра Жегалкина и линейные функции.
- •Замкнутые классы. Монотонные функции.
- •Теоремы о функциональной полноте.
- •Лекция № 13. Язык логики предикатов.
- •Предикаты.
- •Кванторы.
- •Истинные формулы и эквивалентные соотношения.
- •Доказательства в логике предикатов.
- •Лекция № 14. Комбинаторика.
- •Правила суммы и произведения.
- •Размещения.
- •Перестановки.
- •Сочетания. Бином Ньютона.
- •Раздел IV. Теория графов. Лекция № 15. Графы: основные понятия и операции.
- •Графы, их вершины, рёбра и дуги. Изображение графов.
- •Матрица инцидентности и список рёбер. Матрица смежности графа.
- •Идентификация графов, заданных своими представлениями.
- •Лекция № 16. Маршруты, цепи и циклы.
- •Основные определения.
- •Связные компоненты графов.
- •Расстояния. Диаметр, радиус и центр графа. Протяжённости.
- •Эйлеровы графы.
- •Лекция № 17. Некоторые классы графов и их частей.
- •Деревья.
- •Ориентированные графы.
- •Графы с помеченными вершинами и рёбрами.
- •Лекция № 18. Теория алгоритмов Понятие алгоритма
- •1.2.1. Основные требования к алгоритмам
- •1.2.2. Машина Тьюринга
- •Универсальная машина Тьюринга
- •1.2.3. Тезис Тьюринга
- •1.3. Граф машина
- •1.3.1. Модель данных
- •1.3.2. Построение моделей алгоритмов в системе graph
- •2. Сложность алгоритмов
- •2.1.Временная и пространственная сложность алгоритма. Классы dtime и dspace
- •2.2. Классы сложности
- •2.2.1. Полиномиальность и эффективность
- •2.2.2. Алгоритмическая сводимость задач
- •3. Алгоритмы и их сложность
- •3.1. Представление абстрактных объектов (последовательностей)
- •3.1.1. Смежное представление последовательностей
- •3.1.2. Связанное представление последовательностей
- •Список вопросов для подготовки к экзамену по дисциплине "дискретная математика"
1.3.2. Построение моделей алгоритмов в системе graph
В качестве примера использования системы GRAPH для описания алгоритмов рассмотрим известный алгоритм сортировки «вставками».
Пусть нам задан массив натуральных чисел . Для простоты введем фиктивный наименьший элемент (для ЭВМ ).
Создадим словарь данных ПОП. В первую очередь в качестве конструктивного объекта для множества данных массив A (в языке C++ тип массива определяется описанием: typedef int MASSIV[200];). Переменные n, i, j, w описаны в таблице 1.
Таблица 1.
Словарь данных |
||||
Имя данного |
Тип |
Класс данного |
Нач. значение |
Комментарий |
A |
MASSIV |
I |
{-32000,18,4,56,65,37,63,66} |
Массив, который необходимо отсортировать |
n |
int |
I |
6 |
Размерность массива A |
j |
int |
I |
2 |
Цикл |
i |
int |
V |
0 |
Счетчик |
w |
int |
V |
0 |
Промежуточный элемент |
Алгоритм сортировки вставками представлен на рисунке 5.
Здесь
образом обозначена вычислимая функция (объект) вывода на печать содержимого массива A (int k;printf("массив А: \n"); for (k=1;k<=n;k++) printf(" %d",A[k]); printf("\n"); getch(););
образом обозначен объект «j++»;
образом обозначен объект «i--»;
образом обозначена пустая функция «// Конец».
Нулевому элементу массива (A[0]) присвоено значение -32000.
Работа алгоритма начинается с вызова корневой вершины (на рисунке 5 обведена «жирно»). В данном случае – печать исходного массива данных. Далее, последовательно, начиная с элемента A[j] (первоначально j=2) на участке массива A от j до 1 производится упорядочивание элементов в порядке возрастания их значений.
Для этого индексу «i» присваивается значение на 1 меньше j (вершина 1). В объекте 2 запоминается «старшее» (улучшаемое значение элемента) A[j]. При этом в цикле вершина 3 – вершина 4 производится перемещение элементов в направлении A[j], до тех пор, пока не выполнится логическая функция 2 (w<A[i]). В этом случае на «освободившееся» место вставляется элемент A[j] (объект 5). Очевидно, что на данный момент все элементы на участке от 1 до j оказываются упорядоченными.
В блоке 8 производится печать текущего состояния массива, в вершине 6 – увеличение индекса j на 1.
Алгоритм работает, пока не исчерпаются все числа массива A (предикат 3).
2. Сложность алгоритмов
2.1.Временная и пространственная сложность алгоритма. Классы dtime и dspace
При написании этого раздела использовались материалы курсы лекций [1].
После определения разрешимости хочется иметь меру сложности вычисления. Здесь и дальше мы будем рассматривать только разрешимые задачи и всюду определенные (не зацикливающиеся ни на одном входе) машины Тьюринга. Под временем вычисления будем понимать число шагов машины Тьюринга до получения результата.
Определение 8. Пусть . Машина Тьюринга T имеет временную сложность t(n), если для каждого входного слова длины n T выполняет не больше t(n) шагов до остановки. Также будем обозначать временную сложность машины Тьюринга T, как timeT (n).
Используемой памятью будем считать число ячеек на ленте, использованных для записи, не считая длины входа.
Определение 9. Ленточной сложностью машины Тьюринга называется функция , которая равна мощности просматриваемой активной зоны ленты (исключая мощность входного слова).
Обратите внимание, что пространственная сложность может быть меньше длины входа.
Следующим шагом могло бы стать разумное определение «оптимального» алгоритма для данной алгоритмической задачи.
К сожалению, такой подход оказался бесперспективным, и соответствующий результат (теорема об ускорении), установленный на заре развития теории сложности вычислений М. Блюмом , послужил на самом деле мощным толчком для ее дальнейшего развития. Приведем этот результат (без доказательства).
Теорема 2. Существует разрешимая алгоритмическая задача, для которой выполнено следующее. Для произвольного алгоритма A, решающего эту задачу и имеющего сложность в наихудшем случае timeA(n), найдется другой алгоритм B (для этой же задачи) со сложностью timeB(n), такой, что
выполнено для почти всех n (т.е. для всех n, начиная с некоторого).
Эта теорема показывает, что любой вычислительный процесс машины Тьюринга можно улучшить с некоторого шага на МТ , что в свою очередь с некоторого шага улучшается на МТ и т.д. Тем самым не существует вычисления наилучшего а абсолютном смысле.
Следует сразу отметить, что задача, о которой идет речь в этой теореме, выглядит довольно искусственно, и, по-видимому, ничего подобного не происходит для задач, реально возникающих на практике. Тем не менее, теорема об ускорении не позволяет нам определить общее математическое понятие «оптимального» алгоритма, пригодное для всех задач, поэтому развитие теории эффективных алгоритмов пошло другим путем. Именно, одним из центральных понятий этой теории стало понятие класса сложности.
Так называется совокупность тех алгоритмических задач, для которых существует хотя бы один алгоритм с теми или иными сложностными характеристиками.