Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何对图的链表表示中的每个链接进行最佳排序?_Sorting_Graph_Linked List - Fatal编程技术网

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))

你可以通过按顺序排列你的列表并利用这些信息来尝试进行分类。从您的示例中,我假设您的图是无向的,这允许进行以下优化

首先举一个例子:

  • 首先对第一个列表进行排序,在这里将产生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对所有单独的列表进行排序是获得所需内容的最简单方法。但是,如果有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