大O时间复杂度中的指数分母(分数指数)来自何处?

时间:2015-03-08 08:46:33

标签: algorithm big-o time-complexity

在算法描述中,我有时遇到时间复杂性,如: O(n 29/20 + m 7/3 。我看到+和权力分子来自哪里:+表示连续循环,而分子表示嵌套循环。例如,这个(无用的)算法具有 O(n 2 + m)时间复杂度:

public int compute(int n, int m) {
  int answer = 0;
  for (int i=0; i<n; i++) {
    for (int j=0; j<n; j++) {
      answer += i-j;
    }
  }
  for (int i=0; i<m; i++) {
      answer -= i;
  }
  return answer;
}

但是我不明白什么可以引入分母(第一个例子中的20和3)。

1 个答案:

答案 0 :(得分:9)

它们来自对复杂性功能的严格分析。

一个常见示例是Matrix Multiplication,而朴素解决方案是O(n^3)乘法运算,there are some faster solutions
第一个改进之一是使用7(而不是8)乘法运算来乘以两个2X2矩阵。

如果您以递归方式调用所有子矩阵,您将看到它需要O(n^log_2(7)) ~= O(n^2.807)次乘法。


另一个常见的例子是Fibinacci sequence使用Naive递归解决方案:

F(x) = x > 2? F(x-1) + F(x-2) : 1

虽然您可以使用更宽松的界限对其进行明确分析,并说上面的内容为O(2^n),但实际上 - 更接近的分析会向您显示您只生成F(x)停止子句以计算值F(x)。 由于我们知道F(x)在O(Phi^n)中,并且使用一些基本代数来表明非止句子句的数量是停止子句数的常数因子,我们可以推导出这个解决方案在O(Phi^n)~=O(1.62^n)中运行,这是一个更严格的约束。


对于实际分数,您也可以使用根函数来获取它们,其中最常见的是平方根。

例如,以下是一个Naive实现,用于查找数字n是否为素数:

for i from 2 to sqrt(n):
    if n % i == 0:
         return false
return true

如您所见,上述内容在O(sqrt(n)) = O(n^(1/2))时间内运行。