按顺序对邻接列​​表中的列表进行排序

时间:2016-02-04 04:18:45

标签: algorithm sorting graph time-complexity

在有向图中,我想要一个O(n + m)算法对邻接列表中的列表进行排序,这样顶点的名称在每个列表中按递增顺序排序。 我能想到的唯一一个是在每个列表上执行插入排序,但这肯定不会在O(n + m)中运行。有人可以帮我弄这个吗? 感谢

3 个答案:

答案 0 :(得分:0)

我不相信这是可能的。您对O(n + m)时间的请求表明您正在寻找图表的topological sort。但是虽然这会对图表进行排序,但它不允许通过另一个度量(字符串节点名称)对节点/边缘进行排序所必需的比较。

也许您没有准确说明问题?

答案 1 :(得分:0)

我没有足够的分数通过评论问这个,所以我假设n是顶点数,m是边数。通过按顶点名称排序,我将假设您的意思是要按字母顺序排序。如果是这种情况,那么您可以使用线性时间排序算法来实现O(n + m),即Radix排序。只要顶点名称的长度不是很大,对每个列表使用Radix排序将占用总时间为O(n + m)。查看wiki进行基数排序:

https://en.wikipedia.org/wiki/Radix_sort

答案 2 :(得分:0)

此解决方案未利用基数排序,而是依赖于邻接表本身中的顶点顺序以及传入/传出边缘的概念。

这是假设我们以邻接表的形式存在图G,其顶点已经已排序。特别是,用于邻接表的数据结构必须是链表的数组(或允许随机访问的任何数据结构)。数组的每个索引对应于图中的一个顶点,并且链表包含其相邻的顶点。令n和m分别为顶点和边的数量。 为了说明这一点,假设我们有以下有向图G:

G:

[1]-> 4,5,2

[2]-> 3,1

[3]-> x(无邻居)

[4]-> 1,2

[5]-> 4

  1. 创建一个顶点的单独副本作为另一个邻接列表,其中所有链接列表均为空。我们称之为G'。此步骤将花费O(n)时间。

G':
[1]->

[2]->

[3]->

[4]->

[5]->

  1. 我们遍历G的每个顶点,并为每个检查的邻居将父顶点添加到G'中的相应邻居顶点。因此,例如,如果在G中有[1]-> 4,5,2,我们将在G'中添加[4]-> 1,[5]-> 1和[2]-> 1,如所示下方:

G':
[1]->

[2]-> 1

[3]->

[4]-> 1

[5]-> 1

对G中的所有顶点重复此操作。此过程将花费O(n + m)时间。

  1. 在第2步之后,我们将完成G',这是一个表示G中顶点进入边缘的有向图。在G'中,可以观察到相邻的顶点按照递增顺序排序 。这是因为在步骤2中,我们迭代了父顶点的有序数组([1],[2],[3],[4],[5]),因此第一个被添加到G' (在这种情况下,首先将1添加到[2],[4]和[5],因为2,4和5与G中的[1]相邻)。然后是2,然后是3,依此类推。 G'如下:

G':

[1]-> 2,4

[2]-> 1,4

[3]-> 2

[4]-> 1,5

[5]-> 1

  1. 要再次将G'变成外边缘有向图,例如G,我们再次执行了步骤2,但是现在切换了G和G'的位置。我们将遍历G',然后将结果写入G。结果是经过排序的G,如下所示:

G排序:

[1]-> 2,4,5

[2]-> 1,3

[3]-> x

[4]-> 1,2

[5]-> 4

类似于步骤2,此过程将花费O(n + m)时间。

  1. 恭喜,您已获得O(n + m)时间的排序有向图

无向版本比此版本更容易,因为您只需执行一次步骤2,而不必在步骤4中再次执行(输入边缘和输出边缘之间没有区别)