Knuth's Algorithm X
Algorithm X is an algorithm for solving the exact cover problem. It is a straightforward recursive, nondeterministic, depth-first, backtracking algorithm used by Donald Knuth to demonstrate an efficient implementation called DLX, which uses the dancing links technique.
Algorithm
The exact cover problem is represented in Algorithm X by an incidence matrix A consisting of 0s and 1s. The goal is to select a subset of the rows such that the digit 1 appears in each column exactly once.Algorithm X works as follows:
- If the matrix A has no columns, the current partial solution is a valid solution; terminate successfully.
- Otherwise choose a column c.
- Choose a row r such that Ar, c = 1.
- Include row r in the partial solution.
- For each column j such that Ar, j = 1,
- : for each row i such that Ai, j = 1,
- :: delete row i from matrix A.
- : delete column j from matrix A.
- Repeat this algorithm recursively on the reduced matrix A.
If column c is entirely zero, there are no subalgorithms and the process terminates unsuccessfully.
The subalgorithms form a search tree in a natural way, with the original problem at the root and with level k containing each subalgorithm that corresponds to k chosen rows.
Backtracking is the process of traversing the tree in preorder, depth first.
Any systematic rule for choosing column c in this procedure will find all solutions, but some rules work much better than others.
To reduce the number of iterations, Knuth suggests that the column-choosing algorithm select a column with the smallest number of 1s in it.
Example
For example, consider the exact cover problem specified by the universe U = and the collection of sets =, where:This problem is represented by the matrix:
Algorithm X with Knuth's suggested heuristic for selecting columns solves this problem as follows:
Level 0
Step 1—The matrix is not empty, so the algorithm proceeds.
Step 2—The lowest number of 1s in any column is two. Column 1 is the first column with two 1s and thus is selected :
Step 3—Rows A and B each have a 1 in column 1 and thus are selected.
The algorithm moves to the first branch at level 1…
There are no branches at level 0, thus the algorithm terminates.
In summary, the algorithm determines there is only one exact cover: =.