有效的解决方案重要吗?


9

我解决了许多问题,其中大部分来自Top Coder。我会得到很多答案,但大多数情况下,我都会得到效率低下的解决方案。

在实际的实现中-有效解决问题真的重要吗?如果可以,我该如何改善呢?


4
您是从竞赛的角度还是在现实世界的实施角度询问?
rjzii 2012年

@RobZ:在实际实现中
Ant的

1
“现实世界”涵盖了很多领域。嵌入式的?服务器应用程序?移动应用程序?单用户个人计算机软件?科学仿真?答案不一定是相同的。
David Thornley,2012年

Answers:


34

最好的解决方案是(按重要性增加的顺序)高效,可维护可行的解决方案

^^^这是您从此答案中真正需要做的唯一事情。^^^

效率很重要。由于我们拥有丰富的硬件,因此可能比以前少一些,但是Performance是一项功能。在比赛中,效率显然很重要。您应该知道如何编写有效的代码。更重要的是,您应该了解最佳实践,这些最佳实践将在不牺牲应用程序的及时性或可维护性的情况下生成高效,性能良好的代码。实际上,这是使用平台和语言的丰富经验可以带来很多收益的地方。

不过,更重要的是(在95%的情况下)有一个完整的,可维护的解决方案。没有最终产品,解决方案的效率可维护性无关紧要。如果您花费大量时间来跟踪和修复错误或添加新功能,则解决方案的效率无关紧要。但是,无论任何人说什么,效率和性能无疑都是重要的。


3
对。一个既正确又完成的非常低效的程序为您提供了一些测试改进的依据。
Mike Sherrill'Cat Recall'

1
其中最重要的部分是了解效率的最佳实践,尤其是在数据库开发中,我个人认为效率要高于可维护性。用户拼命关心性能。我经常看到人们谈论更高效率的代码更难维护,但这仅是因为开发人员无法理解开始时要使用的更高效的代码,一旦您熟悉了技术,便会首选这些技术。而且它们变得更易于维护,因为您了解它们的工作原理。
HLGEM

@HLGEM如果我想作为一般性原则(除了第一行之外)加强该答案的任何部分,那就是它知道编写高效代码的最佳实践。而且您对高效SQL的评论很重要。
Mike Cellini

8

我同意Mike Cellini的观点,我要补充的一件事是。

有足够的效率吗?例如,从用户的角度来看,即使一个功能比另一个效率高得多,在0.00001秒内完成的功能与在0.1秒内完成的功能之间也没有太大差异。在10分钟内完成的功能(对于用户)与在12分钟内完成的功能没有太大不同。在这两种情况下,用户都会喝杯咖啡或继续进行其他任务。

我已经将效率视为“有效用户”,而不是有效算法。


我听说的经验法则是,用户可以注意到它提高了20%。我认为用户实际上都可以感觉到.1和.00001秒之间的响应能力有所不同。
克里斯·皮特曼

克里斯,您可能是对的,用户可以并排注意到两个系统之间的差异,但是一个系统是否会使用户的工作效率明显提高?我的观察(我已经这样做了25年以上)是,这两个系统将使用户能够在给定的时间内完成相同数量的工作。
贾德

2

通常,问题的最重要解决方案将是实际存在的解决方案,对于因您的问题而存在的情况有效。换句话说,请避免过早优化,直到您真正知道自己的代码效率低下或需要更快的高效代码。

另外,请不要忘记针对您的应用程序的最佳解决方案可能不是一般情况下的解决方案。案例和观点,几年前,一位教授给我们班上的一个问题,就是我们要打印给定类型的前10个数字(对不起,我记不清该类型,但这是比较少见的数字之一类),我们接受了一项测试,以确保该数字是给定的类型。这就是我们所遇到问题的严重程度,并且被告知该问题将在第二天到期,最有效的解决方案将获得满分。教授在以下演讲中总结了结果:

  • 一些学生使用一个简单的循环,并使用提供的公式进行检查以确保数字正确无误并显示出来,但速度很慢,但已完成工作,O(n ^ 3)。
  • 其他学生进行了研究,发现了一个公式,可以更好地进行检查以确保给定数字有效,这些程序的运行速度要快得多,O(n ^ 2)。
  • 一名学生使用慢速公式生成值,然后将其复制到代码中的常量数组中并显示其内容O(n)。

