在有向图中,我想要一个O(n + m)算法对邻接列表中的列表进行排序,这样顶点的名称在每个列表中按递增顺序排序。 我能想到的唯一一个是在每个列表上执行插入排序,但这肯定不会在O(n + m)中运行。有人可以帮我弄这个吗? 感谢
答案 0 :(得分:0)
我不相信这是可能的。您对O(n + m)时间的请求表明您正在寻找图表的topological sort。但是虽然这会对图表进行排序,但它不允许通过另一个度量(字符串节点名称)对节点/边缘进行排序所必需的比较。
也许您没有准确说明问题?
答案 1 :(得分:0)
我没有足够的分数通过评论问这个,所以我假设n是顶点数,m是边数。通过按顶点名称排序,我将假设您的意思是要按字母顺序排序。如果是这种情况,那么您可以使用线性时间排序算法来实现O(n + m),即Radix排序。只要顶点名称的长度不是很大,对每个列表使用Radix排序将占用总时间为O(n + m)。查看wiki进行基数排序:
答案 2 :(得分:0)
此解决方案未利用基数排序,而是依赖于邻接表本身中的顶点顺序以及传入/传出边缘的概念。
这是假设我们以邻接表的形式存在图G,其顶点已经已排序。特别是,用于邻接表的数据结构必须是链表的数组(或允许随机访问的任何数据结构)。数组的每个索引对应于图中的一个顶点,并且链表包含其相邻的顶点。令n和m分别为顶点和边的数量。 为了说明这一点,假设我们有以下有向图G:
G:
[1]-> 4,5,2
[2]-> 3,1
[3]-> x(无邻居)
[4]-> 1,2
[5]-> 4
G':
[1]->
[2]->
[3]->
[4]->
[5]->
G':
[1]->
[2]-> 1
[3]->
[4]-> 1
[5]-> 1
对G中的所有顶点重复此操作。此过程将花费O(n + m)时间。
G':
[1]-> 2,4
[2]-> 1,4
[3]-> 2
[4]-> 1,5
[5]-> 1
G排序:
[1]-> 2,4,5
[2]-> 1,3
[3]-> x
[4]-> 1,2
[5]-> 4
类似于步骤2,此过程将花费O(n + m)时间。
无向版本比此版本更容易,因为您只需执行一次步骤2,而不必在步骤4中再次执行(输入边缘和输出边缘之间没有区别)