程序员使用术语 "BruteForce approach to the problem " 时是什么意思?

What do programmers mean when they use the term "BruteForce approach to the problem "?

我想了解程序员在工作中使用术语“蛮力”时通常是什么意思。

许多编程问题都是对数据的搜索space,例如遍历列表、树、图等。在解决问题时,搜索或遍历所有数据。

如果想使代码更快,他们将开始注意到可用于删除不必要的搜索部分的模式 space。

当代码搜索整个 space 时即为“暴力”。当使用优化来提高搜索效率时,这不是“蛮力”。

在其他作品中,当您第一次开始为未知问题编写代码时,您将从蛮力开始,然后随着您学习技巧(找到优化),它将不再是蛮力。

例如,如果需要在列表中找到第一个只有 1 的条目。即使在找到第一个 1 之后,蛮力方法也会搜索整个列表。但是,如果知道只要找到第一个 1,就不需要搜索列表的其余部分。

蛮力是将朴素算法应用于问题,依靠计算资源而不是算法效率来使问题易于处理。

@Guy Coder 是正确的,它在搜索数据集时经常出现,但它也可以应用于其他类型的问题。

例如,假设您需要反转链表的顺序。考虑这些方法:

  1. 调整元素之间的指针,使它们以相反的顺序链接。这可以在线性时间内用固定数量的内存完成。

  2. 通过遍历原始列表和 pre-pending 每个元素的副本创建一个新列表,然后丢弃旧列表。这也可以在线性时间内完成(尽管常数会更高)但它也会按列表长度的比例使用内存。

  3. 系统地创建所有可能的链表,直到您发现一个与原始链表相反的链表。这是对无限解 space 的详尽搜索(不同于对有限数据集的详尽搜索)。由于有无数个链表可以尝试,无论你可以申请多少计算资源,它都可能永远无法完成。

  4. 与 3 类似,但修改为生成和测试所有可能的链表 与原始链表长度相同。这将解决方案 space 限制为 O(n!),它可能很大但也是有限的。

  5. 在不了解如何解决问题的情况下开始编码,并反复迭代直到有效果。

“蛮力”是技术术语,而不是具有精确定义的行话。对于不同的人,它会承载不同的内涵。您认为这些解决方案中的哪些是“蛮力”取决于该术语对您的含义。

对我以及我共事过的许多程序员和软件工程师来说,“蛮力”具有以下含义:

  • 蛮力的应用是一种有意的工程决策。可能会选择暴力破解,因为:

    • 蛮力法很容易得到正确的
    • 创建参考实现以检查更高效算法的结果
    • 更高效的算法未知
    • 更高效的算法很难正确实现
    • 问题的规模足够小,蛮力和聪明的算法之间没有太大区别
  • 暴力破解一定能解决问题。尝试对无界 space 进行详尽搜索的实现并不是问题的通用解决方案。

  • “蛮力”通常是最高级的。我们说,“我使用了 the 强力解决方案”而不是“a 强力解决方案”。这意味着,对于给定的问题,有一个 straight-forward、直接且明显的算法,大多数程序员会认出(或想出)作为 暴力解决方案给出的问题。

对于像我这样觉得该术语具有所有这些含义的人来说,只有方法 #2 是蛮力。不同意的人没有错。对于他们来说,这个词有着不同的含义。

解决问题的蛮力方法类似于...

强行开门而不是撬锁;

正在敲螺丝;

处决所有嫌疑人,而不是确定谁有罪;

用炸药钓鱼;

用网格绘图;

装饰得花枝招展而不是高雅;

压倒性的胜利;或者...

将大量计算资源应用于问题而不是找到有效的解决方案。