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是输入列表中前置关系的总数(边数)
--菲尔