理解简单动态编程的流程

时间:2014-06-18 00:26:41

标签: java algorithm dynamic-programming

我刚开始理解动态编程的概念。我知道它用于缓存未来调用的结果,并且在设计提供指数运行时的复杂算法时非常有效。我不明白的是流程如何以编程方式工作。例如,使用动态编程计算第n个斐波那契数,如下所示。程序中的流程是什么?

int[] fibMap = new int[max]
int fibo(int i){
  if(i == 0) return 0;
  if(i == 1) return 1;
  if( fibMap[i] != 0) return fibMap[i]; // return cached result
  fibMap[i] = fibo(i-1)+fibo(i-2);      //Cache result
  return fibMap[i];
}

我从我正在使用的一本Java参考书中找到了这段代码,但我很难弄清楚这个程序是如何工作的。假设我们想要计算一个简单的fibo(3)或fibo(5),有人可以解释一下程序如何缓存结果以及整体流程对于这个问题如何与没有DP的正常递归方法相比如下所示?

int fibo(int i){
   if(i == 0) return 0;
   if( i == 1) return 1;
   return fibo(i-1) + fibo(i-2);
}

1 个答案:

答案 0 :(得分:2)

您的代码是

int fibo(int i){
  if(i == 0) return 0;
  if(i == 1) return 1;
  if( fibMap[i] != 0) return fibMap[i]; // return cached result
  fibMap[i] = fibo(i-1)+fibo(i-2);      //Cache result
  return fibMap[i];
}

或等同于

int fibo(int i){
  if(i == 0) return 0;
  if(i == 1) return 1;
  if( fibMap[i] == 0)
    fibMap[i] = fibo(i-1)+fibo(i-2);      //Cache result
  return fibMap[i];
}

所以“flow”基本上与非缓存版本完全相同,只是你避免重新计算你已经计算过的结果。