我给人的印象是,时间和记忆的复杂性是compsci课程的毕业生必不可少的,但是在学习工程学后,我不知道是否是这种情况。最近,我很惊讶地采访了一些甚至不知道这个概念的当地大学的毕业生。我想我的问题是:
计算复杂性的概念对软件开发人员重要吗?并且应该在本科课程中教授吗?
我给人的印象是,时间和记忆的复杂性是compsci课程的毕业生必不可少的,但是在学习工程学后,我不知道是否是这种情况。最近,我很惊讶地采访了一些甚至不知道这个概念的当地大学的毕业生。我想我的问题是:
计算复杂性的概念对软件开发人员重要吗?并且应该在本科课程中教授吗?
Answers:
从我所看到的,似乎在正式的计算机科学教育中很多时候强调了大O表示法以及时间和内存的复杂性……但是这种自学的方式是基于听和读受过这种教育的人的知识说和写。
尽管我确实相信一般的想法和概念很重要,但是我不相信将其形式化(例如big-O表示法和各种术语)几乎没有那么重要,除了出于交流目的。仅仅因为有人不熟悉正式的表示法和术语,并不意味着他们看不到在特定情况下一种算法比另一种算法更快和为什么更快的原因。人们会发现,如果他们了解树的工作原理并且对树的高度有一个合理的了解,那么他们就无需首先从任何正式意义上学习复杂性理论,就可以找到平衡的二叉树所需的时间与节点数的以2为底的对数有关。学校数学。重要的是要知道什么时候应该关注复杂性和内存使用情况,并考虑典型和最坏的情况,但是……有些人却没有。
符号和术语对于交流很重要。它们提供了一种很好的方式将量化算法的性能传达给其他人。因为它经常出现在论文和解释中,所以对它至少有一个模糊的理解是很有用的,这样它们就更易于遵循。
因此,是的,这些概念很重要(但在资源和时间充裕而数据却不足够的情况下就不那么重要)。但是,尽管这些概念很重要,但是它们的形式化通常并不那么重要-并且需要记住,符号和术语与概念本身并不相同。
编辑:
我不会声称要像正式学习过的人那样详细地理解这些概念,但是许多一般性的想法才有意义。我确实认为正式学习此方法有价值,但如果没有这些价值,某些价值仍然存在。
至于介绍这些概念(在正式研究之外),我认为一个好的开始是鼓励人们考虑数据结构具有多少内存开销,算法涉及哪些步骤以及这些事情如何随着不同的数据而改变。
它也有助于考虑假设的情况和变化,例如考虑如果一棵树是平衡的,将会发生什么,如果它是尽可能不平衡的,会发生什么,或者大多数节点进入树中有多少层,或者它可以有多少个节点?如果深度增加一级,则保持。无论如何,这种思维方式通常对程序员都是有用的,不仅是在考虑复杂性时。如果考虑算法和数据结构在不同情况下的性能,那么它自然会指向更复杂的形式化检查所指向的方向。
是
了解复杂性的基础很重要,并且应该是作为本科生学习的东西。实际上,我认为无论哪个课程教您有关数据结构的问题,通常都会涉及到它。我可以理解毕业生不了解或不记得的情况,但是我看不到他们没有被教导复杂性的基础知识。
更新:为什么重要
我在一项特定工作的数据库迁移中。我们为何时需要完成迁移设定了最后期限。编写脚本的人没有任何复杂性。不幸的是,没有人仔细观察他在脚本中使用的逻辑。除了他使用双重嵌套循环而不是哈希表之外,我不记得具体细节。在连续运行一周的脚本之后,我们看了一下逻辑外观,意识到了问题所在。更改后,大约需要5个小时才能完成。由于有人不了解复杂性,我们几乎错过了完成迁移的最后期限。
关键是很容易意外地使速度慢几个数量级的东西,或者总是在工作完成之前耗尽内存。 虽然具有更多内存的速度更快的计算机可以缓解小错误,但它们通常无法缓解复杂性问题。
我发现问它是否“重要”是相当模糊的。
您会发现很多人都在宣传他们认为严格地要求世界上每一个知识的最低点。但这是没有意义的,因为一个人永远不可能了解所有事情,并且除非期望它能帮助一个人满足其工作要求,否则不应指望它。一般来说,我宁愿对教育先决条件采取更务实的态度,除非这是出于爱好或个人喜好问题。
对于希望编写极其高效的代码或创新的基础结构算法的程序员来说,这重要吗?是。
对于开发常规Web应用程序的程序员重要吗?他们可以在没有开源软件的情况下进行管理或获得有效的实现。
对于为应用程序开发GUI的程序员重要吗?可能不是,因为成功的GUI框架会将所有这些小细节都抽象掉了。
就像其他任何东西一样,总是很高兴知道,但这并不能阻止许多(甚至大多数)程序员从简单地做工作到获得雇主的满意。
另一方面,如果一个人报名参加了更高的研究,以寻求基础和理论教育,那么应该期望他们学习的科目比理论上的要多于实践。我认为,CompSci是必不可少的。学生了解复杂性,就像他们了解微积分一样重要。
但是无论如何,从什么时候开始做CompSci。程序教人们如何成为优秀的程序员?为此,您需要专门的培训计划和实践经验(可以与您或您的其他程序员分享您的经验)。
O(n^2)
意味着什么。