1.最短路径问题:
最短路径我们常识的是Dijkstra、Bellman-Ford,SPFA、 Floyd、Johnson算法,下面主要讲解其原理和差距。
在这之前,我们认识一下松弛操作。
松弛操作:首先测试一下是否可以对从s到v的最短路径进行改善(即有没有更短的路径)。如果可以改善,则v.d更新为新的最短路径估计值,v的前驱v.π更新为新的前驱结点。
对于松弛操作过程有如上的性质。
1.Bellman-ford算法
上面的性质主要用来证明此算法的正确性。
算法思想是对有V个顶点的图进行V-1轮松弛操作,每轮遍历所有边,如果不能继续松弛,则求最短路径成功。
证明: 设p为为一条s到v的最短路径,p是简单路径则其边数k<=V-1,那么由路径松弛性质,在第k轮松弛时,由于包含(Vk-1,V)这条边,有路径松弛性质,s到v的最短路径已得。
此外如果从动态规划来考虑,不妨设d[k][v]表示从s到v经历k条边的最短路径,显然k最多为V-1,然后从k为1到V-1一直更新。然后用一维滚动数组就可以化为我们熟悉的模式了,因为数据会被覆盖,理论上应该不能用滚动数组优化,但是:只要数据可以被更新,就代表v到u的距离可以边更小,是不影响整体数据向更小方向推进的。
此算法不能有负环
O(VE)
2.Dijkstra算法
这个算法是贪心算法。
其设置一个集合S,存放访问的结点,每次从选择 V-S选择距离s最短的顶点入S记u,然后更新从s到u通过u能到达其他结点的距离(松弛操作),直至选完。
如何证明:用循环不变式证明,演变成只要证明每一次加入S集合的点是已经最短了的即可(反证法并利用路径松弛性质,假设还有一点y连接u不在S中即可)
此算法不能有负边
O(V²),O(Vlog(V))
3.SPFA
在Bellman-Ford算法中,每轮都要对所有边进行松弛操作,实际是只要上一轮被松弛操作后的边所能到达的边才可能会松弛操作发生改变,不妨用一个队列维护被松弛后的结点,取出这个结点时将可以其所连边可以进行松弛操作的结点再入队,直到队列为空或者某个结点入队超过V-1次(负环)
O(kE),k2左右
4.Floyd算法
典型老动归了
证明最优子结构:
不妨设中间结点:一条简单路径p=<v1,v2,…,vl>上的中间结点是指路径p上除v1和vl之外的其它任意结点。
设一条最短路径的pij中间结点在S(1…k)中,则其子路径的中间结点在S’(1…k-1)中(假设中间结点是否有k证明)
其有最优子结构,当所有中间结点被包括进去后,最短路径已得。
分析上诉算法的时间复杂度为O(V三次方),可以适用于不出现负环的图,上面说到Dijkstra算法一轮可以达到O(Vlg(V)),如果运行V次也比Floyd-Warshall算法较优,但是不能解决边权有负值的问题
5.Johnson算法
实际上,在稀疏图中,可以使用Johnson算法达到O(V²lg(V)+VE)的复杂度,比比Floyd-Warshall算法较优,实际上它的本质就是给所以边加上一定权重后变成非负边,再多次使用Johnson算法。
这里的关键是怎样加权重,并且所加权重不影响最短路径!!
注意前面差分法约束系统我们所构造的约束图有:
移项可以使得
2.数据库问题的反思
1.关于数据库概念设计和逻辑设计的大题
第一步确定联系,正过去,倒过来看是1:1还是1:n还是n:m
第二步画ER图,标记联系的属性。
第三步先写出实体集的关系模式,对于1:1,1:n的联系,可将1端的码加上联系属性并入后者(简洁)
第四步对于n:m的联系,需要以联系为名增加一个关系模式,这个关系模式包含两者的码和联系属性。
最后题意标记外码和码
2.数据库设计过程各个阶段的关键
需求分析:分析用户应用需求,建立好数据字典(数据项,数据结构,数据流,数据存储)
概念结构设计:E-R图
逻辑结构设计:将概念模型转化成某种数据模型
物理结构设计:为关系模式设计存取方法、确定关系、索引存储结构
数据库的实施:装入数据试运行
数据库的运行维护:安全性、完整性、恢复
3.关于物理结构设计的知识拓展
这个部分主要两步:为关系模式设计存取方法;确定关系、索引物理存储结构
存取方法有三种:
索引存取、聚簇存取、hash存取。
B+树:是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且可以基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。
因为被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,支持范围查询,排序,应用大多情况
hash: hash查询效率高,但只是存储了指针,并没有存储字段值,无法范围查询,无法进行排序 ,多应用于等值连接条件。
聚簇索引:
把相同值的元组放在一个物理块,减少I/O操作,多适用于经常连接操作关系或者关系上某组属性值重复率高
一般索引是关键字和记录位置的映射关系
聚簇索引:不是关键字和记录映射,而是关键字和记录就存储在一起。