我必须承认,我大学毕业后在数据结构方面并不那么强。在我毕业期间的整个校园安置中,我目睹了诸如亚马逊,微软等大多数高科技公司主要集中于数据结构。看来数据结构是他们唯一希望毕业生毕业的东西。

老实说,我对此感到难过。我写好的代码。我遵循标准的编码设计模式,我确实使用数据结构,但使用的是肤浅的级别,如ArrayList,LinkedList等Java公开的API。但是,公司通常专注于数据结构的复杂方面,例如基于指针的内存操作和时间复杂性。

可能是由于我的Java背景,那时,我仅在以对象,实例等面向对象编程的方式进行交谈时才了解代码效率和逻辑,但我从未深入探讨比特和个字节。我不想让人们因我在数据结构中的知识匮乏而对我look之以鼻。

评论

我真的不明白你的问题。您说“我写好的代码”-数据结构如何不能成为好的代码的一部分。而且,我怀疑任何真诚的面试官都会对他们过于着迷。

@greengit:实现散列图和使用其API之间是有区别的。在面试中,我要重视的是他们是否会为我描述一个应用程序,然后要求我建立中央数据结构并解释我的选择。

您想问什么?

@Jurily-要了解何时使用容器库,有助于了解底层数据结构的工作原理。如果您不知道所使用库的时间和空间复杂性,就很难接受您对代码效率的了解-仅仅因为它在小型测试数据集上运行良好并不意味着它可以很好地扩展到较大的数据集在现实世界。 IMO,了解时间和空间的复杂性不仅是了解API的一部分,也包括了解类和方法名-也许更多,因为intellisense不会告诉您复杂性。
好的数据结构可以提供简洁的代码。不良的数据结构会产生复杂的代码。正确是很重要的。

#1 楼


像Microsoft这样的大型高科技公司大多数都专注于数据结构。似乎数据结构是他们唯一希望毕业生获得的东西。


不,还有更多。例如,我们也希望您是一个快速的学习者,可以在短时间内学习新的框架,API甚至编程语言。这是最低限度的标准。在Microsoft的大多数团队中,花很长时间学习新框架,API或语言的人都无法成为成功的开发人员。不只是数据结构的原始知识。例如,具有处理模棱两可的规范的能力,或者能够识别产生不安全代码的编码模式的能力,或者其他许多功能。但是理解数据结构的能力无疑是非常重要的。

尤其是在面试偏向于测试应届CS毕业生的数据结构知识的情况下。期望大多数毕业生没有太多实际工作经验的应届毕业生不会擅长于具有15年行业经验的人擅长的同类工作。


我必须承认,我在数据结构方面并不那么强。如果您不能或不愿意更改自己的身份,那么我的建议是您不要申请需要具备数据结构功能的工作。一个好的程序员必然是一个对数据结构有充分了解的人。


一个好的程序员是一个擅长构建需要构建的程序的程序员,这是不言而喻的。许多程序员从事不需要深入了解数据结构知识的任务。例如,其中一些工作在需要深入了解用户界面设计的任务上。还是数据库规范化。管他呢。那些人在他们的领域仍然可以是“优秀的程序员”。


为什么所有这些都强调数据结构?


我问有关数据结构的面试问题,因为开发人员每天都在我的团队中设计,实现和操纵复杂的数据结构。昨天我们举行了四个小时的会议,其中有六个开发人员争论将单个布尔字段添加到特定树节点的优缺点。在我的团队中,没有什么技能比深入了解数据结构的能力更重要。不问面试问题是很愚蠢的,因为那是我们要做的事情。 />
它肯定会阻止您在我的团队中工作。但是正如我之前所说,编程是一个巨大的领域。


计算机知识中有许多种类不需要数据结构知识。 br />

不。但是,检测那些不太可能在Microsoft成功的开发人员几乎总是足够的。由于这是我主要感兴趣的检测对象,因此数据结构的知识是我在访谈中测试的因素之一。

评论


谢谢一吨埃里克!这是我所提问题最无助的答案。 :-)

–Vamsi Emani
11年8月18日在16:23

@EricLippert,谢谢您的出色回答。作为一个自学成才的开发人员,但他还缺乏对数据结构的正式知识的帮助,您是否推荐一本书可以向我展示我所缺少的东西?

–关闭牛仔
2011年8月19日在7:42



