数据结构---排序(3)

几种排序

  • 拓扑排序
    • 原理介绍
    • 伪代码
    • 拓扑排序应用--关键路径问题

拓扑排序

首先理解几个概念,出度和入度

  • 出度:在图中,从某结点出发的箭头的个数叫做某结点的出度
  • 入度:在图中,指向某结点的箭头的个数叫做某结点的入度

原理介绍

拓扑排序就是基于出度和入度的概念来完成的,每一次输出一个入度为0的结点。如下图的图,我们需要完成课表的排序。使每门课都在修完预修课程之后排出。
数据结构---排序(3)_第1张图片
数据结构---排序(3)_第2张图片

伪代码

//拓扑排序
#void Topsor()
{
     
	for (cnt = 0; cnt < | V | ; cnt++)//|V|图中的结点个数
	{
     
		输出(V = 未输入的入度为0的顶点);
		if (这样的V不存在)
		{
     
			Error("图中有回路");
			break;
		}
		输出V.或记录V的输出序号;
		for (V的每个邻接点W)
			Indegree[W]--;
	}
}

对于输出入度为零的结点v,如果采取的全部遍历的做法,那么整体复杂度就是O(n的平方)

聪明的做法

//拓扑排序
#void Topsor()
{
     
	for (图中的每个顶点)
	{
     
		if (Indegree[V] == 0)
			Enqueue(V, Q);
	}
	while (!IsEmpty(Q))
	{
     
		V = Dequeue(Q);
		输出V,或者记录V的输出编号; cnt++
			for (V的每个邻接点W)
				if (--Indegree == 0)
					Enqueue(W, Q);
	}
	if (cnt !=结点个数)
		Error("图中有回路")
}

拓扑排序应用–关键路径问题

  • AOV网络,每一个顶点表示一个事件,一个活动
  • AOE网络
    每条边表示一道工序,一般用于表示项目的工序,边表示工序,结点表示工序到此结束。以一个工程为利,每个工程都有多道工序,在AOE网络中把每个结点都分为三部分:持续时间,机动时间,顶点编号(工序编号)
    数据结构---排序(3)_第3张图片
    数据结构---排序(3)_第4张图片
    关键路径就是绝对不允许延误的活动组成的路径。

你可能感兴趣的:(数据结构,数据结构,算法)