【发布时间】:2011-09-17 10:14:13
【问题描述】:
我有一个情况,如下:
- 我有 n 个双向链表
- 每个列表都有一个标记开头和结尾
- 所有列表都有相同的开始和结束节点(不是必需的,但为了简单起见)
- 列表是同质的,并且可能共享项目
我想在所有 n 列表中找到所有节点的部分排序,从开始节点开始并以结束节点结束,这样出现在 中的任何节点em>nx 个列表,其中 x ,将相对于它出现的所有列表中的其他节点进行排序。
使用数组提供一组示例列表:
first = [a, b, d, f, h, i];
second = [a, b, c, f, g, i];
third = [a, e, f, g, h, i];
显然,一个可能的答案是 [a, b, c, d, e, f, g, h, i],但另一种可接受的顺序是 [a, b, d, e, c, f, g , h, i]。
我知道有一种快速算法可以做到这一点,有人记得它是怎么做的或叫什么吗?我已经有一些慢版本,但我确信在 Knuth 的某个地方有一个快得多的版本。
(而且,在你问之前,这不是为了家庭作业或欧拉计划,我不能说得更具体。这是问题。)
编辑:我相对确定,仅当端点位于所有列表中且位于相同位置(开始和结束)时才定义部分排序。我不会反对使用线性时间搜索来找到这些端点,如果找不到它们,那么那里可能会引发错误。
【问题讨论】:
-
如果列表有冲突的顺序,答案会是什么,例如
first = [a, b]和second = [b, a]? -
antinome:正如上面编辑中提到的,如果无法获得有效的端点,我宁愿提前提出错误。
标签: algorithm list linked-list