提高此代码的时间复杂性

时间:2016-05-19 12:29:26

标签: java time-complexity fibonacci

这里的任何人都可以帮我减少这段代码的时间复杂度:

public static int a(int number) {
      if ((number == 0) || (number == 1))
         return number;
      else
         return a(number - 1) + a(number - 2);
   }

   public static void main(String[] args) {
       System.out.print("Enter the count of Fibonacci series: ");
        int cap = new Scanner(System.in).nextInt();

        System.out.println("Output: ");
      for (int i = 1; i <= cap; i++){
         System.out.printf("%d\n", a(i));
      }
   }

3 个答案:

答案 0 :(得分:0)

您可以存储以前计算的值,因此如果您尝试计算fibonnaci(100),则不要计算斐波那契(50)大约100次。

答案 1 :(得分:0)

伪代码:

 dictA = {}

 a(n):

    if n in dictA: 
        return dictA[n]
    else if n <= 1: 
        return n
    else: 
        val = a(n-1) + a(n-2)
        dictA[n] = val
        return val

答案 2 :(得分:0)

添加一些缓存非常简单,您可以在其中存储已计算的值。如果你想要完全递归算法的想法是相同的 - 只要检查已经计算的值的常规开始。如果是 - 从缓存中返回,否则 - 开始计算(不要忘记在计算结束后保存它)。

public class Fibbonaci {

    public static long calc(int n) {

        List<Integer> cache = new ArrayList<>();
        cache.add(1);
        cache.add(2);

        for (int i = 2; i < n; i++) {
            cache.add(cache.get(i - 1) + cache.get(i - 2));
        }

        return cache.get(n - 1);

    }

    public static void main(String[] args) {
        IntStream.range(1, 10)
            .forEach(n -> System.out.println("Fibb " + n + " = " + calc(n)));
    }

}