
- •Содержание
- •1 Элементы теории множеств. Комбинаторика. 5
- •Математическая логика: Булева аллгебра 88
- •Теория алгоритмов 129
- •Теория графов 162
- •Математическая логика: Исчисления высказываний и предикатов 207
- •Элементы теории множеств. Комбинаторика.
- •Введение
- •Примеры задач.
- •Задача о расположении конвертов
- •Задача о Ханойской башне
- •Базовые обозначения
- •Правило суммы и правило произведения
- •Основы теории множеств
- •Понятие множества
- •Парадокс Рассела
- •Подмножества
- •Операции над множествами
- •Диаграммы Эйлера-Венна
- •Прямое произведение множеств
- •Бинарные отношения и функции
- •Бинарные отношения
- •Функции
- •Специальные бинарные отношения: Отношение эквивалентности
- •Специальные бинарные отношения: Отношение порядка
- •Лексикографический порядок
- •Выборки с повторениями и без повторений
- •Размещения и сочетания
- •Треугольник Паскаля
- •Связь сочетаний и (0,1)-векторов
- •Перебор сочетаний
- •Бином Ньютона
- •Мультимножества
- •Связь мультимножеств и (0,1)-векторов
- •Полином Ньютона
- •Разбиения множеств.
- •Приложение: программа перебора сочетаний
- •Перестановки
- •Понятие перестановки
- •Группа перестановок
- •Циклы перестановки
- •Тип перестановки
- •Разложения и разбиения натуральных чисел
- •Разложения натуральных чисел
- •Разбиения натуральных чисел
- •Принцип включения-исключения
- •Принцип включения-исключения
- •Задача о беспорядках
- •Мощность объединения множеств
- •Число целочисленных решений системы неравенств
- •Математическая логика: Булева аллгебра
- •Булева алгебра. Функции алгебры логики.
- •Булевы функции
- •Формулы
- •Основные тождества
- •Разложение функции по переменным
- •Дизъюнктивная и конъюнктивная нормальные формы
- •Полином Жегалкина
- •1 ⊕ X1 ⊕ x2x3 - полином Жегалкина.
- •Полнота системы функций
- •Функции, сохраняющие ноль
- •Функции, сохраняющие единицу
- •Двойственность
- •Монотонность
- •Линейность
- •Критерий полноты системы функций
- •Теория алгоритмов
- •Машины Тьюринга
- •Понятие алгоритма
- •Машина Тьюринга
- •Способы записи машины Тьюринга
- •Стандартные конфигурации
- •Вычислимые функции
- •Алгоритмически неразрешимые задачи
- •Сложность алгоритма
- •Полиномиальная сводимость
- •Классы задач в форме распознавания свойств
- •4 Теория графов
- •4.1 Определения графа
- •Общее определение
- •Виды графов
- •Обыкновенный граф
- •Примеры графов
- •Графы Бержа
- •4.2 Изоморфизм графов
- •4.2.1 Инварианты графа
- •Операции
- •Основные операции над графами
- •Подграфы
- •Дополнение графа
- •Маршруты и связность
- •Деревья
- •Матрицы, связанные с графом
- •Матрица смежности
- •Матрица инцидентности
- •Список ребер
- •Обходы графов
- •Эйлеров цикл
- •Гамильтонов цикл
- •Задачи и алгоритмы
- •Остов минимального веса
- •Алгоритм 4.8.1 (Алгоритм Краскала).
- •Задача коммивояжера
- •Задача о клике
- •Задача о вершинном покрытии
- •Задача о гамильтоновом цикле
- •Снова задача коммивояжера
- •Алгоритм дерева
- •Математическая логика: Исчисления высказываний и предикатов
- •Исчисление высказываний
- •Пример задачи логики высказываний
- •Формальные теории
- •Формальная теория исчисление высказываний
- •Теоремы исчисления высказываний
- •Теорема о полноте исчисления высказываний
- •Независимость аксиом исчисления высказываний
- •Исчисление предикатов
- •Пример задачи логики предикатов
- •Формальная теория исчисление предикатов
- •Алфавит.
- •Формулы.
- •Аксиомы.
- •Правила вывода.
- •Интерпретация
- •Литература
Приложение: программа перебора сочетаний
Приведем код программы, которая перебирает все (0,1)-вектора длины n
с k единицами (а значит все сочетания из n по k).
#include<iostream.h>
const n=7, m=4;
void main()
{
cout << "Перебор сочетаний из " << n << " по " << m << ":"
<< endl << endl ;
int i,j,k;
int x[m];// Вектор номеров позиций единиц int c[n];// (0,1)-вектор текущего сочетания.
// Вспомогательный массив для вывода на печать.
// Исходная инициализация for(i=0;i<m;i++)
x[i]=i;
///////////////////////////////
// Стандартный шаг алгоритма // do {
////////////////////
// Вывод на экран //
// Инициализируем массив c[] for(i=0; i<n; i++)
c[i]=0;
for(i=0; i<m; i++) c[x[i]]=1;
// Выведем его на экран for(i=0; i<n; i++)
cout << c[i]; cout << endl;
/////////////////////////////////////////
// Очередной шаг модификации сочетания //
k=m-1; // номер позиции самой последней единицы,
// которую можно сдвинуть. while( (k>=0) && (x[k]==n-m+k) ) k--;
///////////////////////////////
// Если позиция k существует //
if(k>=0)
{
// Увеличиваем номер позиции k-той единицы
// и выстраиваем все следующие единицы за ней x[k]++;
for(i=k+1; i<m; i++) x[i]=x[k]+(i-k);
}
}
while(k>=0);
}
Результатом работы будут все возможные (0,1)-вектора длины семь с четырьмя единицами:
1111000 |
1100011 |
1001011 |
1110100 |
1011100 |
1000111 |
1110010 |
1011010 |
0111100 |
1110001 |
1011001 |
0111010 |
1101100 |
1010110 |
0111001 |
1101010 |
1010101 |
0110110 |
1101001 |
1010011 |
0110101 |
1100110 |
1001110 |
0110011 |
1100101 |
1001101 |
0101110 |
0101101
0101011
0100111
0011110
0011101
0011011
0010111
0001111
Замечание 1.5.3 . Покскольку, как показано в параграфе 1.5.7, существует взаимнооднозначное соответствие между (0,1)- векторами и мультимножествами, приведенную программу легко представить и как программу перебора мультимножеств.
Перестановки
Понятие перестановки
Определение 1.6.1 . Перестановкой на множестве {1, ..., n}
называется инъективная функция
π : {1, ..., n} → {1, ..., n}.
Число n называется порядком перестановки π.
Замечание 1.6.1 . Как любая инъективная на конечном множестве функция, перестановка является биективной.
Замечание 1.6.2 . В общем случае, перестановкой произвольного множества X называют биекцию
π : X → X.
Обозначим σn множество всех перестановок порядка n. Очевидно, что
|σn| = n!
Существует несколько способов задания перестановки. Явное задание
перестановки
1 2 ... n
π = π(1) π(2) ... π(n) .
В записи выше первая строка всегда одинакова. Для задания перестановки достаточно второй строки
π = π(1)π(2)...π(n).
Также можно задать перестановку перечислением ее циклов, о чем мы скажем позже.
Определение 1.6.2 . Пусть π1, π2 ∈ σn. Произведением перестановок
π2 и π1 называют композицию этих функций: π2 ◦ π1(i) = π2(π1(i)),
i = 1, n.
Докажем, что произведение перестановок есть перестановка. Очевидно, что π2 ◦ π1 : {1, ..., n} → {1, ..., n}. Покажем инъективность.
Пусть i, j ∈ {1, ..., n} и i /= j. Поскольку π1 инъективна, π1(i) /= π1(j), а поскольку инъективна π2, π2(π(i)) /= π2(π1(j)). Следовательно,
π2 ◦ π1(i) = π2(π1(i)) /= π2(π1(j)) = π2 ◦ π1(j).
То есть π2 ◦ π1 - инъективна, а значит является перестановкой.