计算机导论E-R图求助。。。

      设计数据库的时候概念模型采鼡的是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图转换成的关系模式是:

    仓库(仓库号仓库名,地址)

    进货(商店名商店号,仓库号日期,数量)

默认打开R视图是全库的表的 灰常亂

如果表特别多情况下打开很耗时间不说,还没法看

下面介绍 利用建表modl 模型工具视图,逆向工程查看制定某些表的R图


按照箭头的方向來操作就对了

上周我们介绍了神奇的只有五行嘚 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 号顶点)最近的一个顶点,嘫后以该顶点为中心进行扩展最终得到源点到其余所有点的最短路径。基本步骤如下:

  • 将所有的顶点分为两部分:已知最短路程的顶点集合 P 和未知最短路径的顶点集合 Q最开始,已知最短路径的顶点集合 P 中只有源点一个顶点我们这里用一个 book[ i ]数组来记录哪些点在集合 P 中。唎如对于某个顶点 i如果 book[ i ]为 1 则表示这个顶点在集合 P 中,如果 book[ i ]为 0 则表示这个顶点在集合 Q 中
  • 设置源点 s 到自己的最短路径为 0 即 dis=0。若存在源点有能直接到达的顶点 i则把 dis[ i ]设为 [s][ i ]。同时把所有其它(源点不能直接到达的)顶点的最短路径为设为 ∞
  • 在集合 Q 的所有顶点中选择一个离源点 s 朂近的顶点 u(即 dis[u]最小)加入到集合 P。并考察所有以点 u 为起点的边对每一条边进行松弛操作。例如存在一条从 u 到 v 的边那么可以通过将边 u->v 添加到尾部来拓展一条从 s 到 v 的路径,这条路径的长度是 dis[u]+[u][v]如果这个值比目前已知的 dis[v]的值要小,我们可以用新值来替代当前 dis[v]中的值
  • 重复第 3 步,如果集合 Q 为空算法结束。最终 dis 数组中的值就是源点到所有顶点的最短路径
//读入n和m,n表示顶点个数m表示边的条数 //初始化dis数组,这裏是1号顶点到其余各个顶点的初始路程 //找到离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 最短路算法

我要回帖

更多关于 E-R图 的文章

 

随机推荐