Algorithm 按递增顺序对邻接列表中的列表进行排序

Algorithm 按递增顺序对邻接列表中的列表进行排序,algorithm,sorting,graph,time-complexity,Algorithm,Sorting,Graph,Time Complexity,在有向图中,我需要一个O(n+m)算法来对邻接列表中的列表进行排序,以便在每个列表中按递增顺序对顶点的名称进行排序。 我能想到的唯一方法是对每个列表执行插入排序,但这肯定不会在O(n+m)中运行。有人能帮我吗? 谢谢我认为这是不可能的。您对O(n+m)时间的请求表明您正在寻找图的一个部分。但是,尽管这将对图形进行排序,但它不允许按另一个度量(字符串节点名称)对节点/边进行排序所需的比较 也许你没有准确地说明这个问题?我还没有足够的观点通过评论提出这个问题,所以我假设n是顶点的数量,m是边的数量。

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

我认为这是不可能的。您对O(n+m)时间的请求表明您正在寻找图的一个部分。但是,尽管这将对图形进行排序,但它不允许按另一个度量(字符串节点名称)对节点/边进行排序所需的比较


也许你没有准确地说明这个问题?

我还没有足够的观点通过评论提出这个问题,所以我假设n是顶点的数量,m是边的数量。通过按顶点名称排序,我将假设您的意思是要按字母顺序排序。如果是这样,那么您可能能够使用线性时间排序算法来实现O(n+m),即基数排序。只要顶点名称的长度不是很大,对每个列表使用基数排序将总共花费O(n+m)个时间。查看wiki以了解基数排序:


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

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

G:

[1] ->4,5,2

[2] ->3,1

[3] ->x(无邻居)

[4] ->1,2

[5] ->4

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

    [2] ->

    [3] ->

    [4] ->

    [5] ->

  • 我们遍历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)时间

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

    [1] ->2,4

    [2] ->1,4

    [3] ->2

    [4] ->1,5

    [5] ->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)时间

  • 祝贺您,您在O(n+m)时间内获得了一个排序有向图
  • 无向版本比此版本更简单,因为您只需执行步骤2一次,而不必在步骤4中再次执行(传入边和传出边之间没有区别)