@Closure Cowboy:对于数据结构和算法的基础,Cormen,Leieserson和Rivest撰写的“算法简介”是标准教科书。如果您对功能样式数据结构感兴趣,那么Chris Okasaki的书非常不错,但是相当高级。

–埃里克·利珀特
11年8月20日在22:53

@ClosureCowboy查看普林斯顿大学Coursera提供的“算法I”课程。我也是一个自学成才的程序员,它在弥补我的CS理论知识方面做了大量工作。

–伊文·普莱斯
2014年2月19日,下午2:13

#2 楼

关于数据结构的重要一点是,它们至少在实际用途上是通用且永恒的。在过去30年中担任开发人员的任何人都应该了解基本数据结构,例如单/双链表,二进制树或图形。如果您向两个开发人员询问有关他们的信息,则可以通过他们的答案比较开发人员的知识。对于框架甚至语言,这很难说:如果您向两个开发人员询问有关Rails的知识,而一个人比另一个人了解的更多,那真的告诉您什么?正如您在问题中所说,聪明的开发人员可以足够快地学习新框架,因此测试他们当前的知识没有多大意义。真正影响一个人的编程生涯吗?


是的。绝对是除非您一生都想编写CRUD应用程序。


还是这门学科的知识真的足以作为区分好程序员和坏程序员的基础?


不行,这还不够。但是,在面试中您几乎没有什么可以问到的。而且我想说,算法知识是较好的指标之一,至少对于刚从学校毕业,不能问工作经验的人来说,是这样。

评论


有点挑剔,我不会说数据结构本身就是永恒的。为了解决当今硬件的问题,对许多结构进行了建模。例如,我们使用B +树来优化对文件页面的搜索,但是底层硬件正在发生变化。固态硬盘可能需要不同的算法,或者可能比磁盘io更注重RAM访问。因此,尽管算法本身可能是“永恒的”,但它的位置和目的并非如此

–洪德
11年8月18日在12:57

@konrad:这就是我“出于实际目的”的意思。我想不出一种已经过时的数据结构或算法,而且我怀疑您是否会在求职面试中碰到过这种情况。而且由于大多数算法/数据结构是在我们当前的硬件出现之前就已经开发出来的,并且仍然有用,所以我什至猜测正在发生某种协同进化,其中新的硬件开发是由我们已知的数据结构指导的。

–尼基
11年8月18日在13:05

如果并发实际上成为强制性的,我可以想到很多已过时的数据结构:)

–洪德
11年8月18日在13:08

@konrad:如果/当量子计算机成为标准时,我可以想到更多。但是我认为OP不想在那之前等他的工作面试;-)

–尼基
11年8月18日在13:20

...或者当我们的新AI霸主使微不足道的人类程序员过时时

–洪德
11年8月18日在13:23

#3 楼


我是一个快速的学习者,我可以在相当短的时间内学习新的框架,API甚至编程语言。


听起来并不苛刻,但是任何一半体面的开发人员将能够在相对较短的时间内使用新的语言或框架。

数据结构是通用的,它们是计算机科学的基本构建块-红黑树无论是用Java,Python,PHP还是其他任何方式实现,其基本相同。因此,而不是测试特定的语言或特定的框架,雇主(至少,雇主在寻找杰出的开发人员)将测试您是否了解计算机科学的基础知识,而不是仅仅了解他们每个月的口味。重新使用。

(至少,除了当前使用的内容外,他们还应该测试基础知识……如果他从未编写过任何代码,都可以聘请计算机科学向导在他的生活中)

评论


计算机科学是这里的关键词之一。数据结构通常在硕士课程中有深入的介绍,显然是一门重要的学科。

–詹姆斯P.
2011年8月19日在19:15

数据结构是通用的,直到您迷上纯函数式编程:P。

– Tikhon Jelvis
2012年7月18日在9:20

#4 楼

您相信F1赛车手只是开快车吗?不,他们了解自己驾驶的汽车,并与机械师/工程师合作对其进行调整。当然,普通的驱动程序只是驱动。

您可以是只编写代码的普通/普通程序员。您不了解背后的原因。你把事情做好。就这样,第二天见。

但是很多公司都在寻找F1开发人员。会了解代码背后的内容的人。能够帮助公司构建更好产品的人们。

