任何人都可以澄清Dijkstra的算法是否属于动态规划。为什么我们称Floyd warshall算法属于动态编程方法。我无法弄清楚它们之间的区别。当我尝试这样做时,我实际上遇到了一个疑问,即动态编程究竟意味着什么?并且Dijkstra的引用是贪婪的方法,这意味着它并不总是正确的?此外,这两种算法的结果有何不同?任何人都可以详细解释。
答案 0 :(得分:3)
动态编程是您通过归纳方式使用子问题来解决问题的方法。
另一方面,贪心算法试图通过制定局部最优步骤来解决全局优化问题。有时这些本地步骤会将您带到全局最优(如Dijkstra算法的情况),有时可能不会(就像更改问题一样)。
答案 1 :(得分:0)
动态编程(DP)和贪婪方法是一种方法论 - 一种概念 - 就像递归;它们不是任何特定的算法。
Dijaktra的算法 - 引自维基百科 -
是图解搜索算法,其解决了图的单源最短路径问题>使用非负边缘路径成本,生成最短路径树
Dijaktra的算法可能会使用DP技术来解决最短路径问题。
答案 2 :(得分:0)
动态编程是一种编程方法,通过它我们可以通过将复杂问题分解为更简单的子问题来解决复杂问题。通过将先前计算的子问题值存储在存储器中而不是重新计算。这可以通过这个例子理解。
public static int fib(int n) {
if (n < 2) {
return n;
}
int[] f = new int[n];
f[0] = 0;
f[1] = 1;
for (int i=2; i<n; i++) { // store the Fibonacci numbers
f[i] = f[i-1] + f[i-2];
}
return f[n-1] + f[n-2];
}
Dijkstra是图搜索算法。
对于动态编程之间的区别,贪婪的方法你可以看到这篇文章
Divide and conquer, dynamic programming and greedy algorithms!贪婪算法