我经历了很多算法。我解决了很多编程问题并找到了解决单个问题的各种方法,可能从蛮力到最好的。
我想知道是否有任何问题无法使用蛮力方法解决但可以通过任何更好的方法解决?
我经历了很多算法。我解决了很多编程问题并找到了解决单个问题的各种方法,可能从蛮力到最好的。
我想知道是否有任何问题无法使用蛮力方法解决但可以通过任何更好的方法解决?
这取决于你的意思can。
对于几乎任何具有有限数量可能解决方案的问题,都有一个蛮力解决方案。给定足够的计算能力和/或时间,可以使用该解决方案来解决。
对于某些问题,实际上不可能使用蛮力解决方案,因为您没有足够的计算能力和/或时间。
在Euler Project的特定情况下,设计了许多问题,因此蛮力解决方案需要太多的计算能力和/或时间。例如,考虑到当前可用的计算机,一个问题可能被设计为需要一百万年的时间来计算,从而迫使您使用另一种方法来尽快完成它,从而使解决方案变得有用。
我想知道是否有任何问题无法使用蛮力方法解决但可以通过任何更好的方法解决?
是的。有时证明可判定性并非易事。
1) 平面度:
如何测试图形是否是平面的?天真地,你不能使用蛮力,因为你可以用无数种方法来绘制图形。
一旦你发现存在平面性的巧妙标准,算法就很简单了。
2)Presburger公式:
Presburger 算术中的公式是使用量词 ∀、∃、加法 +、常量(自然数)和逻辑运算符构建的。不允许有任何不同。量词的范围是自然数。
例子:
∀n ∃m (n = m + m) 或 (n = m + m + 1)
这个公式表达了每个整数都是偶数或奇数的事实。这是真的。
∃m ∀n ∃km + k = n
这个公式表达了存在最大自然数的事实。这是假的。
有没有一种算法可以决定一个公式是否正确?天真地,蛮力是行不通的,因为您需要检查所有自然数。不过,问题是可以确定的。
有很多问题是用蛮力解决不了的。
例如,看一下停止问题:您需要设计一个算法来接收程序和输入,如果程序在使用该输入运行时最终会停止,则返回“True”,否则返回“False”。
算法最终必须停止并告诉“假”或“真”。
不用说,但没有这样的算法。
编辑:
当您说“解决”时,我假设您的意思是计算解决。
我认为是的 - 看看以下问题:
给你循环:
而 (x < m)
x--
以及常数 m 和 k。并且您需要返回 < k 如果存在则循环将终止的最小 x ,否则返回“False”。使用蛮力算法,对于 k = 999 和 m = 1000,您将从 x = 999 开始(因为要求 x < k = 999)并且您将永远卡住。
您可以使用更好的方法 - 如果 m < k,则返回 m。否则,返回“假”。
并不真地。蛮力的概念意味着尝试一切。因此,如果可以创建和重新创建某些东西以匹配,那么尝试所有可能的排列将导致找到另一个匹配项。