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