我是一名初学者 C++ 程序员,为了扩展我的想法,我一直在尝试projecteuler.net上的一些问题。尽管在学校对数学很感兴趣,但我发现自己会自然而然地寻求解决问题的蛮力解决方案,而不是寻找流线型或优雅的东西。
这听起来像是一种糟糕的心态吗?这样做我感到有点内疚,但也许有时快速和肮脏是可以的......
我是一名初学者 C++ 程序员,为了扩展我的想法,我一直在尝试projecteuler.net上的一些问题。尽管在学校对数学很感兴趣,但我发现自己会自然而然地寻求解决问题的蛮力解决方案,而不是寻找流线型或优雅的东西。
这听起来像是一种糟糕的心态吗?这样做我感到有点内疚,但也许有时快速和肮脏是可以的......
我认为你应该看看你的最终目标是什么以及你的限制是什么。
有时,蛮力方法可以在 50 毫秒内解决问题,尝试各种解决方案的组合,而“聪明”的解决方案可以在 10 毫秒内解决。在那一点上,不太聪明但更容易理解的解决方案胜过聪明的解决方案。
但是,存在一些问题,暴力破解不仅不优雅,而且根本行不通。有很多问题,如果你试图天真地暴力破解它们,解决它们将花费大量时间。所以很明显,这些类型的问题需要更优雅的方法。
所以问问你自己,你为什么要尝试这些 Project Euler 问题?你这样做是为了学习吗?那么也许尝试一个聪明的解决方案最符合您的利益,但前提是您最初尝试了一个蛮力解决方案来帮助理解问题。
在做 Python 挑战题时,我尽量用最简洁的方式来做,挑战我的能力极限。在我解决它之后,我会查看其他人的答案,并记下比我更聪明的人以及他们所做的事情。有些人会特别使用我没想到的更适合任务的数据结构,或者他们会使用一些数学技巧来提高算法的效率。最后,我尝试尽可能多地吸收他们的聪明才智,并在下次遇到类似性质的问题时将其展示出来。
不,这不是一件坏事。我有非常优雅的解决方案,他们错了。
作为初学者程序员,您将花费更多的精力来弄清楚如何在 C++ 中实际实现事物,而不是花费精力为每个问题寻找聪明的解决方案。这很好,因为它让您有机会在处理各种问题的同时探索 C++ 的不同领域。
当您精通 C++ 并且不必考虑如何做每一件小事时,您将能够花更多时间发明非暴力解决方案。
优雅的解决方案不是自发创建的;当当前解决方案需要更高的速度或更少的内存消耗时,它们源自蛮力解决方案。
所以不,不是。优雅的解决方案就是这样产生的。
肯汤普森:“当有疑问时,使用蛮力”
我已经经历了这种演变:
我会说不,这不是一个坏兆头。事实上,远离过早的优化是在帮自己一个忙,这绝对是一件好事。
学习是一个蛮力的过程。我不会说它不好。在尝试以这种方式做某事时,您可能会注意到一种模式。我认为只要您在思考某事并尝试找到解决方案,您就会学到。很少有人会直接跳到最优雅或最有效的解决方案上。
很难让我相信努力学习的人会被称为坏人。除了可能是一个邪恶的科学家:P
祝你好运。
您是否符合问题的 1 分钟运行时间规则?如果是,那么您的“蛮力”解决方案满足所有要求,这实际上是一个非常好的迹象,表明您可以快速想出可行的方法!
这些类型的问题鼓励微优化和非常聪明的算法,但一般来说,一个非常易读的简单实现将更容易维护,并且会在商业世界中受到青睐。
如果碰巧是“蛮力”=>“简单”和“优雅”=>“复杂”的情况,那么蛮力获胜。这通常是真的。
一点也不。正确、彻底地解决问题,然后根据需要使其更高效或更优雅。
这并不是说您应该忽略明显的性能改进......只是在您更好地理解问题之前不要关注它们。
把它放在不同的上下文中:
当您使用一个您不太了解的库时(例如,用于创建 UI),您可以以完美的性能方式解决一个简单的问题,尽管您知道有一个“正确的方法”可以做到这一点。如果你对你的蛮力代码让你看起来像个白痴感到好奇和担心,你很快就会找到“正确的方法”来做这件事(例如,在周末,或者在你睡觉的时候)。与此同时,通过蛮力,你将拥有一些有用的东西。
实际上,我有时会忘记使用蛮力,并开始扫描 API 以寻找“正确”的解决方案。在许多情况下,这绝对是一个错误。如果蛮力解决方案易于实施,可以根据需要进行扩展(真的,如果可行的话),然后忘记正确的解决方案。你很快就会找到它(很多时候你已经知道了!),但与此同时,你解决了问题并能够继续下一个问题。
编码时的障碍是可怕的,绝对应该避免使用暴力解决方案。
倾向于蛮力绝对不是一个坏迹象,尤其是作为初学者,因为你可能不知道更好。特别是对于 Project Euler,实施蛮力方法而不查看评论以学习更有效的方法是一个不好的迹象。
我经常和你在同一条船上,这就是我开始做体育问题的原因——我正在实施很多蛮力方法,并希望让自己接触到更优雅的解决方案......
你已经权衡了你的选择。如果蛮力解决方案能够完成工作并执行良好,那么这是一个很好的解决方案。