Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 基于许多不完整的顺序集恢复原始顺序_Algorithm_Sorting_Set - Fatal编程技术网

Algorithm 基于许多不完整的顺序集恢复原始顺序

Algorithm 基于许多不完整的顺序集恢复原始顺序,algorithm,sorting,set,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 等等 我还有所有原始元素的列表,没有任何顺序 我需要恢复尽可能多的原始数据。我不能保证我有足够的信息来恢复一切。我需要充分了解我所拥有的,并找出哪些部件是可靠的 可能会

假设我的原始数据是

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之间正好有一个未知项”
我想将这些信息合并到算法中,以恢复更多数据

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

在排序函数中使用不完整数组,如下所示:如果存在一个不完整的集合,其中B在A之前,则得出A>B的结论。如果没有同时存在A和B的集合,则返回A==B

我不喜欢的是,我不知道哪些部分是完全恢复的,哪些是随机的。为了帮助我洗牌原始元素列表,再次排序,看看哪些元素改变位置,哪些不改变位置。这样做几千次(列表中的元素数量小于50,因此我可以使用最为推土机式的方法解决这个问题)


有更好的建议吗?

从不完整的集合中构建有向图,然后


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

我想,如果你选取一个最长的字符串,并尝试用两个相邻的符号(也包括开始和结束)将该字符串与所有其他字符串进行比较,可能会出现一些算法:如果在其他字符串中它之间存在某些内容,则将其添加到最长的字符串中,然后重新开始。如果没有要添加的内容,请检查下一对

按照MBo的建议构建一个有向图。如果生成的图是一个有向无环图(DAG),这将被视为原始数据的验证,并且可以执行拓扑排序来恢复有关原始顺序的信息

如果您认为所有信息都是可靠的,那么可以将一些附加信息合并到图表中。例如,“5到6之间肯定没有任何东西”意味着(如果理解为5->6),从v到6(v不等于5)的图形的每条边都可以被从v到5的边替换。“3到4之间可能有,也可能没有”:这告诉我们的是3->4,如果它说的那么多的话

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


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

这确实会找到一些与给定顺序一致的顺序,如果它存在(即,如果输入不描述有向循环的图)。但您还需要检测这种排序是否唯一;为此,请查找关键路径,而不是拓扑排序。如果某个顶点不在关键路径上,那么它的确切位置是不确定的。你可能还想用你的初始思想来考虑传递性。e、 g.如果A>B和B>C,那么A>C,即使C在A之前没有不完整的集合。我认为这不会改善排序的顺序,但我相信它可以用于使用正确的数据结构使排序更有效。