像列表形式的图表:
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(log n) 时间内完成,但是对于这个问题的最佳算法是什么?
像列表形式的图表:
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(log n) 时间内完成,但是对于这个问题的最佳算法是什么?
对所有单独的列表进行排序将是获得所需内容的最简单方法。但是,如果您有 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
}
}
这应该比顺序排序所有列表更快,因为要排序的列表更小。