我有一些关于算法的一般性问题,当你遇到一些问题并想要编写一些算法时,你如何处理问题,你如何决定使用贪婪算法或动态编程?提前谢谢
答案 0 :(得分:5)
总的来说,我尝试将新问题转换为众所周知的问题,该问题具有众所周知的解决方案。然后选择正确的算法是微不足道的。根据我的经验,这涵盖了大多数情况。
如果第一步失败,我会尝试一种贪婪的方法并尝试证明它不起作用。证明部分可能很棘手,但基本上你必须证明在某个中间步骤中本地最佳选择不会产生总体最佳结果。从那里我分支出来,通常动态是我尝试的第一个选择之一。
如果所有其他方法都失败了,我会开始研究好的近似算法,这些算法足够接近手头的问题。许多问题可以“足够好”地解决,只需要花费一小部分时间和资源,使其成为明显的赢家。
答案 1 :(得分:1)
如果一个贪婪的算法可行,我会更喜欢,如果没有,那么如果动态编程有效,那么选择那个,否则会出现更糟糕的渐近行为。
你怎么能真的期望得到你的问题的答案?
所有动态编程任务都有一个功能,即(精心选择的)子问题的最佳解决方案也是整个问题的最佳解决方案的一部分。你要么发现问题的这个特征,要么你没有...
<强>更新强>: 我想告诉你一个很好的答案,“我把它映射到一个类似的众所周知的问题”,但这不是我做的。我解决了几个DP问题,从那时起如果我看到一些会用蛮力算法产生O(2 ^ n)的东西,我会自动开始搜索可以构造最优解的子问题。