Knuth X 알고리즘은 Exact Cover 문제를 해결하기 위해 Donald Knuth가 고안한 알고리즘이다.

이 알고리즘은 DLX(Dancing Links) 기법을 사용하여 효율적으로 구현된 재귀적, 비결정적, 깊이 우선 역추적 알고리즘이다.

Exact Cover 문제

<aside> 💡

조건

  1. $\forall S_i,S_j \in S'\ (i\neq j \Rightarrow S_i \cap S_j = \phi)$
  2. $\bigcup_{S_k \in S'}S_k = U$ </aside>

즉, A~F 집합을 한번씩 선택하여 U의 모든 원소가 단 한번 나타나게 하는 것.

위 문제에서는 $S' = \{B,D,F\}$가 Exact Cover문제의 해로 성립한다.

문제 해결 전략

우선 각 집합 A~F가 어떤 원소를 가지고 있으면 1, 가지고 있지 않다면 0으로 표기하여 행렬을 만든다.

이러한 행렬에서 크누스 X 알고리즘은 다음과 같은 흐름을 가진다.

<aside> 💡

알고리즘의 흐름

  1. 종료 조건 확인 : 행렬이 비어있다면(열이 하나도 없다면), 현재까지의 부분 해답(partial solution)은 Exact Cover문제의 해답으로 알고리즘을 종료한다
  2. 열(Column) 선택 : 행렬 A에서 ‘1’의 개수가 가장 적은 열(0 포함) c를 선택한다
  3. 행(Row) 선택 (비결정적) : 2번에서 선택한 열 c에 ‘1’을 포함하는 모든 행 r에 대해 아래 4번 과정을 반복한다
  4. 탐색 및 커버

예시

<aside> 💡

문제 상황

각 집합 A~F가 어떤 원소를 가지고 있으면 1, 가지고 있지 않다면 0으로 표기하여 행렬을 만든다

1 2 3 4 5 6 7 8
A 1 0 0 1 0 0 1 0
B 1 1 1 0 0 0 0 0
C 0 0 0 0 1 0 0 0
D 0 0 0 1 1 1 0 0
E 0 0 1 0 0 1 0 0
F 0 0 0 0 0 0 1 1
G 0 1 0 1 0 0 0 1
H 0 0 1 0 1 0 1 0
I 0 0 0 0 0 1 0 1

열(Column) 선택 : 행렬에서 ‘1’의 개수가 가장 적은 열(0 포함) c를 선택한다

각 열이 가지는 1의 개수는 순서대로 2, 2, 3, 3, 3, 3, 3, 3이다. 1의 개수가 제일 적은 1열을 먼저 선택한다