【发布时间】:2015-04-25 19:43:40
【问题描述】:
假设我的原始数据是
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 .
我不喜欢它的是我不知道哪些部分是完全恢复的,哪些是随机的。为了帮助我将原始元素列表打乱,再次排序并查看哪些元素改变了位置,哪些没有。并做几千次(列表中的元素数量
有更好的建议吗?
【问题讨论】:
-
您可能还想在最初的想法中考虑传递属性。例如if A > B and B > C then A > C, 即使不存在 C 在 A 之前的不完整集合。我认为这不会改善排序的顺序,但我相信它可以用来进行排序使用正确的数据结构更高效。