了解数据结构非常好,不仅因为您将以“预煮”的形式使用它们。这也很好,因为您将根据他们的想法创建一些东西。

评论


sites.google.com/site/steveyegge2/age-racecar-driver

–吞噬
11年8月18日在14:24

因此,等等,您是在说我是一名程序员与我在开车前亲密接触汽车的奇怪习惯之间存在关联吗?

–罗比
11年8月18日在15:29

@Robbie:+1大声笑你喜欢拆东西吗?

–graffic
2011年8月19日在10:53

对。我父亲教我如何分解事物。他忽略了教我如何将事情重新组合在一起,一直想尽办法解决这一问题。

–罗比
2011年8月19日13:41

#5 楼

在我的数据结构课程中,教授首先说的是:该课程并不是关于能够真正快速地搜索。然后,我们花了半年的时间来寻找可能的最佳数据结构和算法,以便真正快速地进行搜索。能够分析数据结构,将正确的数据结构应用于给定的问题,甚至提出新的数据结构,都需要工程师的许多素质:
能够分解问题
能够逻辑/正式地推理
创造力
等。

当亚马逊和微软雇用员工时,他们不会对数据结构提出问题,因为他们希望发明下一个快速排序。他们想确保他们雇用具有上述素质的人。

当然,可能有很多这样的素质,但仍然会吸引数据结构。但是,如果真是这样,那么您很快就可以成为数据结构专家。


话虽如此,仍然存在ArrayList根本不存在的问题相当规模。当系统变大时,需要更好地适应的解决方案来执行此工作。如果没有很好地掌握数据结构,您将无法找到并组成在具体情况下会大规模扩展的结构和算法。

评论


对于ArrayList,如果没有很好地掌握数据结构,您甚至可能没有意识到ArrayList不能很好地扩展,因此您需要找到并组合可扩展的结构和算法。

–phoog
2011-12-23 19:21



#6 楼

通常,算法和数据结构被视为编程中最“硬核”的两个主题。这是因为在计算机科学领域有大量有关它们的工作和研究。他们还吸引了典型的“左叶”程序员,他们喜欢数学和科学之类的东西(这是很多程序员)。面试,尤其是在Google等面向工程的工作场所面试时。但是,其他公司现在可能根本不在乎这方面。

以我的经验,算法/数据结构的需求有时会以“程序员精英主义”的形式出现,alpha怪胎在争相展示谁是最聪明的。了解那里的内容总是很高兴,但是有很多不同的编程工作,您永远不需要知道如何使用红/黑树或编写博伊尔·摩尔搜索代码。

我' d如果您觉得这些主题很有趣并且有一些个人项目可以修改,建议您进一步学习这些主题,否则,暂时不用它们您可能会过得很轻松

PS。精通基本数据结构(链接列表,字典,哈希表等)对于任何程序员DS都是必不可少的知识。

#7 楼


那么,为什么所有这些都强调数据结构呢?


两个原因。
一方面,它表明您可以用抽象的术语而不是特定的编程语言来思考问题。您是否知道在给定情况下,无论底层实现如何,哈希表可能比红黑树更好或更坏的选择?

另外,还有很多人在面试工作,而这些工作只是靠自己的经验而已,几乎没有编程能力;数据结构问题是消除这些人的快速方法。

评论


我将在这里提出一个可能引起争议的意见。为什么一个数据结构或另一个数据结构往往取决于效率和性能的问题。我们告诉开发人员不要做什么?无需过早优化!除非您通过剖析得知数据结构的选择会导致性能问题,否则“正确”的选择就是您最熟悉的选择。任何其他决定都是过早的优化,因此是邪恶的!

–汤姆·W
11年8月20日在16:18

独立于底层实现,基于适用性和预期性能特征预先选择正确的数据结构不是过早优化的示例。

–约翰·博德
11年8月21日在12:48

可以在二进制堆上选择斐波那契堆。不使用堆vs列表(适当时使用堆)。

–user470365
2012年7月18日在15:22

#8 楼

它们是最基本的,但是,您会问毕业生如何?他们可能会或可能不会在课程学习之外有经验。他们的课程可能不仅仅涉及Java,还涵盖了Microsoft技术,反之亦然。数据结构是共同点。

评论


+1会考研究生的其他内容,因为没有其他所有理科毕业生都应该知道您也知道的内容。

–伊恩
2011年10月11日上午9:07

#9 楼

