拓扑排序摘要拓扑排序是求解网络问题所需的主要算法。
管理技术如计划评审技术和关键路径法都应用这一算法。
通常,软件开发、施工过程、生产流程、程序流程等都可作为一个工程。
一个工程可分成若干子工程,子工程常称为活动。
活动的执行常常伴随着某些先决条件,一些活动必须先于另一活动被完成。
利用有向图可以把这种领先关系清楚地表示出来。
而有向图的存储可以用邻接表和逆邻接表做存储结构来实现。
最后用拓扑排序表示出来就可以了。
拓扑排序有两种,一种是无前趋的顶点优先算法,一种是无后继的顶点优先算法,后一种的排序也就是逆拓扑排序。
关键词:拓扑排序;逆拓扑排序;有向图;邻接表;逆邻接表THE OPERATOR ORDERING PROBLEM IN QUANTUMHAMITONIAN FOR SOME CONSTRAINT SYSTEMSABSTRACTTopological sort is the main method to solve network problems. Management techniques such as PERT and critical path method is the application of this algorithm. Typically, software development, the construction process, production processes, procedures, processes, etc. can be used as a project. A project can be divided into several sub-projects, often referred to as sub-project activities. The implementation of activities often associated with certain preconditions, some of the activities must be completed before another activity. Use has lead to the relationship of this figure can be expressed clearly. While storage can be used to map the inverse adjacency list and adjacency table to do storage structures. Finally, topological sort that out on it. Topological sort, there are two, one is the predecessor of the vertex without first algorithm, a successor of the vertex is no priority algorithm, the latter sort is the inverse topological sort.Key words:topological sort; inverse topological; have to figure; adjlink; inverse adjlink目录1需求分析 (1)1.1设计内容 (1)1.2设计要求 (1)2概要设计 (1)2.1邻接表 (1)2.2逆邻接表 (2)2.3有向图的拓扑排序........................................................................... (3)2.4有向图的逆拓扑排序.............. ........ (4)3详细设计 (4)3.1 有向图拓扑排序和逆拓扑排序 (4)3.1 .1 邻接表存储 (4)3.1.2 逆邻接表存储 (9)4 调试分析 (11)4.1 回顾讨论和分析 (11)4.2 算法复杂度的分析 (11)4.3 经验和体会 (12)5用户使用说明 (12)6 测试数据和测试结果 (12)参考文献 (15)附录 (16)1 需求分析1.1设计内容编写函数实现有向图的拓扑排序以及逆拓扑排序,要求有向图用邻接表和逆邻接表作为存储结构分别实现,并比较两者算法时间复杂度。
1.2 设计要求1.将有向图分别用邻接表与逆邻接表存储2.实现有向图的拓扑排序和逆拓扑排序3.比较两种排序的时间复杂度2 概要设计图是一种非常有用的数据结构。
因为图的结构复杂而使用广泛,所以其存储表示方法也是多种多样,对应于不用的应用问题有不用的表示方法。
2.1 邻接表邻接表是图的一种链式存储结构。
用邻接表法表示图需要保存一个顺序存储的结点表和n个链接存储的边表。
结点表的每个表目对应于一个结点,每个表目包括两个字段:一个是结点的数据或指向结点数据的指针,另一个是指向此结点的边表的指针。
图的每个结点都有一个边表,一个结点的边表的每个表目对应于与该结点相关联的一条边,每个表目包括两个字段:一个是与此边相关联的另一个结点的序号,另一个是指向边表的下一个表目的指针。
用邻接表法表示有向图,根据需要可以保存每个结点的出边表(即以该结点为始点的边的表),也可以保存每个结点的入边表(即以该结点为终点的边的表)。
只保存入边表和出边表之一,则存储n个结点m条边的有向图需要n+m个单元。
在这种存储方法中,对于图中的每一个顶点分别建立一个线性链表。
每个链表前面设置一个头结点,称之为顶点结点。
每个顶点结点由两个域组成,如图1-1:图1-1 邻接表的顶点结点构造邻接表的第i个链表中的每一个链结点称之为边界点,它表示依附于第i个顶点的一条边,其链结点构造为图1-2 邻接表的边结点构造一个图的邻接表存储结构可形式地说明如下://------图的邻接表存储表示-----------------#define MAX_VERTEX_NUM 20typedef struct ArcNode{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc; // 指向下一条弧的指针InfoType *info; //该弧相关信息的指针}ArcNode;typeder struct VNode{V ertexType data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typeder struct{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;2.2 逆邻接表图的逆邻接表反应的是结点的入度邻接情况。
也就是说,按照建立邻接表的基本思想,对于有向图中每一个顶点,建立以该顶点为终点(弧头)的一个链表,即把所有以该顶点为终止顶点的边结点链接为一个线性链表。
在有向图中,为图中每个顶点vi建立一个入边表的方法称为逆邻接表的表示法。
入边表中的每个表结点均对应一条以vi为终点(即射入vi)的边。
2.3有向图的拓扑排序拓扑排序是有向图的一种重要运算。
给出有向图G=(V,E),V里结点的线性序列(Vi1,Vi2,……,Vin)称做一个拓扑序列,若此结点序列满足如下条件:若在有向图G中从结点Vi到结点Vj有一条路径,则在序列中结点Vi必在结点Vj之前。
任何无环的有向图,其结点都可以排在一个拓扑序列里,下面给出进行拓扑排序的方法:(1)从图中选择一个入度为0的结点且输出之。
(2)从图中删掉次结点及其所有的出边。
反复执行这两个步骤,直到所有的结点都输出了,也就是整个拓扑排序完成了,或者直到剩下的图中再也没有入度为0的结点,这就说明此图是有环图,拓扑排序不能再进行下去了。
其抽象算法可以表示为:TopSort(G){//优先输出无前趋的顶点while(G中有人度为0的顶点)do{从G中选择一个人度为0的顶点v且输出之;从G中删去v及其所有出边;}if(输出的顶点数目<|V(G)|)//若此条件不成立,则表示所有顶点均已输出,排序成功。
Error("G中存在有向环,排序失败!");}拓扑排序可以在有向图不同的存储表示上实现。
且每个图的拓扑序列并不唯一,即一个图有多个拓扑序列。
若有向图用邻接表法表示,则可以大大提高进行拓扑排序的效率。
在结点表里每个结点加进一个in字段,其内容是该结点的入度,这样,不用检查n*n的矩阵,只要检查n个元素的数组就能找出入度为0的结点,进一步我们用入度为0的结点的in字段构造一个链接方式存储的栈,把所有入度为0的结点都推入栈中,于是每次找入度为0的结点不必检查整个结点表,只要从栈顶取一个结点就行了。
对于从栈顶托出的入度为0的结点,检查它的出边表,对每条出边的终点,把它在结点表里对应的表目的in字段值减1,若某个结点的入度减为0了,就把它推到栈里去。
用这样的方法进行拓扑排序,初始地建立入度为0的结点的栈检查所有结点一次,排序中每个结点输出一次,每条边被检查一次,执行时间为O(n+m)。
2.4 有向图的逆拓扑排序无环的有向图的顶点一定在拓扑排序中。
与拓扑排序的思想恰好相反,逆拓扑排序是依次输出出度为0的点。
当有向图中无环时,可以利用深度优先遍历进行逆拓扑排序。
由于图中无环,从图中的某点出发进行深度优先搜索遍历时,最先推出DFS函数的顶点即是出度为0的顶点,它是拓扑有序序列中的最后一个顶点。
由此按推出DFS函数的先后记录下来的顶点序列即为逆向的拓扑序列(逆拓扑序列)。
在对该算法求精时,可用逆邻接表作为G的存储结构。
设置一个向量outdegree[0.. 或在逆邻接表的定点表结点中增加1个出度域来保存各顶点当前的出度;设置一个栈或一个队列来暂存所有出度为0的顶点。
除了增加一个栈或相邻向量T来保存输出的顶点序列外,该算法完全类似于拓扑排序。
抽象算法描述算法的抽象描述为:NonTopSort(G){//优先输出无后继的顶点while(G中有出度为0的顶点)do {从G中选一出度为0的顶点v且输出v;从G中删去v及v的所有人边}if(输出的顶点数目<|V(G)|)Error("G中存在有向环,排序失败!");}3 详细设计逆拓扑排序的结果只需要将所得到的拓扑排序反过来即可。
故编程序的重点在于得到有向图的拓扑排序。
3.1有向图的拓扑排序3.1.1 邻接表存储分析课题的要求首先则需要一个有向图,因而需要构建一个有向图,其中包括图的各种信息,有弧数,顶点数,有向边的起点与终点。