按给定的顺序排序

时间:2015-07-08 08:27:18

标签: algorithm sorting math

我有n个变量(Var 1 ... Var n)并且不知道它们的确切值。这些n choose 2变量之间的n成对排序是已知的。例如,对于所有对,已知Var 5 <= Var 9Var 9 <= Var 10等等。此外,还已知这些成对排序是一致的,并且不会导致整体上的退化的简并情况。也就是说,在上面的例子中,不等式Var 10 <= Var 5将不存在。

这类问题最有效的排序算法是什么,它可以对所有变量进行排序?

2 个答案:

答案 0 :(得分:3)

成对排序是任何(基于比较的)排序唯一需要的,所以你的问题归结为“什么是最有效的基于比较的排序算法”。

在回答这个问题时,我建议您查看QuicksortHeapsortTimsort,可能Mergesort并查看哪些内容适合您的情况要求,编程复杂性等 我发现Quicksort是最快的一次性计划。

答案 1 :(得分:1)

问题不在于如何排序(使用您的语言的标准种类),而是如何将排序标准提供给排序算法。

在大多数语言中,您需要提供int comparison (T a, T b),其中T是元素的类型,返回-1,0或1,具体取决于谁更大。

因此,在给定一对元素的情况下,您需要快速访问存储(所有)成对排序的数据结构。

所以问题不在于Var 10 <= Var 5会出现(不一致),而是确保Var 5 <= Var 10存在更多吗?如果是这种情况,您可以使用一对元素的哈希集来测试O(1)中约束的存在,否则,您需要找到a和b之间的传递关系,这可能甚至不存在(它不清楚OP如果我们谈论部分或全部订单,即对于所有a,b,我们确保&lt; b或b&lt; a或a = b(总订单)。

对于大致最差的N ^ 2个条目,这个哈希非常大。构建它仍然需要探索成本高昂的传递链接。

以下链接可能意味着元素映射到(立即)较小元素的集合,当比较a到b时,if(map(a)包含b)或(map(b)包含a)你可以立即回答,否则你需要对地图(a)和地图(b)的元素进行递归,复杂性非常差。最终,你仍然会累积一组较小的值来构建你的测试。

也许如果你的约束数量a <= b很少,只需在不遵守约束条件时应用a和b的排列,并将约束条件迭代到固定点(所有约束条件都应用于效果)可能更有效率。至少它在记忆中是O(1)。

可以使用约束的子集多次使用稳定排序(保留无法比较的条目的顺序)进行排序。

最后的想法是,使用输入数据计算Max是O(约束数),因此您可以重复计算Max,将其添加到目标的末尾,删除使用它的约束,冲洗并重复。我使用堆栈来存储最大元素,直到给定的约束索引,因此您可以回溯到它而不是从头开始重新启动。