而不是其他语言中的STL和类似的库?
作为一个新手,我应该对这部分软件开发深入研究多少?广度还是深度?
这些天只是概念性的理解吗?或者我应该能够实施蒙住眼睛的双重链表吗?
答案 0 :(得分:16)
虽然没有人真正推出自己的堆栈或队列,但了解它们的不同之处和原因非常重要。所以不,为了有效地使用简单的数据结构,在蒙住眼睛的情况下,能够对链表中的循环/空尾/并发/等进行所有正确的错误检查并非100%必要。
然而,虽然最简单的数据结构不会一遍又一遍地重写,但树和图形通常仍然是自定义的,并且您可能无法在不了解更多基本数据结构的情况下对其进行任何操作。
此外,这些通常属于“面试问题”,因此即使您实际上没有在实时代码中重写双向链接列表,也值得知道如何操作。
答案 1 :(得分:4)
仅仅因为许多语言/ SDK等为您提供这些东西并不意味着仍然不了解它们的工作方式并不重要,了解算法的最佳方法就是自己编写。
特别是如果您发现自己正在处理时间关键代码,那么您使用的所有内容的成本都很重要,除非您知道各种数据结构之间的实现差异,否则您可能会发现自己使用效率较低的选项。
要回答主题中的问题,是的 - 当速度/空间/平台受到限制时,很多人仍然会编写自己的实现,并且需要确切知道其功能内部的内容。我知道在视频游戏行业中,我们经常编写自己的快速且内存有效的容器类,这些容器类针对每个目标平台进行了优化。
答案 2 :(得分:4)
我知道在使用太大而无法容纳在内存中的数据时对Merge Sort进行编码,仅举一个例子。所以,是的,了解标准工具的局限性以及何时可以用专业的东西做得更好是非常有帮助的。
答案 3 :(得分:3)
我个人认为这些事情属于Law of Leaky Abstractions。
当然,您可以花费大量时间编写带有string
类型的C#代码,但在某些时候,您必须了解"\r\n"
和"\n"
之间的区别以及为什么要使用svn似乎从windows导入很好但是搞砸了你的linux机器,那就是它有助于实现字符串函数。
作为过去十年编码的人:不,我不会重写双重链接列表,但那是因为我已经将它们写了第一百遍了。所以作为一个新的程序员,做几次,然后抓住一个不错的API。最好是井文件......
答案 4 :(得分:3)
我说每个人都应该知道如何实现基本的数据结构,比如双链表。没有这样的理解,你怎么能说你理解指针和其他相关的东西。我相信对于一个体面的程序员来说,大多数基本的数据结构应该是天真的实现,并且花费不超过一天的时间来实现。
答案 5 :(得分:2)
一切都取决于你需要/想做什么。
如果你的头上有枪,需要从门外拿出一些东西,可能已经知道哪种结构/算法可以让你最快到达终点。
如果您在代码中发现瓶颈并将其追溯到算法/结构,那么您可能需要更深入。
如果您是学生,那么请务必尽可能多地了解他们!
答案 6 :(得分:2)
在嵌入式系统中,很多时候都会重写数据结构。 STL可以包含对较小平台来说过度杀伤的算法和数据结构。 STL算法和数据结构是一般化的。概括占用了可用于其他功能的代码和内存空间。
通常重写的其他数据结构不属于STL。一个例子是环形缓冲区或循环队列。在使用现成的库时,有些商店更愿意重写代码,而不是处理许可费或版权法。
答案 7 :(得分:2)
......而不是STL和类似的 其他语言的图书馆?
有时你想要一些不在图书馆里的东西。我经常使用循环单链表。它们不在STL中,它们不支持STL序列,并且实现非常简单,滚动我自己比下载更简单。
作为一个新手,我应该多少钻研 进入这部分软件 发展?广度还是深度?
不要花太多时间。如果你不立即需要它,那就是理论知识,如果没有深度,理论就毫无用处。通过一本好的数据结构书,跳过你发现的任何不可思议的沉闷。如果您知道稍后将参加数据结构课程,请提前阅读本书。
(虽然我尝试了这一点并最终得到了一本无用的书。然后我去了另一所学校的书店,找到了一本更好的书,并且在不上我的学校课程的情况下获得了熟练的学分!)
只是概念性的理解 这几天有必要吗?或者我应该 能够实现双向链表 蒙住?
采取中间立场。您需要知道结构的属性才能找到因使用错误结构而导致的错误。但是,不要让自己实施红黑树,当然也不要养成你可以预制的编码结构的习惯。
答案 8 :(得分:1)
从专业发展的角度来看,你应该能够实现你可能需要的任何东西;有一天你可能不得不实现库中不存在的东西,你也可能不得不不时发明新的算法。
但是,为了更快地提高工作效率,请首先学习如何评估库或模板数据结构;什么是它的时间成本,内存成本,可维护性等。这将使您更快地编写更好的代码。但是不要就此止步,学习如何实施它们。研究开源库的实现,以便了解它们的工作原理,而不仅仅是它们的工作原理。
答案 9 :(得分:1)
你应该能编写自己的数据结构。实际上做一份工作应该是一个不寻常的情况。在99%的情况下,C ++ STL或Java集合或.NET提供的数据结构应该是好的。
我在一年前为工作项目编写了一些自定义数据结构,因为我们能够利用我们数据的独特属性来使用磁盘内存映射,压缩它,将大部分存储在索引中,使用位偏移指针指示下一个数据对象和的类型,使其模糊到足以阻止大多数人试图读出我们的数据库。
这个机会只发生在我十年一次。
答案 10 :(得分:1)
你一定听说过80/20规则。 80%的开发人员没有动手(真实世界)以他们选择的语言实现数据结构。因此,要成为20%中的一员,尝试学习并获得实践经验。也就是说,实际上80%的工作都不需要实施自己的DS。像Java和C#这样的语言,有时候编写自己的DS会引起批评。您有大多数需求的包/ librabries。但是在你的语言中实现这些DS时,你将会提高你的编程技巧。所以继续开始使用自定义堆栈和队列。我确信您将学习的第一个(如果您使用java / c#作为您选择的语言)是内存泄漏:)
答案 11 :(得分:0)
作为一个新手,我问自己这个问题,我在没有任何实际编程知识的情况下回答了这个问题。这些主题出现在顶级软件公司的技术访谈中。顶级软件公司拥有最好的工程师(否则他们就不会处于领先地位!)因此,他们的招聘实践必须选择最好的和达尔文主义为那些最擅长选择新员工的公司选择的市场。因此,这些公司搜索的内容必须与成为优秀的软件开发人员相关,否则他们就不会处于领先地位。因此,这些主题(算法和数据结构)很重要。如果他们只是一些随意的箍,这些公司让编程人员跳过,说公司会被其他雇用他们错误拒绝的好候选人的公司所取代。