通常,最好的代码避免重新发明底层数据结构。在高级语言中尤其如此。我注意到即使在CRUD作业中,也存在着对低级数据结构问题的趋势。 YMMV,但似乎对黑客科学家专业知识的重视已经掩盖了造就出色开发人员的其他技能:由业务驱动,而不是运行速度提高1%的新链表。
社交技巧的最低要求:一个傲慢而无法相处的开发人员不过是锚。事情持续不断:多年来,数据结构几乎没有改变...但是其他所有事情都在做。数据结构是非常重要的基础,每个开发人员都应该非常了解它们,但是会计师在进行面试时并没有经过长距离技能测试。优秀的开发人员是那种能够发现新事物并喜欢它的人。

数据结构很棒。数据结构很重要。每个程序员都应该对它们有一个了解。但是,我们一直沉迷于将这些基本原理推到原地。并不是所有关于数据结构的问题,在99%的情况下,没有必要提出超出数据结构基础的问题。如果您正在面试会计师,请务必问他们81除以9是多少,但是如果您不断询问“ 98425454242412 * 4512324的立方根是多少?那么您会吓到您本来可以拥有的相当一部分合理,聪明,才华和令人愉快的人。询问他们是否可以建立基本的关系数据模型,询问是否可以使用相关框架提供的增强的数组结构,询问是否可以解释二进制搜索何时比平面搜索快,但没有太多意义远远不止于此。如果他们能够做到这些,那么就开始寻找最优秀,最专业,最有创造力的人之一。除了掌握C ++之外,还有很多事情可以证明某人很聪明。想一想,您可以与某人交谈10分钟,而无需询问他们关于指针算术的问题,并且可以很好地了解他们是否是可以完成任务并弄清楚事情的类型。我们不需要像这样:

访员:“告诉我您的成就。”

编码员:“在我的上一个职位上,我是一位为十亿美元的金融公司定制的ERP系统。我们比计划提前了几个月交付,并且该系统已经在过去三年中投入生产。”编程成就”

编码器:“嗯...”

访问者:“例如,您是否制作了自己的链表?” >编码器:“ ... [走出去]”

评论


有趣-好清单。略有不同的外观怎么样? 1.项目/时间管理:能够以数据结构仅浪费一小部分面试时间的方式进行准备。 2.最低限度的社交技能:能够理解访问者通常只想在进入更有趣的领域之前快速检查基本数据结构的开发人员。 3.快速而连续地学习新事物的能力,而不会因缺乏数据结构基础知识而引起分心。

– gna
11年8月18日在15:19

@gnat-太好了。我想我正在得到的是,对基本原理的最深入的了解并不能说明某点之后的总体能力,但是有一种趋势正相反。数据结构是大多数人由其他人(通常是老师)教的东西。我想知道他们可以自己学习什么,因为这就是现实世界的工作方式。好的程序员可以根据最佳实践设计合理的系统。优秀的程序员可以使用最差的实践学习恐怖的程序员编写的疯狂系统,并使它们正常工作。

–摩根·赫洛克(Morgan Herlocker)
2011年8月18日在17:14

我可以想象从事ERP系统工作的人不适合团队。

–克里斯托弗·马汉(Christopher Mahan)
11年8月18日在23:07

#10 楼

成为一名优秀的程序员并不意味着能够学习语言和框架。它是关于能够为复杂问题建立解决方案。为了使这些解决方案有效且可靠,几乎总是依靠良好的算法和对数据结构的适当使用。仅了解数据结构还不够。您需要了解数据结构足以使用正确的数据结构来解决问题。列表和地图提供了一些有价值的功能,但是它们却要付费,并且使用错误的功能可能会严重损害软件的性能。对他的团队或公司有价值。从现在起2年后您将使用的语言可能会有所不同,但是有效算法和数据结构的需求不会改变。

#11 楼

数据结构,时间复杂度,内存操作和指针都是自称为计算机科学家的人应该固有的基本知识。任何代码猴子都可以学习一种语言并学习如何使用它,但是CS专业人员和学生应该与众不同的地方不仅是知道如何使用链表或哈希图,而且还知道为什么。

