根据许多不完整的有序集恢复原始订单

时间:2015-04-25 19:43:40

标签: algorithm sorting set

假设我的原始数据是

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

它已损坏,我只有一些不完整集,其中订单有效,但并非所有元素都存在。

1, 4, 6, 7, 8, 11, 12
1, 2, 4, 5, 6, 9, 10, 12
2, 4, 7, 9, 10, 11
4, 7, 9, 12

我还有没有任何订单的所有原始元素的列表。

我需要尽可能多地恢复原始数据。我不能保证我有足够的信息来恢复一切。我需要充分了解我所拥有的东西并找出哪些部分是可靠的。

可能会出现并发症(但我先解决了这个问题):

不完整集的顺序大多是有效的,但在这里和那里可能会有一些错误,它是由人类写的。

我可能有不完整集合中每对元素的附加信息,如

  • 5到6之间肯定没什么”,
  • 7到12之间肯定有其他东西,但我不确定有多少,究竟是什么”,
  • 3到4之间可能有或没有任何东西”,
  • 7到9之间只有一个未知项目

我想将这些信息合并到算法中以恢复更多数据。

到目前为止我最好的想法:

在排序函数中使用不完整的数组,如下所示:结束A> B如果存在B先于A的不完整集合。如果没有A和B都存在的集合,则返回A == B.

我不喜欢的是我不知道哪些部分是完全恢复的,哪些部分是随机的。为了帮助我将要对原始的元素列表进行洗牌,再次排序,看看哪些元素改变了位置,哪些元素没有改变。这样做几千次(列表中的元素数量<50,所以我可以在这个问题上使用最多的推土机方法)

有更好的建议吗?

3 个答案:

答案 0 :(得分:3)

从不完整的集合中构建有向图并制作topological sort

有些错误可能被发现为循环(有向非循环图中没有循环)

答案 1 :(得分:1)

按照MBo的建议构建有向图。如果生成的图形是有向非循环图(DAG),则计为原始数据的验证,并且可以执行拓扑排序以恢复有关原始订单的信息。

如果您认为所有信息都可靠,则可以将一些其他信息合并到图表中。例如,“5和6之间肯定没有”意味着(如果理解为5 - > 6)图表的每个边缘从v到6(v不等于5)可以被来自v到5.“3到4之间可能有或没有任何东西”:这一切告诉我们是3 - &gt; 4,如果它甚至说得那么多。

其他信息更难使用。 “7到12之间的东西”可以被合并到有向图中,如7 - > 12,但据我所知,“某事”部分不能。可能有一种方法可以通过放大图形来包含“某些”顶点来使用它,但我无法使其工作。相反,我建议让你的topsort算法吐出每个topsort(假设没有太多),并根据它们与之一致的额外约束来评估它们。作为奖励,你会发现有多少不同的答案是可能的。您也可以在赞助时使用它,例如,如果您正在寻找一个项目在7之后立即来,不要选择12,但这对我来说感觉很麻烦,如果你感到麻烦,你将无法获得任何结果。信息是矛盾的。

如果生成的图形不是DAG,您仍然可以将其分为强连接组件(例如,Tarjan算法)。强连接组件是不可靠的组件。强连接组件本身会形成一个可以顶部排列的DAG,但是每个大于1个顶点的组件都需要进一步的特殊处理。处理此问题的一种方法是尝试找到最小反馈弧集,即在强连接组件中消除的最小边数以将其转换为DAG。最小反馈弧集问题是NP难的,但问题是“固定参数易处理”:http://dl.acm.org/citation.cfm?doid=1411509.1411511。不太合理的方法也可能有用,比如识别循环并去除循环中的随机边缘,直到没有更多的循环。

答案 2 :(得分:0)

我想如果你拿一个最长的字符串并尝试通过两个neithebor符号(也包括开头和结尾)将这个字符串与所有其他字符串进行比较,我认为有一些算法:如果在其他字符串之间有某些字符串,则将其添加到最长的字符串,然后重新开始。如果没有要添加检查下一对。

相关问题