网站大量收购独家精品文档,联系QQ:2885784924

Dancing Links Donald E.Knuth, Stanford University 吴豪 隋清宇译.pdf

Dancing Links Donald E.Knuth, Stanford University 吴豪 隋清宇译.pdf

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Dancing Links Donald E.Knuth, Stanford University 吴豪 隋清宇译

Dancing Links 中文版 (DLXcn ) Donald E.Knuth, Stanford University 翻译 武汉武钢三中 吴豪 更正 排版 上海交通大学 隋清宇(sqybi ) 目录 正文  精确覆盖问题  解决精确覆盖问题  舞蹈步骤  效率分析  应用于六形组  一个失败的试验  应用于四形条  应用于皇后问题  结语  致谢  历史注记  程序 参考资料  补注 译者的话  译者隋清宇的话  译者吴豪的话  感谢 声明及其它 正文 我写这篇论文的目的,是觉得这个简单的程序技巧理应得到广泛认可。假设 x 指向双向链的一个节点;L[x]和 R[x]分别表示 x 的前驱节点和后继节点。每个 程序员都知道如下操作: L[R[x]] ← L[x], R[L[x]] ← R[x] (1) 是将 x 从链表删除的操作;但是只有少数程序员意识到如下操作: L[R[x]] ← x, R[L[x]] ← x (2 ) 是把 x 重新链接到双向链中。 当然,指出这种操作以后,这个结果是显然的。但是,当我真正认识到操作 (2 )的作用以后,我突然感到了定义“啊哈”这个词语时候的感觉,因为,L[x] 和 R[x] 的值在x 从链表中删除以后早已没有了它原来的语义。确实,一个精心 设计的程序在 x 被删除后会通过把 L[x],R[x]赋值为 x 或者赋值为空值(null ) 来清理掉这些不用的数据结构。而让一个链外的对象指向链本身有时具有潜在 的危险性。例如,指针就可以干扰垃圾回收机制的运作。 那么是什么关于操作(2 )的研究促使我写一整篇论文来讨论这个问题呢?当x 从链表删除以后;为什么还要把它放回链表中?嗯,我承认,数据结构的更新 通常来说是永久性的。但是非永久性的更新也时常发生。例如,在一个交互性 的程序中,用户很可能想撤销他所做的一个或一系列操作,恢复到先前的状 态。另一个典型的应用是在回溯程序 (backtrack programs ) [16]里, 回溯程序枚 举约束集合里的所有解。回溯,也叫深度优先搜索 (depth-first search ),在之 前的论文中曾经讨论到。 操作(2 )的观点是Hitotumatu 和 Noshita [22]于 1979 年提出的。他们提出 Dijkstra 提出的著名的解决 N 皇后问题 [6,第72-82 页]的算法在使用了这个技 巧后,程序的速度比不使用几乎快了 2 倍。 Floyd 关于回溯和非确定性算法 [11]之间关联的优雅论述中包含详细的数据结构 更新与恢复的算法(谁能够提供这句话的准确翻译?——译者)。通常来说, 回溯程序可以被认为是一种搜索,所要做的就是缩小这个任务需要搜索的范 围,同时组织好用于控制搜索流程和决策的数据。对于多步的问题,解决问题的 每一步操作,都将改变剩余需要解决的问题。 简单情况下,我们可以考虑维护一个栈,用来保存当前搜索树节点之前的所有 相关状态信息,但是这个任务的拷贝动作需要耗时太多。因此,我们通常选用 全局数据结构。这样无论搜索进行到何种程度,它都会保留相关状态信息,并 且当搜索回溯的时候它都能恢复先前状态。 例如,Dijkstra 解决 n 皇后问题的递归算法将当前状态保存在三个全局布尔 (Boolean )数组中,他们分别表示棋盘上的列和2 条对角线;Hitotumatu 和 Noshita 的程序中使用双向链表来记录所有列和对角线上的可能性。当Dijkstra 算法暂时放置一个皇后在棋盘上的时候,会把每个布尔数组里的一个数据从真 改为假;回溯后又将这个数据改回真。Hitotumatu 和 Noshita 使用(1)去删

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档