【问题标题】:Algorithm - combine multiple lists, resulting in unique list and retaining order算法 - 组合多个列表,产生唯一列表并保留顺序
【发布时间】:2010-04-28 07:48:17
【问题描述】:

我想将多个项目列表合并到一个列表中,同时保留整体订单要求。即:

1: A C E
2: D E
3: B A D

result: B A C D E

上面,从列表 1 开始,我们有 ACE,然后我们知道 D 必须在 E 之前,从列表 3 中,我们知道 B 必须在 A 之前,D 必须在 B 和 A 之后。

如果有冲突的顺序,应该使用第一个顺序。即

1: A C E
2: B D E
3: F D B

result: A C F B D E 

3 与 2 冲突(B D 与 D B),因此将使用 2 的要求。

如果订购要求意味着一件物品必须排在另一件之前或之后,那么只要保持整体顺序,它是紧挨在之前还是之后,或者在列表的开头或结尾都没有关系。

这是使用 VB.Net 开发的,因此 LINQy 解决方案(或任何 .Net 解决方案)会很好 - 否则方法的指针会很好。

编辑:编辑以使示例 2 有意义(最后一分钟的更改使其无效)

【问题讨论】:

  • 为什么第二个例子中的排序有冲突?在我看来A C B F D E 满足所有订单...

标签: vb.net list sorting


【解决方案1】:

您可能感兴趣的关键字是“拓扑排序”。基于此的解决方案如下所示:

  • 创建一个空的有向图。
  • 按顺序处理序列,对于序列中的每两个连续元素 X、Y,向图中添加一条边 X->Y,除非这会形成一个循环。
  • 对图的顶点执行拓扑排序。生成的序列应该满足您的要求。

【讨论】:

  • 感谢关于拓扑排序的提示——这不是我以前听说过的,而是我的问题的解决方案。在此处遵循此算法的基础知识:brpreiss.com/books/opus6/html/page559.html 我已经开发了一个解决方案。我能够对算法进行修改以防止图中出现循环(即,如果某个项目已作为特定节点的父/子存在,则如果将其添加为子/父,则忽略该项目。需要更多测试,但我我想我已经掌握了基础知识。再次感谢。
猜你喜欢
  • 2023-03-13
  • 2015-07-15
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多