Algorithm 是迪克斯特拉';s算法,动态规划

Algorithm 是迪克斯特拉';s算法,动态规划,algorithm,recursion,dijkstra,Algorithm,Recursion,Dijkstra,我看到的Dijkstra算法的所有实现都没有递归函数,但我也读到,根据定义,动态规划是一种具有递归函数和已计算事物“记忆”的算法 那么,Dijkstra的循环算法是否符合动态规划的要求?或者,为了符合动态算法的要求,我必须将循环更改为递归函数。您解决了两个问题: 动态算法意味着将过程分解为更简单的任务。有几种动态算法排除了递归的概念,但也不受限制 考虑到Dijkstra算法,基本解由for循环给出,而不是动态算法解 然而,从动态规划的角度来看,Dijkstra算法是一种逐次逼近方案,通过到达法求

我看到的Dijkstra算法的所有实现都没有递归函数,但我也读到,根据定义,动态规划是一种具有递归函数和已计算事物“记忆”的算法


那么,Dijkstra的循环算法是否符合动态规划的要求?
或者,为了符合动态算法的要求,我必须将循环更改为递归函数。

您解决了两个问题:

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

考虑到Dijkstra算法,基本解由for循环给出,而不是动态算法解

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

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

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

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

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

但我也读过,根据定义,动态规划是一种 算法中带有递归函数和“内存”的东西已经存在 算计的

动态规划不需要以递归的方式编写,尽管大多数人喜欢以递归的方式编写

例如:

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);
}
intdp[MAX]={-1,-1,…};
查找斐波那契(整数项){

如果(nMoshe Sniedovich有一篇关于它的论文,题为“重新审视Dijkstra算法:动态规划联系”。

论文声称Dijkstra的算法受到了Bellman算法的强烈启发 最优性原则,在概念上和技术上都适用 构成一个动态规划逐次逼近程序
Dijkstra算法就像一个注水算法,在每一步中都选择局部极小值,这就是很多人认为它是贪婪算法的原因。如果你尝试这个算法,选择任意路径而不是局部极小值,那么你就会知道它仍然在工作。因为正如我前面提到的,注水是最佳的,就像注水算法一样。因此,Dijkstra算法背后的主要概念是存储先前的结果来预测即将到来的结果,这就是动态方法

有关更多详细信息,请参阅下面的链接


你可以用递归或迭代的方法进行动态规划。这是一种将问题简化为动态子问题的方法,而不是递归或迭代求解。我相信Dijkstra的算法是一种贪婪算法。因此,没有重叠的子问题,因此不需要记忆对已经计算的值进行参数化。也来自:有时,对原始的基本递归解进行参数化,已经得到了最佳的动态规划解;然而,许多问题需要更复杂的动态规划算法。其中一些可能也是递归的,但参数化与原始解不同。其他函数可能更复杂,无法作为带记忆的递归函数实现。下面是鸡蛋掉落难题的两个解决方案。Dijkstra不是近似值。因为迭代函数可以节省堆栈内存(如上述ans中所述),一些现代语言如kotlin会自动将递归函数转换为非递归函数。事实上,每个递归函数都可以转换为非递归函数,反之亦然。你必须解释什么是注水问题:P
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];
}