- •Иркутский государственный технический университет
- •1. Определения графов
- •7.4.5. Массив дуг
- •8.4.2. Трансверсаль
- •8.5.4. Алгоритм нахождения максимального потока
- •8.6.3. Выделение компонент сильной связности
- •8.7.1. Длина дуг
- •8.7.2. Алгоритм Флойда
- •8.7.3. Алгоритм Дейкстры
- •Глава 9 Деревья
- •9.1. Свободные деревья
- •9.1.1. Определения
- •9.1 .2. Основные свойства деревьев
- •9.2. Ориентированные, упорядоченные и бинарные деревья
- •9.2.1. Ориентированные деревья
- •9.2.2. Эквивалентное определение ордерева
- •9.2.3. Упорядоченные деревья
- •9.2.4. Бинарные деревья
- •9.3. Представление деревьев в эвм
- •9.3.1. Представление свободных, ориентированных и упорядоченных деревьев
- •9.3.2. Представление бинарных деревьев
- •9.3.3. Обходы бинарных деревьев
- •9.3.4. Алгоритм симметричного обхода бинарного дерева
- •9.4. Деревья сортировки
- •9.4.1. Ассоциативная память
- •9.4.2. Способы реализации ассоциативной памяти
- •9.4.3. Алгоритм бинарного (двоичного) поиска
- •9.4.4. Алгоритм поиска в дереве сортировки
- •9.4.5. Алгоритм вставки в дерево сортировки
- •9.4.6. Алгоритм удаления из дерева сортировки
- •9.4.7. Вспомогательные алгоритмы для дерева сортировки
- •9.4.8. Сравнение представлений ассоциативной памяти
- •9.4.9. Выровненные деревья
- •9.4.10. Сбалансированные деревья
- •9.5. Кратчайший остов
- •9.5.1. Определения
- •9.5.2. Схема алгоритма построения кратчайшего остова
- •9.5.3. Алгоритм Краскала
- •Глава 10 Циклы
- •10.1. Фундаментальные циклы и разрезы
- •10.1.1. Циклы и коциклы
- •10.1.2. Независимые множества циклов и коциклов
- •10.1.3. Циклический и коциклический ранг
- •10.2. Эйлеровы циклы
- •10.2.1. Эйлеровы графы
- •10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе
- •10.2.3. Оценка числа эйлеровых графов
- •10.3. Гамильтоновы циклы
- •10.3.1. Гамильтоновы графы
- •10.3.2. Задача коммивояжера
- •Глава 11 Независимость и покрытия
- •11.1. Независимые и покрывающие множества
- •11.1.1. Покрывающие множества вершин и ребер
- •11.1.2. Независимые множества вершин и ребер
- •11.1.3. Связь чисел независимости и покрытий
- •11.2. Построение независимых множеств вершин
- •11.2.1. Постановка задачи отыскания наибольшего независимого множества вершин
- •11.2.2. Поиск с возвратами
- •11.2.3. Улучшенный перебор
- •11.2.4. Алгоритм построения максимальных независимых множеств вершин
- •11.3. Доминирующие множества
- •11.3.1. Определения
- •11.3.2. Доминирование и независимость
- •11.3.3. Задача о наименьшем покрытии
- •11.3.4. Эквивалентные формулировки знп
- •11.3.5. Связь знп с другими задачами
- •Глава 12 Раскраска графов
- •12.1. Хроматическое число
- •Ух, . . . ,Vn одноцветные классы,доказательство
- •12.2. Планарность
- •12.2.2. Эйлерова характеристика
- •12.2.3. Теорема о пяти красках
- •12.3. Алгоритмы раскрашивания
- •12.3.1. Точный алгоритм раскрашивания
- •12.3.2. Приближенный алгоритм последовательного раскрашивания
- •12.3.3. Улучшенный алгоритм последовательного раскрашивания
11.2.3. Улучшенный перебор
Применение метода поиска с возвратами не гарантирует эффективности — трудоемкость поиска с возвратами имеет тот же порядок, что и другие способы перебора (в худшем случае). Используя конкретную информацию о задаче, в некоторых случаях можно существенно сократить трудоемкость выполнения каждого шага перебора или уменьшить количество перебираемых возможностей в среднем (при сохранении оценки количества шагов в худшем случае). Такие приемы называются методами улучшения перебора. Например, может оказаться, что некоторые варианты заведомо не могут привести к решению, а потому их можно не рассматривать.
ЗАМЕЧАНИЕ
Рекурсивная форма метода поиска с возвратами удобна для понимания, но не является самой эффективной. По сути, рекурсия здесь используется для сохранения контекста — то есть информации, характеризующей текущий рассматриваемый вариант. Если использовать другие методы сохранения контекста, то поиск с возвратами может быть реализован без явной рекурсии, а значит, более эффективно.
Рассмотрим методы улучшения перебора на примере задачи отыскания всех максимальных независимых множеств вершин.
Идея: начинаем с пустого множества и пополняем его вершинами с сохранением независимости (пока возможно).
Пусть Sk — уже полученное множество из k вершин, Qk — множество вершин, которое можно добавить к Sk, то есть Sk П T(Qk) = 0. Среди вершин Qk будем различать те, которые уже использовались для расширения Sk (обозначим Qk), и те, которые еще не использовались (Qk). Тогда общая схема нерекурсивной реализации поиска с возвратами будет состоять из следующих шагов.
Шаг вперед от k к k + 1 состоит в выборе вершины х 6 Qk:
Sk+i = Sk U {х},
Шаг назад от fc + 1 к fc:
Sk — Sk+i - {х},
Ql = Qt- to,
Qk = Qk u (4-
Если Sk — максимальное, то Q% = 0. Если Q^ Ф 0, то Sk было расширено раньше и не является максимальным. Таким образом, проверка максимальности задается следующим условием: Q+ = Q~ = 0.
Перебор можно улучшить, если заметить следующее.
Пусть х € Q^" и r(x)r\Q~£ = 0. Эту вершину х никогда не удалить из Q^, так как из Q~ удаляются только вершины, смежные с Q~£. Таким образом, существование х, такого что х € Qk и Г(х) n Q% = 0, является достаточным условием для возвращения. Кроме того, k ^ р — I.
11.2.4. Алгоритм построения максимальных независимых множеств вершин
Приведенный ниже алгоритм, обоснование которого дано в предыдущем разделе, строит все максимальные независимые множества вершин заданного графа.
Алгоритм 11.2. Построение максимальных независимых множеств
Вход: граф G(V, Е), заданный списками смежности Г[г>]
Выход: последовательность максимальных независимых множеств
k : - О { количество элементов в текущем независимом множестве }
S[k]: = 0 { S[k] — независимое множество из k вершин }
Q~ [k}: = 0 {Q~ [k] — множество вершин, использованных для расширения S[k] }
Q+ [fc]: = V { Q+ [k] — множество вершин, которые можно использовать для расширения
S(k}}
Ml :{ шаг вперед }
select v e Q+ [k] { расширяющая вершина }
S[k + 1]: = S[k] U {v} { расширенное множество }
Q~[k + l}: = Q~ [k] \T[v] { вершина v использована для расширения }
<2+[fc+l]: ~Q+[k]\(T[v]U{v}) { все вершины, смежные с v, не могут быть использованы
для расширения }
М2 : { проверка } for и Е Q~ [k] do
if T[u]r\Q+[k] =0 then goto M3 { можно возвращаться }
end if end for if g+[fc] = 0 then
if Q~[k] = 0 then yield S[k] { множество S[k] максимально }
end if
goto M3 { можно возвращаться } else
goto Ml { можно идти вперед } end if
M3 : { шаг назад } v : = last(S[fc]) { последний добавленный элемент }
S[fc]: = S[k + 1] - {v}
Q~ [k]: = Q~ [k] U {v} { вершина v уже добавлялась }
Q+[k]: = Q+[k]\{v}
if fc = 0&<2+[fc] = 0 then
stop { перебор завершен } ebe
goto M2 { переход на проверку } end if
Пример
Известная задача о восьми ферзях (расставить на шахматной доске 8 ферзей так, чтобы они не били друг друга) является задачей об отыскании максимальных независимых множеств. Действительно, достаточно представить доску в виде графа с 64 вершинами (соответствующими клеткам доски), которые смежны, если клетки находятся на одной вертикали, горизонтали или диагонали.