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
C# 多个有序列表归结为一个列表,其中顺序是相对的_C#_Sorting_Diff - Fatal编程技术网

C# 多个有序列表归结为一个列表,其中顺序是相对的

C# 多个有序列表归结为一个列表,其中顺序是相对的,c#,sorting,diff,C#,Sorting,Diff,我有多个有序列表。不幸的是,项目的顺序不是简单的字母或数字比较,否则这是微不足道的。所以我得到的是: List #1 List #2 List #3 groundhog groundhog easter mothersday mayday mothersday midsummer laborday halloween christmas 从这里我可以收集到比土拨鼠还多的信息,但是土拨鼠和复活节的关系是未知的。

我有多个有序列表。不幸的是,项目的顺序不是简单的字母或数字比较,否则这是微不足道的。所以我得到的是:

List #1        List #2       List #3
groundhog      groundhog     easter
mothersday     mayday        mothersday
midsummer      laborday      halloween
christmas
从这里我可以收集到比土拨鼠还多的信息,但是土拨鼠和复活节的关系是未知的。我保证项目从一个列表到另一个列表的顺序是自一致的。(即,无论发生在哪一个列表中,复活节总是在万圣节之前)

但我需要的是一个新的有序列表,它只代表其他列表中的每一项一次,保留上述所有已知关系:

groundhog
easter
mayday
mothersday
midsummer
laborday
halloween
christmas
但是,以下列表也完全有效:

easter
groundhog
mothersday
mayday
midsummer
laborday
halloween
christmas
我正在寻找一种相当快速、通用的算法,可以用这种方法对N个列表进行排序。(当然,工作C#代码a+,但不是必需的。)


我有一个可行的解决方案,但它是O(N^2)和一只拥有适度数据集的狗。

您可能想看看。我认为它非常适用于您的情况。

我将使用Array.Sort方法和比较方法,该方法将比较两个字符串,然后检查它们在任何列表中的存在;任何同时包含它们的列表,找到它们的相对位置,并基于此返回;如果没有列表同时包含它们,则返回相等

MSN文档说明他们的排序算法使用快速排序;平均nlog(n)阶,最坏情况为n^2阶


这样,您就可以利用他们实现的排序算法;您所要做的就是实现比较代码。

我同意@bdumitriu,您需要拓扑排序

这种类型的排序假设您的数据项之间有一个偏序,这意味着对于某些项对,您可以比较它们,以查看哪一个在另一个之前。在这种情况下,正如您所说,有多种方法可以创建一个保留所有约束的项目列表

拓扑排序通常通过首先创建项目的有向无环图来工作,其中每个项目都成为一个顶点,从节点X到节点Y的有向边意味着输入列表中项目X位于项目Y之前。(因此,您需要遍历一组输入排序列表,每次遇到一个新项目时,您都会为它创建一个顶点,对于每个排序列表中的每一个连续项目对,您都会从第一个项目到第二个项目创建一条定向边。请注意,您不需要创建从一个项目到每个inp中所有以前项目的定向边。)ut列表;例如,在输入列表1中,您将创建边
groundhog
->
mothersday
mothersday
midsummer
,以及
midsummer
->
christmas

拓扑排序需要时间O(V+E),其中V是要排序的项目总数(顶点数),E是输入列表中前置关系的总数(边数)

--菲尔