2016-01-13 42 views
4

我已经实现了使用两种其他算法来计算图中最短路径的算法:Dijkstra和Bellman-Ford。基于这些算法的时间复杂度,我可以计算出我的实现的运行时间,这很容易给出代码。确定具有两个参数的算法的运行时间

现在,我想通过实验验证我的计算。具体来说,我想绘制运行时间作为输入大小的函数(我遵循here所述的方法)。问题是我有两个参数 - 边数和顶点数。

我试图修复一个参数并改变另一个参数,但是这种方法导致了两个图 - 一个用于变化数量的边,另一个用于变化的顶点数。

这引出我的问题 - 我如何根据两个图确定增长的顺序?一般来说,如何通过实验确定具有多个参数的算法的运行时间复杂度?

回答

2

这是非常困难的一般。

你会实验评估在单变量情况下的运行时间,插入递增,当你的数据结构做了基本的(推定O(1))操作,然后拿数据为许多不同的输入大小计数器的常用方法,和剧情它在一个log-log情节。那就是,log T与​​。如果运行时间的形式为n^k,则应该看到一条直线斜率为k,或者接近此值。如果运行时间如T(n) = n^{k log n}或其他什么,那么你应该看到一个抛物线。如果Tn处于指数状态,您仍然应该看到指数增长。

你只能希望得到有关最高阶项的信息,当你做到这一点 - 低位条款得到过滤掉,在具有越来越少的影响,因为n变大的感觉。

在这两个变量的情况下,你可以尝试做一个类似的方法 - 本质上,采取3维数据,做一个log-log-log情节,并尝试适应飞机。

但是,如果真的只有一个主导词在大多数政权中占主导地位,那么这只会真正起作用。

假设我的实际功能是T(n, m) = n^4 + n^3 * m^3 + m^4

当时m = O(1),然后T(n) = O(n^4)。 当时n = O(1),然后T(n) = O(m^4)。 当时n = m,然后T(n) = O(n^6)

在这些方案的每一个中,沿着可能的平面的“切片”值,不同的术语之一是主导术语。

所以没有办法确定功能,只是从固定的m和固定的n获得一些点。如果你这样做了,你不会得到n = m的正确答案 - 你将无法发现像这样的“中等”主要条款。

我建议,最好的办法预测渐近增长,当你有很多的变量/复杂的数据结构,是用铅笔和一张纸,并做传统算法分析。或者可能是一种混合方法。试图打破效率的问题,为不同的部分 - 如果你可以分裂的问题分成几个不同的功能和或产品,也许他们中的一些你可以在抽象的决定,以及一些你可以实验估算。

0

我要写我自己的解释,但它不会比this好。

1

幸运的是,两个输入参数在3D散点图中仍易于可视化(第三维是测量的运行时间),您可以检查它是否看起来像平面(以对数对数对数标度)或者它是否是弯曲的。测量中的自然随机变化也在这里起作用。

在Matlab中我通常计算最小二乘解到双变量函数是这样的(只是串接不同的功率和的x组合和y水平,.*是一个元素之积):

x = log(parameter_x); 
y = log(parameter_y); 

% Find a least-squares fit 
p = [x.^2, x.*y, y.^2, x, y, ones(length(x),1)] \ log(time) 

然后,这可用于估算较大问题实例的运行时间,理想情况下,这些将通过实验确认,以确定拟合模型的工作原理。

这种方法也适用于更高的层面,但得到乏味的产生,也许是实现一个更一般的方式,这只是一个变通为我的知识的缺乏。