是Dijkstra的算法,动态编程

时间:2014-06-10 12:08:20

标签: algorithm recursion dijkstra

我所见过的Dijkstra算法的所有实现都没有递归函数,但我还读到,根据定义,动态编程是一种具有递归函数和"内存的算法。已计算的事情。

Dijkstra算法的循环是否合格为动态编程?为了符合动态算法的要求,我必须将循环转换为递归函数。

5 个答案:

答案 0 :(得分:16)

  

我见过的Dijkstra算法的所有实现都没有   递归函数

递归给了我们一个堆栈。但是我们在这里不需要堆叠。我们需要一个优先级队列。实现Dijkstra算法的有效方法是使用heap(c ++中的stl priority_queue)。

  

但我也读过根据定义动态编程是一个   具有递归函数和"记忆的算法"事情已经   计算

动态编程不需要以递归方式编写,尽管大多数人更喜欢以递归方式编写它。

例如:

int dp[MAX]={-1,-1,...};
find fibonacci(int nthTerm){
   if(n <= 1) return n;
   if(dp[n]!=-1) return dp[n];
   return dp[n]=fibonacci(n-1)+fibonacci(n-2);
}

是DP的递归实现

int dp[MAX]={0,1,-1,-1,-1,..};
int lastFound = 1;
int fibonacci(int nthTerm){
    for(int i=lastFound+1;i<=n;i++){
       dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}

是一种编写它以节省堆栈内存的迭代方法。

请记住任何算法

1)不会重新计算已找到的结果

2)使用现有结果来查找所需结果

可以称为DP。

  

Dijkstra的算法也是如此,其循环合格为动态   编程?

Dijkstra是DP!

  

或者为了有资格作为动态算法,我必须改变一个循环   进入递归函数。

没有

答案 1 :(得分:2)

有一篇关于它的文章,名为“Dijkstra的算法重新审视:动态编程连接”,由Moshe Sniedovich撰写。 http://matwbn.icm.edu.pl/ksiazki/cc/cc35/cc3536.pdf

该论文声称Dijkstra的算法受到Bellman的强烈启发 最优性原则在概念上和技术上都是如此 构成动态编程逐次逼近过程 卓越。

答案 2 :(得分:1)

Dijkstra的算法就像一个注水算法。在每一步,它选择局部最小值,这就是为什么许多人认为它是贪心算法的原因。如果您尝试使用相同的算法选择任意路径而不是局部最小值,那么您将会知道它仍在工作。选择局部最小值只是因为我最初提到的最佳填充水就像填水算法一样。因此,Dijkstra算法背后的主要概念是存储先前的结果以预测即将到来的结果,这就是动态方法。

有关详细信息,请参阅以下链接

  

Why does Dijkstra's algorithm work?

答案 3 :(得分:0)

你提出了两个问题:

动态算法意味着将过程分解为更简单的任务。几种动态算法都包含了递归的概念,但也没有限制。

考虑到Dijkstra的算法,clasic解决方案由for循环给出,而不是动态算法解决方案。

然而,从动态规划的角度来看,Dijkstra算法是一种逐次逼近方案,通过Reach方法求解最短路径问题的动态规划函数方程。

事实上,Dijkstra对算法背后逻辑的解释,即:

Problem 2. Find the path of minimum total length between two given nodes P and Q.

注意:取自Wikipedia

答案 4 :(得分:-3)

动态编程遵循自下而上策略。即解决所有子问题并最终得出结果。

但是在Dijkstra的算法中,我们遵循自上而下策略。即我们逐个解决解决方案,缓存本地优化。此缓存过程称为 Memoization

所以,我想说,Dijkstra的算法使用 Greedy + Memoization