220 likes | 454 Vues
求两点之间的第 k 短路径. 陈皓. 应用. 长度之外额外 的 限制 模型估价 敏感性分析 ……. 传统方法. 启发式搜索( A *) 空间消耗太大!!! 速度太慢!!!. 新的算法. 路径如何表示? K 小生成树的表示方法 上一棵生成树 + 修改信息(插一条边,删一条边) 旧的路径 + 一条不在最短路树中的新边,以及一些关于最短路树边相关的调整信息. 最短路树. 最短路树 T 是图 G 的子集,是一棵根在单终点 t 的树,树上点到根的路径是原图中的一条最短路 例如,上右图是上左图的最短路树. 新的算法.
E N D
求两点之间的第k短路径 陈皓
应用 • 长度之外额外的限制 • 模型估价 • 敏感性分析 • ……
传统方法 • 启发式搜索(A*) • 空间消耗太大!!! • 速度太慢!!!
新的算法 • 路径如何表示? • K小生成树的表示方法 • 上一棵生成树 + 修改信息(插一条边,删一条边) • 旧的路径 + 一条不在最短路树中的新边,以及一些关于最短路树边相关的调整信息
最短路树 • 最短路树T是图G的子集,是一棵根在单终点t的树,树上点到根的路径是原图中的一条最短路 • 例如,上右图是上左图的最短路树
新的算法 • 对于每一条边e,定义选择e的代价 • 其中l表示边权,d(head(e), t)是边的头到终点t的距离,d(tail(e), t)是边尾到终点t的距离 • 不难看出,这就是选择这一条边会增加的距离,路径p的长度就是最短路长度加上所有边代价的和
新的算法 • 例子
新的算法 • 定义集合sidetracks(p)表示路径p上所有不在最短路树上的边集 • 这样,路径p与sidetracks(p)是等价的 • 用lastsidestrack(p)表示最后一次加入的边,下一条边只在边尾在T上这条边的头与t之间的路径上的边里面选
堆? • 因为,这种表示方法有堆的性质 • 可惜的是,堆的叉数并没有限制,所以还需改进
新的算法 • 目标:对于每一个顶点v,构建堆,将所有的尾在v到t的路径上的边按排列 • ,尾在v点的边按排列,最小边记为outroot(v),限制根只有一个孩子 • ,将v到t的路径上的点w的outroot按排列
新的算法 • 堆的构建方法:将中的每个outroot(w)加上一个新的儿子,就是中剩余的部分,于是是一个三叉堆 • 与同时构造
新的算法 • 构建一个新的图D(G),以及从v∈G到h(v)∈D(G)映射,满足以下性质: • D(G)有O(m + n log n)个顶点 • D(G)中的顶点对应图G-T中一条边 • D(G)每点出度至多为3 • D(G)中,由h(v)出发可达的点构成
新的算法 • 在D(G)的基础上,定义图P(G),构造方法如下: • 增加一个新点,根结点r,连一条初始边到h(s),边权为 • 对于原有的D(G)中的边(u,v),把边权设为,称作堆边 (注意u,v对应原图G-T的一条边) • 对P(G)中结点v,v对应原图中的边(u,w),则在P(G)中连边(v,h(w)),权值,称为叉边
新的算法 • 初始边:开始选择一条边 • 堆边:换成下一条可选择的边 • 叉边:选择一条新的边
新的算法 • 至此,我们只需对P(G)做广搜,从r开始第k短路径就是原图的第k短路 • P(G)的出度为4,是常数,每次只需用堆维护当前最小的路径,扩展新的路径,所以找到k短路的复杂度为O(k log k),算上求最短路以及构图的时间,总复杂度为O(m + n log n + k log k) • 若要求多终点的k短路,只需把原图反转,终点为s,构图方法与上述类似,复杂度O(m + n log n + k n log k)
改进时空性能 • 上述的算法的性能相比传统方法已经相当优秀 • 如果已经求出最短路,原图很稀疏,或者k很大,那么n log n和k log k的项就成为了瓶颈 • O(m + n + k)!!!
推荐习题 • SGU 314, Shortest Paths http://acm.sgu.ru/problem.php?contest=0&problem=314
参考资料 • [1] David Eppstein, Finding the kShortest Paths, 1997 • [2] 刘汝佳,黄亮,算法艺术与信息学竞赛,2003
The End Thanks for listening