java - Big-O 用于各种斐波那契实现

标签 java algorithm complexity-theory big-o time-complexity

我刚刚尝试用各种方法实现代码(用 Java 编写),通过这些方法可以计算斐波那契数列的第 n 项,我希望能验证我所学的内容。

迭代实现如下:

public int iterativeFibonacci(int n)
{
  if ( n == 1 ) return 0;
  else if ( n == 2 ) return 1;
  int i = 0, j = 1, sum = 0;
  for ( ; (n-2) != 0; --n )
  {
    sum = i + j;
    i = j;
    j = sum;
  }
  return sum;
}

递归实现如下:-

  public int recursiveFibonacci(int n)
  {
    if ( n == 1 ) return 0;
    else if ( n == 2 ) return 1;
    return recursiveFibonacci(n-1) + recursiveFibonacci(n-2);
  }

内存的实现如下:-

  public int memoizedFibonacci(int n)
  {
    if ( n <= 0 ) return -1;
    else if ( n == 1 ) return 0;
    else if ( n == 2 ) return 1;
    if ( memory[n-1] == 0 )
      memory[n-1] = memoizedFibonacci(n-1);
    if ( memory[n-2] == 0 )
      memory[n-2] = memoizedFibonacci(n-2);
    return memory[n-1]+memory[n-2];
  }

在尝试找出这些实现的 Big-O 时,我有点怀疑。我相信迭代实现是 O(n),因为它循环了 N-2 次。

在递归函数中,有重新计算的值,因此我认为它是O(n^2)

在 memoized 函数中,超过一半的值是基于 memoization 访问的。我读过一个算法是O(log N),如果它需要恒定的时间来将问题空间减少一个分数,而一个算法是O(N),如果它需要恒定的时间以恒定的量减少问题空间。我是否相信 memoized 实现的复杂性是 O(n)?如果是这样,迭代实现不是三者中最好的吗? (因为它不使用内存所需的额外内存)。

最佳答案

递归版本不是多项式时间 - 它是指数的,tightly bounded at φn其中 φ 是黄金比例 (≈ 1.618034)。递归版本将使用 O(n) 内存(使用来自堆栈)。

记忆化版本在第一次运行时将花费 O(n) 时间,因为每个数字只计算一次。但是,作为交换,您当前的实现也需要 O(n) 内存(n 来自存储计算值,以及对于第一次运行的堆栈)。如果你多次运行它,时间复杂度将变为 O(M + q) 其中 M 是max of all input nq 是查询的数量。内存复杂度将变为 O(M),它来自包含所有计算值的数组。

如果您考虑一次运行,迭代实现是最好的,因为它也在 O(n) 中运行,但使用恒定量的内存 O(1) 来计算。对于大量运行,它会重新计算所有内容,因此它的性能可能不如 memoization 版本。

(但是,实际上,早在性能和内存问题之前,即使是 64 位整数,数字也可能溢出,因此准确的分析必须考虑到在计算时进行加法所需的时间完整的数字)。

正如 plesiv 所提到的,斐波那契数也可以通过矩阵乘法以 O(log n) 计算(使用与快速求幂相同的技巧,将指数减半每一步)。

关于java - Big-O 用于各种斐波那契实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440020/

相关文章:

java - Spring 安全 OAuth 1.0a : providing already existing tokens

java - 在泛型父类(super class)中实现 Comparable<T>

algorithm - bool 可满足性 - 算法

algorithm - 计算大型数据集中位数的内存高效方式?

java - 我将如何在 Big Theta Θ 表示法下分析该算法的形式复杂性?

java - 如何获取JPA存储库中链接表的ID

java - 如何通过JSON获取特定格式的数据

java - 匹配项目值(value)数量以尽可能接近价格点的算法(JAVA)

java - 如何在 BigDecimal (Java) 中存储无穷大?

python - for 循环内部或外部 if 语句的复杂性