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 - Fatal编程技术网

Algorithm 排序一个列表,知道一些元素的比较结果?

Algorithm 排序一个列表,知道一些元素的比较结果?,algorithm,sorting,Algorithm,Sorting,目标是使用m个比较结果(布尔值)的列表C对n个未知变量{x0,x1,x2,…X(n-1)}的列表X进行排序。每次比较是在n个变量中的两个变量之间进行的,例如x2

目标是使用m个比较结果(布尔值)的列表C对n个未知变量{x0,x1,x2,…X(n-1)}的列表X进行排序。每次比较是在n个变量中的两个变量之间进行的,例如x2 所以问题是我能证明我的列表C/m比较足以对列表X进行排序吗?很明显,如果C是最大的可能长度(有所有可能的比较)。但是短名单呢


然后,如果已经证明C包含足够的信息进行排序,那么我该如何实际执行排序。

您的问题可以归结为众所周知的问题

证明“C包含足够的信息进行排序”就是证明拓扑排序的唯一性:

如果拓扑排序的属性是排序顺序中的所有连续顶点对都由边连接,则这些边在DAG中形成有向哈密顿路径。如果存在哈密顿路径,则拓扑排序顺序是唯一的;没有其他顺序考虑路径的边。相反,如果拓扑排序不形成哈密顿路径,则DAG将具有两个或多个有效拓扑排序,因为在这种情况下,始终可以通过交换两个未通过边相互连接的连续顶点来形成第二个有效排序。因此,尽管更一般的有向图的哈密顿路径问题具有NP难度,但可以在线性时间内测试是否存在唯一的顺序,以及哈密顿路径是否存在(Vernet&Markenzon 1997)。
让我们假设您拥有要排序的对象集合,并从中形成一个图形,每个对象有一个节点。然后会给您一个成对的列表,指示比较是如何进行的。您可以将这些视为图形中的边:如果知道对象x的比较小于对象y,则可以从x到y绘制边

假设比较的结果是一致的——也就是说,你没有任何循环——你应该有一个有向无环图

考虑一下如果对这个DAG进行拓扑排序会发生什么。最终得到的是一个可能的值顺序,它与所有约束一致。这样做的原因是,在拓扑排序中,如果有从y到x的任何可传递的边序列,则不会将元素x放在元素y之前,如果有一个传递性的比较链指示y在x之前,则会有一个从y到x的可传递的边序列

实际上,您可以提出一个更有力的主张:DAG的所有拓扑排序的集合正是满足所有约束的所有可能排序的集合。我们已经论证过,每个拓扑序都满足所有约束,所以我们现在需要做的就是论证,每个满足所有约束的序列都是一个有效的拓扑序。这里的论点本质上是,如果你遵守所有的约束,你永远不会把序列中的任何元素放在它传递比较小于的东西之前,所以你永远不会把序列中的任何元素放在有路径的东西之前

这给了我们一个很好的方法来解决这个问题:用这种方法形成的图,看看它是否有一个拓扑顺序。如果是,则该排序是唯一的排序顺序。如果没有,则有两个或更多订单

那么,如何最好地进行这项工作呢?进行拓扑排序的标准算法之一是,用索引注释每个节点,然后重复拉出索引为零的节点并调整其后续节点的索引。如果在执行该算法的过程中,每个阶段都有一个索引为零的节点,则DAG只有一个拓扑顺序,因为在这种情况下,拓扑顺序是强制的

通过正确的设置和数据结构,您可以在时间O(n+m)中实现此功能,其中n是节点数,m是约束数。我将把这些细节作为众所周知的练习留给读者。:-)