Sorting 如何对图的链表表示中的每个链接进行最佳排序?
类似于列表形式的图形:Sorting 如何对图的链表表示中的每个链接进行最佳排序?,sorting,graph,linked-list,Sorting,Graph,Linked List,类似于列表形式的图形: 1 : 2 -> 3 2 : 3 -> 4 -> 1 3 : 2 -> 1 -> 4 4 : 3 -> 2 whew 1:2->3表示节点1连接到节点2和3 因此,输出应按每个节点列表排序: 1 : 2 -> 3 2 : 1 -> 3 -> 4 3 : 1 -> 2 -> 4 4 : 2 -> 3 因此,通过对每个列表进行排序,可以在n*O(logn)的时间内完成这项工作,但解决这个问题的最佳
1 : 2 -> 3
2 : 3 -> 4 -> 1
3 : 2 -> 1 -> 4
4 : 3 -> 2
whew 1:2->3表示节点1连接到节点2和3
因此,输出应按每个节点列表排序:
1 : 2 -> 3
2 : 1 -> 3 -> 4
3 : 1 -> 2 -> 4
4 : 2 -> 3
因此,通过对每个列表进行排序,可以在n*O(logn)的时间内完成这项工作,但解决这个问题的最佳算法是什么?对所有单独的列表进行排序将是获得所需内容的最简单方法。但是,如果有n个节点,则必须对n个列表进行排序。每个列表可以有n-1个条目。对n-1个条目的1个列表进行排序的复杂性为O(n*log(n))。您的总复杂性为O(n²*log(n)) 你可以通过按顺序排列你的列表并利用这些信息来尝试进行分类。从您的示例中,我假设您的图是无向的,这允许进行以下优化 首先举一个例子:
initialize the final sorted list of every node to null;
for(i=1;i<=nrNodes;i++){
remove all nodes with id<i from linked list;
A:=sort remainder of list
append A to the final sorted list of i;
for (every node n in A){
append i to final sorted list of node n
}
}
初始化每个节点的最终排序列表为空;
对于(i=1;i对所有单独的列表进行排序是获得所需内容的最简单方法。但是,如果有n个节点,则必须对n个列表进行排序。每个列表可以有n-1个条目。对n-1个条目的1个列表进行排序将具有复杂度O(n*log(n))。您的总复杂度将为O(n²*log(n))
您可以通过按顺序对列表进行排序并利用这些信息来尝试进行分类
首先举一个例子:
首先对第一个列表进行排序,在这里将产生2->3。
然后将完成第一个列表。然后可以将“1”添加到
节点2和3(如1)的列表将作为第一个出现在其列表中
这将为您提供这些列表的开始。然后您移动
转到节点2的列表
因为你已经知道它的开始
(1) ,您可以在排序期间跳过所有该节点。您可以
快速浏览链接列表并从集中删除1。然后
您对其余的进行排序(这将给出3->4),并将其附加到您需要的1
已经有了。和1一样,现在有了完整的排序列表2和1
您可以将“2”添加到3和4的列表中
然后继续3,快速删除所有已知节点,并对
这将给你4,你将它附加到你已经得到的1->2->4。将3添加到节点4的列表中
节点4的列表已经完成,因为列表中没有id>4的节点
更正式地说:
initialize the final sorted list of every node to null;
for(i=1;i<=nrNodes;i++){
remove all nodes with id<i from linked list;
A:=sort remainder of list
append A to the final sorted list of i;
for (every node n in A){
append i to final sorted list of node n
}
}
初始化每个节点的最终排序列表为空;
对于(i=1;i