DLX

Dancing Links 跳舞链

Dancing Links缩写为DLX,其实在竞赛中并不常见,这次会讲这个是因为前一阵子搞拼图写了这个数据结构就顺便写(水)博客。 DLX的发明者是高德纳(Donald Knuth),就是那个传说中的《计算机程序设计艺术》(TAOCP)系列书的作者,这里对这个算法做一些比较直观的解释。 DLX面向的问题 DLX面向的问题是精确覆盖问题。何谓精确覆盖呢,来看以下这个表格,每一行是一个数组,数组有4个元素,每行的第一列是这个数组的名字 name a 0 0 0 1 b 1 0 0 1 c 1 1 0 0 d 1 0 1 0 e 0 1 1 1 f 0 0 1 0 g 0 1 0 1 我们的目标是,在这些集合里,挑出几个,例如我们挑a,b,c,那对应位置上的元素相加,于是得到 2 1 0 2。而我们的目标是,找到一个挑选的方法,使得相加得到 1 1 1 1 全是1。 例如说,选 d和g,那么相加正好得到 1 1 1 1 ,这就是其中一个解,这就是精确覆盖问题的直观感知。