algorithm - 贪心算法和启发式算法有什么区别?

标签 algorithm heuristics greedy

贪心算法和启发式算法有什么区别?

我读过一些关于该论点的文章,在我看来它们或多或少是同一类型的算法,因为它们的主要特征是在每次迭代时选择最佳(局部)选项来解决问题。

最佳答案

我对启发式的描述是,它们是“经验法则”。他们产生全局最优解的能力可能无法直接证明,但通常他们做得很好。当确定最佳解决方案的成本太高时,通常会使用它们。此外,启发式通常对过去解决问题的经验进行一定程度的编码。描述启发式的更好方法是“求解策略”。

贪婪算法是一种根据当前看起来最好的算法做出选择的算法。换句话说,选择是局部最优的,但不一定是全局最优的(如果幸运的话可能是这样,但你无法证明)。此外,贪心算法通常不会根据新信息改进其解决方案。这只是一种解决策略(也称为启发式)。

举例说明贪心算法的工作原理,如果您要使用贪心算法来帮助您规划一条路线,以最短距离从国家的一侧开车到另一侧,它可能会选择较短的慢速道路。它不一定会理解高速公路虽然更长而且可能更直接,但会是更好的选择。

另一种策略(启发式)可能会尝试使用高速公路覆盖尽可能多的旅程(因为对于大多数目的地而言,它们往往更直接),然后求助于使用普 channel 路在两者之间过渡。在某些情况下,它可能会表现得很糟糕,但在大多数情况下,它会表现得很好,老实说,这可能是我们在通勤时都使用的类似启发式方法(如果不使用卫星导航的话)。

总结...

  • 都是启发式算法,贪婪算法 - 否

  • 都是贪心算法,启发式算法——总的来说,是的。

为了帮助提供一些背景知识,我在大学算法课上学到的第一个问题是 Traveling Salesman Problem .它属于 NP 完全类问题,这意味着不存在有效的解决方法。也就是说,随着问题规模的扩大,寻找解决方案所花费的时间也会大幅增加。存在许多可证明的算法,但它们的性能并不好,在现实世界的应用中,我们倾向于使用启发式算法(包括贪心算法 - 请参阅链接)。

关于algorithm - 贪心算法和启发式算法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21537028/

相关文章:

algorithm - 使用贪心法,给定一个 m×n 的 bool 矩阵 B,找到其元素全为零的最大方子矩阵

string - 返回一个在两个给定字符串之间排序的新字符串

c# - 获取位数组中 1 的索引?

algorithm - 表明顶点覆盖的启发式解最多是最优解的两倍

python - 是否可以在 Python 中实现启发式病毒扫描?

c# - 正则表达式贪心问题(C#)

algorithm - 递增子序列的最小数量

c++ - 优化 vector 赋值 c++

java - 哪种算法最适合我的列表管理?

algorithm - malloc 的最佳启发式算法