Algorithm X

Algorithm X 是一种递归的,深度优先的回溯的算法,算法的目的是将一个仅由0 1构成的矩阵提取其中的几行,使得这几行构成的新矩阵每列包含且仅包含一个1,适用于精确覆盖问题,如数独,Knuth推荐dance link (dlx)的实现方式

算法具体步骤

  1. If the matrix A is empty, the problem is solved; terminate successfully.(矩阵为空递归结束)
  2. Otherwise choose a column c (deterministically).找出1的个数最小的列
  3. Choose a row r such that Arc = 1 (nondeterministically).找出该列中值为1的位置所在的行
  4. Include row r in the partial solution.提取该行r
  5. For each column j such that Arj = 1,
    for each row  i such that  A ij = 1,
    delete row  i from matrix  A;与行r值为1的同在一列的行被删除(保证每一列仅有一个1)
    delete column  j from matrix  A.(r中值为1的列被删除,否则下一次递归时将会因为此列全为0而中断)
  6. Repeat this algorithm recursively on the reduced matrix A
若递归时某一列全为零说明这种情况无解

算法例子

For example, consider the exact cover problem specified by the universe U = {1, 2, 3, 4, 5, 6, 7} and the collection of sets \mathcal{S} = { AB,CDEF}, where:

  • A = {1, 4, 7};
  • B = {1, 4};
  • C = {4, 5, 7};
  • D = {3, 5, 6};
  • E = {2, 3, 6, 7}; and
  • F = {2, 7}.

This problem is represented by the matrix:

  1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1

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 (deterministically):

  1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1

Step 3—Rows A and B each have a 1 in column 1 and thus are selected (nondeterministically).

The algorithm moves to the first branch at level 1…

Level 1: Select Row A
Step 4—Row  A is included in the partial solution.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值