- •Введение
- •1. Алгоритмы сортировки
- •1.1. Общие положения
- •1.2. Сортировка простыми включениями
- •Словесное описание алгоритма
- •1.3. Сортировка простым выбором
- •1.4. Сортировка простым обменом
- •1.5. Задания для самостоятельной работы
- •2. Алгоритмы покрытия
- •2.1. Постановка задачи покрытия
- •2. 2. Алгоритм полного перебора
- •2. 3. Алгоритм граничного перебора по вогнутому множеству
- •2.4. Алгоритмы, использующие сокращение таблицы покрытий
- •1. Для случая построения одного кратчайшего покрытия
- •2. В случае построения минимального покрытия
- •3. При условии построения всех безызбыточных покрытий
- •2.5. Алгоритм приближенного решения задачи о покрытии
- •2.6. Задачи для самостоятельной работы
- •3. Алгоритмы на графах
- •3.1. Общие положения
- •3.2. Алгоритмы нахождения оптимального пути
- •Волновой алгоритм построения кратчайшего пути для взвешенного графа
- •Волновой алгоритм построения длиннейшего пути во взвешенном графе
- •3.3. Нахождение компонент связности
- •Алгоритм построения компонент связности в неориентированном графе
- •Пример 3.5
- •3.4. Алгоритмы нахождения подграфов
- •3.5. Дерево. Остов
- •Пример 3.7.
- •Алгоритм построения произвольного остова
- •Алгоритм построения минимального остова
- •Алгоритм построения системы независимых циклов графа
- •Пример 3.12.
- •3.6. Алгоритм кратчайшей раскраски графа
- •3.7. Задачи для самостоятельной работы
- •4. Конечные автоматы
- •4.1. Общие положения
- •4.2. Представление автомата
- •4.3. Взаимные преобразования автоматов
- •4.4. Определение реакции автомата на входное слово
- •4.5. Задания для самостоятельной работы
- •5. Машины тьюринга
- •5.1. Общие положения
- •5.2. Операции над машинами Тьюринга
- •6. Структуры данных
- •6.1. Списки
- •6.2. Двусвязный список
- •6.3. Кольцевой список
- •6.4. Стек
- •6.5. Очередь
- •6.6. Задания для самостоятельной работы
- •Литература
2. 2. Алгоритм полного перебора
Будем считать, что подмножества пронумерованы и таким образом упорядочены. Естественный метод перебора всех подмножеств строк таблицы покрытий строится так: пустое подмножество строк, подмножества из одной строки, из двух строк,…, из всех строк, т.е. всего подмножеств:
.
Словесное описание алгоритма:
0. Текущее подмножество ;
1. i=i+1. Запоминаем множество , как очередное построенное подмножество;
2. Находим наибольший номер j элемента ;
2.1. Если j n (n количество подмножеств ), то переходим к п.3;
2.2. Если j = n, то удаляем изи если, то заканчиваем построение; если– находим наибольший номер j элемента и удаляемиз.
3. j=j+1. Вводим в элемент. Переходим к п.1.
2. 3. Алгоритм граничного перебора по вогнутому множеству
Данный алгоритм основан на генерации подмножеств и их целенаправленном отборе.
Алгоритм генерации подмножеств должен гарантировать, что при его последовательном применении можно построить, начиная с некоторого начального подмножества, все возможные подмножества; при этом не должно быть повторений и должен существовать критерий окончания перебора. В п.2.2 упорядочение перебора произведено сначала по числу i элементов, а затем для фиксированного i – по лексикографическому правилу относительно номеров подмножеств.
Более удобный для дальнейшего упрощения процесса решения алгоритм полного перебора заключается в следующем: сначала строятся все подмножества Di, содержащие , затем содержащие , но не содержащие; если построено подмножествоDi, то за ним строится подмножество Di+j, целиком содержащее Di (Di Di+j).
Во многих приложениях достаточно находить только безызбыточные покрытия (теорема 2.1), что естественным образом сокращает перебор. Однако не удаётся найти простой и эффективный алгоритм, не требующий построения всех избыточных покрытий. Идея улучшения алгоритма перебора (генерации) подмножеств заключается в следующем: если текущее подмножество покрытие, то в это подмножество не нужно вводить новые элементы.
Теорема 2.2. Если P покрытие, то и P’, P’ P, тоже покрытие, т.е. множество всех возможных покрытий вогнуто.
Безызбыточные покрытия – это граница вогнутого множества всех покрытий, поэтому модифицированный алгоритм носит название “Алгоритм граничного перебора по вогнутому множеству”.
Словесное описание алгоритма:
0. Текущее подмножество D={A1}, i=0. Выполняем п.4;
1. Находим наибольший номер j элемента в подмножестве D.
1.1. Если j n и – не покрытие, то выполняем п.3.
1.2. Если j n и – покрытие, то выполняем п.2.
1.3. Если j = n, то удаляем из, и если , то выполняем п. 5, иначе – снова находим наибольший номер j элемента в D и выполняем п.2.
2. Удаляем элемент из.
3. j=j+1. Вводим элемент в D.
4. Выясняем, является ли покрытием.
4.1. Если очередное построение в – покрытие, то удаляемпо очереди из ранее построенных покрытий те, которые поглощают , т.е. избыточные покрытия, соответственно уменьшаяi каждый раз на 1, и запоминаем D как покрытие Переходим к п.1;
4.2. Если построение в D не является покрытием, то выполняем п.1;
5. Заканчиваем построение всех безызбыточных покрытий.
Из полученных безызбыточных покрытий можно выбрать покрытия с минимальным количеством строк (кратчайшее покрытие) либо покрытие с минимальной ценой (минимальной покрытие) в соответствии с (2.2).