X算法

✍ dations ◷ 2025-12-06 16:36:10 #搜寻算法

在计算机科学中,X算法可用来求解精确覆盖问题。此名称最早在高德纳的论文《舞蹈链》中出现,他认为此算法是“试错法中最显而易见”的。 就技术而言,X算法是一个深度优先的不确定性回溯算法。由于X算法是一个解决精确覆盖问题的简洁方法,高德纳希望通过该算法体现舞蹈链数据结构的高效性,他把使用后者的X算法称为DLX。

X算法用由0和1组成的矩阵来表示精确覆盖问题,目标是选出矩阵的若干行,使得其中的1在所有列中出现且仅出现一次。

X算法的步骤如下:

选择的不确定性意味着算法将派生出若干独立的子算法,每个子算法都从其父算法中继承了去除部分行列的矩阵。如果其中有一列全为零,则当前情况无解,子算法返回失败,但不一定意味整个问题无解。

实际上,所有子算法形成了一棵搜索树,其中原问题为根节点,树的第层由子算法在第次所选择的行组成。整个算法即用回溯法对搜索树深度优先遍历。

第二步中,无论用什么方法选择列最终都可以得到解,但有的方法效率明显较高。为减少迭代次数,高德纳建议每次都选取1最少的列。

例如,考虑以下精确覆盖问题:全集 = {1, 2, 3, 4, 5, 6, 7} ,现有U的六个子集 S {\displaystyle {\mathcal {S}}} , , , , , },其中:

此问题可用矩阵表示为:

根据高德纳的建议,每次都选取1最少的列,则X算法的执行步骤如下:

第0层

第一步:矩阵非空,故算法继续执行。

第二步:1最少的列为第一列,含有两个1。所以选择第一列:

第三步:A行和B行第一列均为1,所以依次选择这两行继续搜索。

于是算法开始搜索树的第1层第一个分支:

第0层没有其他可选择的行,算法最终停止。

综上所述,用X算法得出本问题只有一个解: S {\displaystyle {\mathcal {S}}^{*}} , , }。

高德纳主要想通过X算法体现舞蹈链的实用性。他发现了使用舞蹈链的X算法效率极高,并把这一过程称为DLX。DLX用矩阵来表示精确覆盖问题,在内部的存储结构为舞蹈链。舞蹈链是一个双向环形链表,每个矩阵中的1都有一个指针指向其左、右、上、下的1。因为精确覆盖问题中的矩阵一般都是稀疏的,所以舞蹈链中的元素很少,既很省时间,又很省空间。可见使用舞蹈链的DLX算法无论在选择行时还是回溯错误的选择时效率都很高。

相关

  • 头部移植头部移植,是一种外科手术,其目的是将一个人或其他动物的头部嫁接到另一个的身体上。头部移植曾经在狗、猴子、老鼠等动物上做过实验,但目前尚无在人类应用的记录。由于重新联接
  • 童仲彦童仲彦(1973年7月8日-),苗栗县竹南人,无党籍人士,浪Live直播平台签约直播主、网红。国立政治大学新闻学学士毕业,新闻记者出身,曾在中天新闻、台视、民视等电视台担任过新闻部记者。
  • 莎拉·伯恩哈特莎拉·伯恩哈特 (Sarah Bernhardt, 1844年10月22日-1923年3月26日)是一位19世纪和20世纪初法国舞台剧和电影女演员。正如罗伯特·戈特利在《莎拉》中所说的那样,她被认为是“世
  • 故事故事是指过往发生的事,包含真实发生过历史,如史书,也包含了从未发生过的虚拟故事,例如电影或小说。有很多种媒介可以乘载故事,例如:文字、声音、及影像等。电影、电视剧、小说、
  • 奥伊米亚康奥伊米亚康(俄语:Оймяко́н、雅库特语:Өймөкөөн),俄罗斯西伯利亚东北部一村庄,属萨哈共和国管辖。奥伊米亚康位于东西伯利亚山地,因迪吉尔卡河上游同名盆地中央,海拔
  • 杰克·凯沃基安杰克·凯沃基安(英语:Jacob "Jack" Kevorkian 发音: /kᵻˈvɔːrkiən/,本名杰各布·凯沃基安,1928年5月26日-2011年6月3日),人称“死亡医生”,是美国病理学家、安乐死推广运动家、
  • 现代艺术现代艺术(英语:Modern art)指大约在1860年代至1970年代这段时期内创作的艺术作品,也包括了该时代所创作的艺术的风格和哲学。这个术语通常与艺术联系在一起。在现代艺术中,本着以
  • Johnson, Andrew安德鲁·约翰逊(Andrew Johnson,1808年12月29日-1875年7月31日),美国政治人物,第17任总统。生于北卡罗莱纳州,1843-1853年任田纳西州联邦众议员,1853-1857年任田纳西州州长,1857-1862年
  • 帕罗奥多帕罗奥图(英文:Palo Alto /ˌpɑːloʊˈɑːltoʊ/, /ˌpæloʊˈæltoʊ/)是美国加利福尼亚州圣克拉拉县内的一座城市,位于旧金山湾区西南部,在山景城和门洛帕克市中间,西方毗邻
  • 自由邦省自由邦省(南非语:Vrystaat,英语:Free State),是南非九个省之一,前身是奥兰治自由邦。面积129,480平方公里,2019年人口为2,887,465人。首府及最大城市布隆方丹。现任自由邦省总理为来