12

我是一名初学者 C++ 程序员,为了扩展我的想法,我一直在尝试projecteuler.net上的一些问题。尽管在学校对数学很感兴趣,但我发现自己会自然而然地寻求解决问题的蛮力解决方案,而不是寻找流线型或优雅的东西。

这听起来像是一种糟糕的心态吗?这样做我感到有点内疚,但也许有时快速和肮脏是可以的......

4

14 回答 14

23

我认为你应该看看你的最终目标是什么以及你的限制是什么。

有时,蛮力方法可以在 50 毫秒内解决问题,尝试各种解决方案的组合,而“聪明”的解决方案可以在 10 毫秒内解决。在那一点上,不太聪明但更容易理解的解决方案胜过聪明的解决方案。

但是,存在一些问题,暴力破解不仅不优雅,而且根本行不通。有很多问题,如果你试图天真地暴力破解它们,解决它们将花费大量时间。所以很明显,这些类型的问题需要更优雅的方法。

所以问问你自己,你为什么要尝试这些 Project Euler 问题?你这样做是为了学习吗?那么也许尝试一个聪明的解决方案最符合您的利益,但前提是您最初尝试了一个蛮力解决方案来帮助理解问题。

在做 Python 挑战题时,我尽量用最简洁的方式来做,挑战我的能力极限。在我解决它之后,我会查看其他人的答案,并记下比我更聪明的人以及他们所做的事情。有些人会特别使用我没想到的更适合任务的数据结构,或者他们会使用一些数学技巧来提高算法的效率。最后,我尝试尽可能多地吸收他们的聪明才智,并在下次遇到类似性质的问题时将其展示出来。

于 2009-01-06T22:46:55.033 回答
10

不,这不是一件坏事。我有非常优雅的解决方案,他们错了。

于 2009-01-06T22:43:01.873 回答
10

作为初学者程序员,您将花费更多的精力来弄清楚如何在 C++ 中实际实现事物,而不是花费精力为每个问题寻找聪明的解决方案。这很好,因为它让您有机会在处理各种问题的同时探索 C++ 的不同领域。

当您精通 C++ 并且不必考虑如何做每一件小事时,将能够花更多时间发明非暴力解决方案。

于 2009-01-06T22:47:36.390 回答
6

优雅的解决方案不是自发创建的;当当前解决方案需要更高的速度或更少的内存消耗时,它们源自蛮力解决方案。

所以不,不是。优雅的解决方案就是这样产生的。

于 2009-01-06T22:43:17.567 回答
4

肯汤普森:“当有疑问时,使用蛮力”

于 2009-01-06T22:45:55.957 回答
4

我已经经历了这种演变:

  1. 让它编译
  2. 使其按预期工作
  3. 找出一种可行的解决方案
  4. 想出一个好的解决方案
  5. 找出多种解决方案,并找到最佳解决方案
  6. 找出多种解决方案,并找到最适合这种情况的解决方案
  7. ?? 还没到
于 2009-01-06T22:48:53.967 回答
3

我会说不,这不是一个坏兆头。事实上,远离过早的优化是在帮自己一个忙,这绝对是一件好事。

于 2009-01-06T22:40:17.417 回答
2

学习是一个蛮力的过程。我不会说它不好。在尝试以这种方式做某事时,您可能会注意到一种模式。我认为只要您在思考某事并尝试找到解决方案,您就会学到。很少有人会直接跳到最优雅或最有效的解决方案上。

很难让我相信努力学习的人会被称为坏人。除了可能是一个邪恶的科学家:P

祝你好运。

于 2009-01-06T22:42:17.740 回答
1

您是否符合问题的 1 分钟运行时间规则?如果是,那么您的“蛮力”解决方案满足所有要求,这实际上是一个非常好的迹象,表明您可以快速想出可行的方法!

这些类型的问题鼓励微优化和非常聪明的算法,但一般来说,一个非常易读的简单实现将更容易维护,并且会在商业世界中受到青睐。

于 2009-01-06T22:46:20.587 回答
1

如果碰巧是“蛮力”=>“简单”和“优雅”=>“复杂”的情况,那么蛮力获胜。这通常是真的。

于 2009-01-06T22:49:18.537 回答
1

一点也不。正确、彻底地解决问题,然后根据需要使其更高效或更优雅。

这并不是说您应该忽略明显的性能改进......只是在您更好地理解问题之前不要关注它们。

于 2009-01-06T23:09:48.293 回答
1

把它放在不同的上下文中:

当您使用一个您不太了解的库时(例如,用于创建 UI),您可以以完美的性能方式解决一个简单的问题,尽管您知道有一个“正确的方法”可以做到这一点。如果你对你的蛮力代码让你看起来像个白痴感到好奇和担心,你很快就会找到“正确的方法”来做这件事(例如,在周末,或者在你睡觉的时候)。与此同时,通过蛮力,你将拥有一些有用的东西。

实际上,我有时会忘记使用蛮力,并开始扫描 API 以寻找“正确”的解决方案。在许多情况下,这绝对是一个错误。如果蛮力解决方案易于实施,可以根据需要进行扩展(真的,如果可行的话),然后忘记正确的解决方案。你很快就会找到它(很多时候你已经知道了!),但与此同时,你解决了问题并能够继续下一个问题。

编码时的障碍是可怕的,绝对应该避免使用暴力解决方案。

于 2010-09-26T01:19:21.643 回答
0

倾向于蛮力绝对不是一个坏迹象,尤其是作为初学者,因为你可能不知道更好。特别是对于 Project Euler,实施蛮力方法而不查看评论以学习更有效的方法是一个不好的迹象。

我经常和你在同一条船上,这就是我开始做体育问题的原因——我正在实施很多蛮力方法,并希望让自己接触到更优雅的解决方案......

于 2009-01-06T22:58:08.380 回答
0

你已经权衡了你的选择。如果蛮力解决方案能够完成工作并执行良好,那么这是一个很好的解决方案。

于 2010-09-26T01:23:03.203 回答