是Dijkstra的算法,动态编程

use*_*938 11 algorithm recursion dijkstra

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

那么Dijkstra的算法是否具有作为动态编程的循环?
或者为了有资格作为动态算法,我必须将循环更改为递归函数.

ceg*_*ash 19

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

递归给了我们一个堆栈.但是我们这里不需要堆栈.我们需要一个优先级队列.实现Dijkstra算法的有效方法是使用(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);
}
Run Code Online (Sandbox Code Playgroud)

是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];
}
Run Code Online (Sandbox Code Playgroud)

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

记住任何算法

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

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

可以称为DP.

那么Dijkstra的算法是否具有作为动态编程的循环?

Dijkstra是DP!

或者为了有资格作为动态算法,我必须将循环更改为递归函数.

没有


apo*_*ene -2

您提出两个问题:

动态算法意味着将过程分解为更简单的任务。几种动态算法包括递归的思想,但也不限于此。

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

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

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

Problem 2. Find the path of minimum total length between two given nodes P and Q.
Run Code Online (Sandbox Code Playgroud)

注:摘自维基百科

  • Dijkstra 并不是一个近似值。 (5认同)