WHY真正使我们所有人与计算机世界的基本脚本小孩,代码猴子和咕gr声区分开。为什么要使用哈希表而不是链表,为什么我的哈希表应具有大约.6-.8的簇密度,为什么要在这里使用循环链表而不是双链表?为什么我的代码在最坏的情况下应该以效率“ x”运行,而在一般情况下要以“ y”效率运行。会成为每个程序员的优先选择),但是使用与语言无关的WHY,这往往是他们在这些情况下要寻找的内容。

许多地方会让您用自己熟悉的语言编写代码,但这更多的是通用性,因为C确实不再是编程领域的通用语言,因此结构化伪代码可能是一个杂乱无章的地方,而且在大多数情况下,如果没有真正教授伪代码/ p&p代码,就不可能正确处理。

#12 楼

数据结构是所有程序的基础。您不一定需要对它们有深刻的了解,但是您绝对必须知道它们的工作原理。

为什么?因为您所有的代码都与数据交互并处理数据。如果数据集无法存储在结构中,则无法使用它。数据就像房屋的建筑材料。在将其组合成一个结构之前,只有一堆没用的板。

一旦决定了如何考虑和定义数据集,就可以开始使用它来做事,是二重奏的经典算法部分。您编写的每个程序都使用一个数据结构,尽管在许多情况下,这种结构过于简单以至于几乎不存在。一些状态数据变量,我们就完成了!

一旦您超越了琐碎的程序,几乎所有内容都需要一个数据结构。您想选择哪种专业的建筑师通过最佳实践和数学方法设计摩天大楼,还是立即开始建造的乔伯伯叔叔呢?

#13 楼

以@Pelshoff所说的为基础,这表明您知道自己在做什么。如果对所有内容都使用LinkedList,则可能表明您不知道自己在做什么,或者您不愿意停下来思考问题。最重要的是,至少我学过的数据结构课程涵盖了这些数据结构的基本,复杂性理论,这在处理大型数据集时非常重要。这就是为什么像亚马逊或微软这样的公司会这样做的原因。

我必须说,在参加数据结构课程之前,我认为它们并不重要,但至少能够在链表(或ArrayList)不可行或画图时确认它们的背面很重要。

评论


“如果对所有内容都使用LinkedList,可能表明您不知道自己在做什么”,或者您是Lisp程序员:-)

– Peter Alexander
11年8月18日在17:23

@Peter-这将证明我的观点,你不知道自己在做什么! ;)

–杰蒂
11年8月18日在17:37

这似乎是基于指向已删除答案的无效链接-对读者而言相当混乱。您介意编辑以解决此问题吗?

– gna
15年6月22日在18:05

#14 楼

是否编写好的代码是一个主观的陈述。重要的是要知道功能代码并不总是能生成好的代码。

话说,数据结构之所以重要,是因为它们就像您作为程序员在指挥的幕后工作者。的确,您可以在不真正了解其功能的情况下调用结构上的方法,并且可以在不真正了解数据存储方式的情况下使用结构,但是了解这些详细信息将更好地帮助您了解何时适合使用一种结构

例如,您知道可以双向浏览双向链接列表,而仅向前浏览双向链接列表可以帮助您确定存储数据时哪个结构很重要。您可以通过知道单链接列表在内存消耗方面可能具有更低的开销(因为它不包含指向先前元素的指针)来做出更多的教育决定,因此,如果您只需要遍历列表,您可以通过使用适当的结构来节省一些内存。

这些只是小例子,最终,如果您感觉自己在职业生涯中表现出色,并且没有对数据结构的深入了解,那么也许不需要了解更多。但是,了解幕后的情况确实可以真正帮助将功能代码变成好的代码。

#15 楼

数据结构是许多您想做的事情的基础。
如果您知道每种数据结构的用途,弱点和优点,那么就可以轻松解决问题。

例如,我们需要管理数千个对象。有时我们需要根据对象的ID更新其时间戳。偶尔,我们需要删除X分钟以上才更新的对象。解决方案。当不了解足够数据结构的程序员试图提出解决方案时,他的解决方案就很尴尬。他像您一样-聪明,代码程序员,能够快速学习框架。但是,由于对数据结构一无所知,他不得不自己发明轮子。不仅如此,他还很难理解更简单的解决方案,因为它们基于他不了解的数据结构,例如红黑树(Java中的旧TreeMap)。重要的是要知道如何以及何时使用每个数据结构,而不必考虑它。但是我认为,如果没有真正了解它们的工作原理,就无法实现任何目标。