是否总有蛮力方法?

时间:2012-08-02 21:07:08

标签: algorithm brute-force

我经历了很多算法。我解决了很多编程问题&找到了解决单个问题的各种方法,可能是从蛮力到最佳问题。

我想知道是否有任何问题无法通过蛮力方法解决,但可以通过任何更好的方法解决?

6 个答案:

答案 0 :(得分:12)

如果已知存在解决方案(例如,如果它是一个优化问题)并且候选解决方案的集合是enumerable(并且如果对于每个候选解决方案,则存在蛮力算法)你可以决定它是否正确。)

例如undecidable的问题,当然没有强力解决方案。

答案 1 :(得分:3)

这取决于你的意思可以

对于有限数量的可能解决方案的几乎任何问题,都有一个强力解决方案。给定足够的计算能力和/或时间,可以使用该解决方案解决。

对于某些问题,使用强力解决方案并非实际,因为您没有足够的计算能力和/或时间。

Euler Project的特定情况下,设计了许多问题,以便强力解决方案需要太多的计算能力和/或时间。例如,在给定当前可用的计算机的情况下,可以将问题设计为花费一百万年来计算,迫使您使用另一种方法以便尽快完成该解决方案是有用的。

答案 2 :(得分:3)

  

我想知道是否有任何问题无法通过蛮力方法解决,但可以通过任何更好的方法解决?

是。有时证明可判定性是不平凡的。

1)平面性:

如何测试图形是否为平面?天真地,你不能使用蛮力,因为你可以通过无数种方式绘制图形。

一旦发现exist clever criteria的平面性,算法很简单。

2)预先计算公式:

Presburger算法中的公式是使用量词∀,∃,加法+,常数(自然数)和逻辑运算符构建的。任何不同的东西都是不允许的。量词的范围超过自然数。

示例:

∀n∃m(n = m + m)或(n = m + m + 1)

该公式表示每个整数是偶数或奇数的事实。这是真的。

∃m∀n∃km+ k = n

该公式表示存在最大的自然数。这是假的。

是否有算法决定公式是否为真?天真,蛮力不会起作用,因为你需要检查所有自然数。 The problem is decidable,但是。

答案 3 :(得分:0)

不是真的。蛮力的概念意味着尝试一切。因此,如果可以创建并重新创建某些内容以匹配,那么尝试每个可能的排列将导致找到另一个匹配。

答案 4 :(得分:0)

显然是的,只要我们解决在某些离散空间上定义的问题并且存在非空解决方案集。

请考虑以下事项:

  1. 解决新问题的第一种算法是一种天真的暴力方法。
  2. 如果找到了,为什么还要找另一个?因为在离散问题中,暴力意味着枚举输入值集合,直到找到解决方案并且具有O(n!)或O(a n )计算complexity
  3. 后者意味着它在实践中不可用,需要更棘手的方法。或者,我们可能会寻找近似解,而不是精确解,但这将为收敛带来条件。
  4. 最后有一个NP-complete问题类。

答案 5 :(得分:0)

蛮力无法解决许多问题。

例如,查看halting问题: 您需要设计一个接收程序和输入的算法,如果程序在使用该输入运行时最终会停止,则返回“True”,否则返回“False”。

算法必须最终停止​​并告诉“False”或“True”。

毋庸置疑,但没有这样的算法。

修改

当你说“解决”时,我认为你的意思是计算解决。

我想是的 - 看看以下问题:

你得到了循环:

while(x

x--

常数m和k。 并且你需要返回< k如果存在则循环将终止,否则为“False”。 使用强力算法,对于k = 999和m = 1000,你将从x = 999开始(因为要求x

你可以使用更好的方法 - 如果m< k,返回m。否则,返回“False”。