教授认为最终解决方案最有效。事实证明,该问题实际上是在充分理解问题的过程中进行的练习,而不仅仅是解决并找到最有效的解决方案。

上面的观点是,要找到有效的解决方案,通常最好花一些时间以确保在开始编写代码或尝试优化代码之前真正了解问题所在。如果您可以将一组参考值存储在一个常量数组中,那么从性能的角度来看,最好不要尝试编写一些奇特的算法。

同样,请不要忘记,对于大多数应用程序来说,唯一倾向于看到低效率代码的人(当它不是不必要地低效率时!)就是开发人员自己。如果您编写的纯代码仅能完全完成所需的工作,那么很可能是用户在大多数情况下不会在使用程序时以及在确实优化他们提到的部分时注意到性能问题。您。


2

这取决于比赛的结构,但总的来说是这样:根据他们的 文档,性能通常是大多数时间的考虑因素。有时,如后面的链接中所述,您必须狩猎,但要引用:

编写干净,清晰,高效的代码。即使没有专门用于此目的的审阅订单项,审阅者仍可能对易于阅读和理解的代码做出更好的反应。借助高效的代码,您可以在压力测试和基准测试中获得潜在的性能优势,并获得审阅者的荣誉(以及一些其他几点)。

改善此问题的最佳方法是编写高效的代码,而您已经在这样做。即使您完成了工作,也要花一些时间提高工作效率-即使在比赛之后-也会有所收获。

您可能还希望在理论上进行投资,例如有关算法的书籍,它可以给您带来两件事:用于解决特定问题的更有效的工具,以及用于识别您要解决的问题的更有效的机制。

最后,计算机科学课程越来越可以 在线获得,并且涵盖了您需要改进的背景。


有新版的算法设计手册。(两者之间的11年)。较新的产品有问题吗?特别是因为它比旧的便宜。如果是这样,也许应该在您的答案中解决。
世界工程师

不,我只是列出了我在亚马逊上找到的第一个版本,没有理会它是否是第二版。
Daniel Pittman '02

1

解决方案所需的效率取决于许多因素。最大的事情就是知道您的用户想要什么。这里有几个例子。

  1. 如果您是一个代码块的唯一用户,并且对您而言效果很好,那么您可能还不错。
  2. 如果您的程序要出售,那么您需要考虑一个目标平台。使用此平台进行测试。如果程序运行异常缓慢,则需要提高效率。如果您觉得合适,请将其交给其他用户,看看他们是否同意。
  3. 也许程序还有其他考虑。例如,如果要构建基于服务器的程序,则可能需要非常努力以使该程序尽可能高效。或者,如果它在微处理器上运行,请确保它在那里也能正常工作。

如何提高代码效率:

  1. 第一步是要了解花费最多的时间。诀窍是执行称为分析代码的操作。寻找最耗时的时间,看看是否可以找到一种使它更快运行的方法。
  2. 关键限制因素可能是内存。如果是这种情况,请查找占用大量内存的内容,并查看如何减少内存。

有一个完整的领域需要优化,但是以上两个技巧至少应该使您入门。


1

对于竞赛,您需要了解谁是法官以及法官的身份-如果他们正在寻找优秀的编码人员,仅此而已,那么您将获得更有效的编码的荣誉。

通常,在现实世界中,这并不重要。软件开发的主要思想之一是“不要优化您不知道的需要优化的东西”,然后是“仅在证明需要时才进行优化”。

许多从业人员会辩称,这会导致膨胀肿,效率低下的代码,无法轻易修复,在某些情况下(他们会大声疾呼,就像大多数编码员每天都在做的那样),它们是正确的。但是,没有多少软件开发项目可以衡量结果“性能:比需要的速度更快,成本:谁在乎,交货时间:这十年的某个时候”,在现实世界中,通常是“我想要便宜,昨天想要,我想要它可以正常工作”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.