依赖于收敛的算法的大O

时间:2018-03-19 20:43:11

标签: algorithm time-complexity big-o asymptotic-complexity

我想知道是否有可能表达依赖于使用Big O表示法收敛的算法的时间复杂度。

在我看过的大多数算法分析中,我们根据输入大小来评估函数的增长率。

如果算法具有一些收敛标准(我们重复操作直到某个定义的误差度量低于阈值,或者误差度量变化的速率低于某个阈值),我们如何测量时间的复杂性?收敛和退出该循环所需的迭代次数似乎难以推理,因为算法收敛的方式往往取决于输入的内容而不仅仅是它的大小。

我们如何表示依赖于Big O表示法收敛的算法的时间复杂度?

3 个答案:

答案 0 :(得分:6)

为了分析依赖于收敛的算法,似乎我们必须证明收敛速度。

融合通常具有终止条件,可检查我们的误差指标是否低于某个阈值:

do {
  // some operation with time complexity O(N)
} while (errorMetric > 0.01) // if this is false, we've reached convergence

一般来说,我们试图定义一些关于算法收敛方式的东西 - 通常是通过识别它是某种东西的函数。

例如,我们可能会证明算法的误差测量是迭代次数的函数,因此误差= 1/2 ^ i,其中i是迭代次数。

这可以根据迭代次数重写,如下所示:iterations = log(1 / E),其中E是所需的错误值。

因此,如果我们有一个算法在汇聚循环的每次迭代上执行一些线性运算(如上例所示),我们可以推测我们的时间复杂度为O(N * log(1 / E))。除了输入大小之外,我们函数的增长率取决于我们愿意容忍的错误量。

因此,如果我们能够确定关于收敛行为的某些属性,例如它是错误的函数还是输入的大小,那么我们就可以进行渐近分析。

例如,采用PageRank,在其计算中使用称为power iteration的算法,该算法是近似矩阵的主要特征向量的算法。似乎可以将收敛速率显示为前两个特征值的函数(在链接中显示)。

答案 1 :(得分:3)

渐近符号不依赖于收敛。

根据 CLRS 一书(算法导论第3版第3章第43页):

  

当我们查看足够大的输入大小以使其只有顺序时   相关的运行时间的增长,我们正在研究    渐近 算法的效率。也就是说,我们关心算法的运行时间如何随着他的大小而增加   限制中的输入,因为输入的大小增加而没有   界。通常,算法渐近更有效   除了非常小的投入外,它将是最佳选择。

您提到您的代码(或想法)具有不定式循环并继续满足条件并且您命名满足条件收敛但在此意义上,收敛与渐近符号如{{1}无关因为它必须完成,因为代码作为算法的必要条件是它的迭代必须完成。您需要确保代码的迭代完成,这样您就可以告诉它算法并对其进行渐近分析。

另一件事是,这可能是某些时候结果有更多的运行时间但另一个运行时间更少。这不是渐近分析。这是最好的情况,最糟糕的情况。我们可以通过big O或其他渐近符号来分析最佳情况或最坏情况下的算法。最可靠的是你在最坏的情况下分析你的算法。最后,为了分析您的代码,您应该准确描述算法的步骤。

答案 2 :(得分:1)

从数学的角度来看,主要问题是估计所用方法的Rate of convergence。我不太熟悉数值方法,可以流利地谈论高于1维度(你可能更感兴趣的矩阵和张量)。但是ley采用的是Equation Solving而不是Bisection的其他例子,已经在上面估计为O(log(1/e))

考虑Newton method并假设我们尝试为所有浮点数找到一个精度为e = 10e-8的根。我们有收敛速度的平方,所以我们有大约2 * log(float_range / e)循环迭代,如果我们能够计算导数,那么它的含义与Bisection算法复杂度O(log(range/accuracy))相同恒定的时间。

希望,这个例子对你有意义。