提问人:Divyanshu Dwivedi 提问时间:4/2/2022 最后编辑:Guy CoderDivyanshu Dwivedi 更新时间:4/11/2022 访问量:132
当程序员使用术语“BruteForce 方法解决问题”时,他们是什么意思?
What do programmers mean when they use the term "BruteForce approach to the problem "?
答:
许多编程问题都是对数据空间的搜索,例如列表、树、图形等的漫游。在解决问题时,所有数据都会被搜索或遍历。
如果想要使代码更快,他们将开始注意到可用于删除搜索空间中不必要的部分的模式。
当代码搜索整个空间时,即为“蛮力”。当使用优化来提高搜索效率时,这不是“蛮力”。
在其他作品中,当你第一次开始为一个未知的问题编写代码时,你会从蛮力开始,然后当你学习技巧(找到优化)时,它将不再是蛮力。
例如,如果需要在列表中找到第一个条目。暴力破解方法即使在找到第一个列表后也会搜索整个列表。但是,如果知道一旦找到第一个就需要找到第一个,那么就不需要搜索列表的其余部分。1
1
1
评论
蛮力是将朴素算法应用于问题,依靠计算资源而不是算法效率来使问题易于处理。
@Guy Coder 是正确的,它经常在搜索数据集时出现,但它也可以应用于其他类型的问题。
例如,假设您需要颠倒链表的顺序。请考虑以下方法:
调整元素之间的指针,使它们以相反的顺序链接。这可以在线性时间内以固定的内存量完成。
通过遍历原始列表并预先挂起每个元素的副本来创建一个新列表,然后丢弃旧列表。这也可以在线性时间内完成(尽管常数会更高),但它也使用与列表长度成比例的内存。
系统地创建所有可能的链表,直到发现一个与原始列表相反的链表。这是对无界解空间的详尽搜索(这与对有限数据集的详尽搜索不同)。由于有无数个链表可供尝试,因此无论您可以应用多少计算资源,它都可能永远无法完成。
与 3 类似,但进行了修改,以生成和测试与原始列表长度相同的所有可能的链表。这将解空间限制为 O(n!),这可能很大,但有限。
在不了解如何解决问题的情况下开始编码,然后进行迭代,直到某些东西起作用。
“蛮力”是技术俚语,而不是具有精确定义的行话。对于不同的人,会承载着不同的内涵。您认为这些解决方案中哪一种是“蛮力”取决于该术语对您的含义。
对于我以及与我共事过的许多程序员和软件工程师来说,“蛮力”具有以下含义:
暴力破解的应用是一个有意的工程决策。之所以选择暴力破解,可能是因为:
- 蛮力方法很容易正确
- 创建参考实现以检查更高效算法的结果
- 更有效的算法尚不清楚
- 更高效的算法很难正确实现
- 问题的大小足够小,暴力破解和聪明的算法之间没有太大区别
暴力解决方案必须解决问题。尝试对无界空间进行详尽搜索的实现并不是解决问题的一般解决方案。
“蛮力”通常是最高级的。我们说,“我使用了蛮力解决方案”,而不是“蛮力解决方案”。这意味着,对于给定的问题,有一种直接、直接和明显的算法,大多数程序员会识别(或提出)作为给定问题的蛮力解决方案。
对于那些像我这样觉得这个词具有所有这些含义的人来说,只有方法#2是蛮力。那些不同意的人没有错。对他们来说,这个词具有不同的含义。
评论
解决问题的蛮力方法类似于......
强行开门而不是撬锁;
锤入螺丝;
处决所有嫌疑人,而不是确定谁有罪;
用炸药钓鱼;
用网格绘图;
装饰华丽而不是高雅;
通过压倒性的数字取得胜利;或。。。
将大量的计算资源应用于一个问题,而不是找到一个有效的解决方案。
评论