Введение

Алгоритм для решения задачи точного покрытия. Алгоритм X — это алгоритм для решения задачи точного покрытия. Это прямой рекурсивный, недетерминированный, с поиском в глубину, алгоритм с возвратом, используемый Дональдом Кнутом для демонстрации эффективной реализации под названием DLX, которая использует технику «танцующих связей». Задача точного покрытия в алгоритме X представлена матрицей A, состоящей из 0 и 1. Цель состоит в том, чтобы выбрать подмножество строк таким образом, чтобы цифра 1 встречалась в каждом столбце ровно один раз. Алгоритм X работает следующим образом: недетерминированный выбор строки r означает, что алгоритм рекурсивно перебирает независимые подзадачи; каждая подзадача наследует текущую матрицу A, но уменьшает её относительно другой строки r. Если столбец c полностью состоит из нулей, подзадач нет, и процесс завершается неудачно. Подзадачи образуют дерево поиска естественным образом, с исходной задачей в корне и уровнем k, содержащим каждую подзадачу, соответствующую k выбранным строкам. Возврат — это процесс обхода дерева в порядке предварительного просмотра, с поиском в глубину. Любое систематическое правило выбора столбца c в этой процедуре найдёт все решения, но некоторые правила работают значительно лучше других. Чтобы уменьшить количество итераций, Кнут предлагает, чтобы алгоритм выбора столбца выбирал столбец с наименьшим количеством единиц в нём.

Реализация

Основная цель Кнута при описании алгоритма X заключалась в демонстрации полезности "танцующих связей". Кнут показал, что алгоритм X может быть эффективно реализован на компьютере с использованием "танцующих связей" в процессе, который Кнут назвал "DLX". DLX использует матричное представление задачи точного покрытия, реализованное в виде двусвязных списков единиц матрицы: каждый элемент, равный 1, имеет связь со следующей единицей выше, ниже, слева и справа от себя. (Строго говоря, поскольку списки замкнуты, это образует тор). Поскольку задачи точного покрытия обычно разрежены, такое представление обычно гораздо эффективнее как по объему, так и по времени обработки. Затем DLX использует "танцующие связи" для быстрого выбора перестановок строк в качестве возможных решений и эффективного возврата (отмены) ошибочных предположений.