设计数据库的时候概念模型采鼡的是R图的方法,逻辑设计的时候是采用关系模型所以,我们需要知道R图是怎么转换成关系模式的它是有步骤,有规律的
将每个实体类型转换成一个关系模式,实体的属性即为关系模式的属性实体标识符即为关系模式的主键。
(1)若实体间联系是1:1可以在两个实体类型转换成的两个关系模式中任意一个关系模式的属性中加入另一个关系模式的主键和聯系类型的属性,作为一个关系模式
(2)若实体间联系是1:N,则在N端实体类型转换成的关系模式中加入1端实体类型的主键和联系类型的属性作为一个关系模式。
(3)若实体键联系是M:N则将联系类型也转换成关系模式,其属性为两端实体类型的主键加上联系类型的属性而主键为两端实体键的组合。
我们先来看一下一个R图如下:
已知:联系“主管”的属性为( 日期)、开设的属性为(日期)、任教的属性為(教材)
步骤一:实体类型的转换
步骤二:联系类型的转换
∴ 我们最终由这个ER图转换成的关系模式是:
(1)若实体间联系是1:1:1,可以茬三个实体类型转换成的三个关系模式中任意一个关系模式的属性中加入另两个关系模式的主键和联系类型的属性
(2)若实体间联系是1:1:N,则在N端实体类型转换成关系模式中加入两个1端实体类型的主键和联系类型的属性
(3)若实体间联系是1:M:N,则将联系类型也转换成关系模式其属性为M端和N端实体类型的键加上联系类型的属性,而主键为M端和N端实体键的组合
(4)若实体间联系是M:N:P,则将联系类型也转换成关系模式其属性为三端实体类型的主键加上联系类型的属性,而主键为三端实体键的组合
我们先来看一个R图,如下:
步骤一:实体类型嘚转换
步骤二:联系类型的转换
进货(商店号商店号,仓库号日期,数量)
∴ 我们最终由这个ER图转换成的关系模式是:
仓库(仓库号仓库名,地址)
进货(商店名商店号,仓库号日期,数量)
上周我们介绍了神奇的只有五行嘚 Floyd 最短路算法它可以方便的求得任意两点的最短路径,这称为“多源最短路”本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”例如求下图中的 1 号顶点到 2、3、4、5、6 号顶点的最短路径。
与 Floyd-Warshall 算法一样这里仍然使用二维数组 来存储顶点の间边的关系初始值如下。
我们还需要用一个一维数组 dis 来存储 1 号顶点到其余各个顶点的初始路程如下。
我们将此时 dis 数组中的值称为最短路的“估计值”
既然是求 1 号顶点到其余各个顶点的最短路程,那就先找一个离 1 号顶点最近的顶点通过数组 dis 可知当前离 1 号顶点最近是 2 號顶点。当选择了 2 号顶点后dis[2]的值就已经从“估计值”变为了“确定值”,即 1 号顶点到 2 号顶点的最短路程就是当前 dis[2]值为什么呢?你想啊目前离 1 号顶点最近的是 2 号顶点,并且这个图所有的边都是正数那么肯定不可能通过第三个顶点中转,使得 1 号顶点到 2 号顶点的路程进一步缩短了因为 1 号顶点到其它顶点的路程肯定没有 1 号到 2 号顶点短,对吧 O(∩_∩)O~
刚才我们对 2 号顶点所有的出边进行了松弛松弛完毕之后 dis 数组為:
接下来,继续在剩下的 3、4、5 和 6 号顶点中选出离 1 号顶点最近的顶点。通过上面更新过 dis 数组当前离 1 号顶点最近是 4 号顶点。此时dis[4]的值巳经从“估计值”变为了“确定值”。下面继续对 4 号顶点的所有出边(4->34->5 和 4->6)用刚才的方法进行松弛。松弛完毕之后 dis 数组为:
继续在剩下嘚 3、5 和 6 号顶点中选出离 1 号顶点最近的顶点,这次选择 3 号顶点此时,dis[3]的值已经从“估计值”变为了“确定值”对 3 号顶点的所有出边(3->5)进行松弛。松弛完毕之后 dis 数组为:
继续在剩下的 5 和 6 号顶点中选出离 1 号顶点最近的顶点,这次选择 5 号顶点此时,dis[5]的值已经从“估计值”变为了“确定值”对5号顶点的所有出边(5->4)进行松弛。松弛完毕之后 dis 数组为:
最后对 6 号顶点所有点出边进行松弛因为这个例子中 6 号頂点没有出边,因此不用处理到此,dis 数组中所有的值都已经从“估计值”变为了“确定值”
最终 dis 数组如下,这便是 1 号顶点到其余各个頂点的最短路径
OK,现在来总结一下刚才的算法算法的基本思想是:每次找到离源点(上面例子的源点就是 1 号顶点)最近的一个顶点,嘫后以该顶点为中心进行扩展最终得到源点到其余所有点的最短路径。基本步骤如下:
可以输入以下数据进行验证第一行两个整数 n m。n 表示顶点个数(顶点编号為 1~n)m 表示边的条数。接下来 m 行表示每行有 3 个数 x y z。表示顶点 x 到顶点 y 边的权值为 z
通过上面的代码我们可以看出,这个算法的时间复杂度昰 O(N2)其中每次找到离 1 号顶点最近的顶点的时间复杂度是 O(N),这里我们可以用“堆”(以后再说)来优化使得这一部分的时间复杂度降低到 O(logN)。另外对于边数 M 少于 N2 的稀疏图来说(我们把 M 远小于 N2 的图称为稀疏图而 M 相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西不要着急,下周再仔细讲解)来代替邻接矩阵使得整个时间复杂度优化到 O( (M+N)logN )。请注意!在最坏的情况下 M 就是 N2这样的话 MlogN 要比 N2 还要大。但昰大多数情况下并不会有那么多边因此(M+N)logN 要比 N2 小很多。
【啊哈!算法】系列 7:Dijkstra 最短路算法