为什么数据结构在面试中如此重要?[关闭]


106

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

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

当时可能是由于我的Java背景,我仅在以对象,实例等面向对象编程的方式进行交谈时才了解代码效率和逻辑,但我从未深入到位和字节级别。我不希望人们因为我在数据结构中的这种知识缺陷而对我视而不见。

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


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

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

7
您想问什么?
temptar,2011年

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

2
好的数据结构可以提供简洁的代码。不良的数据结构会产生复杂的代码。正确是很重要的。

Answers:


121

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

不,还有更多。例如,我们希望您是一个快速的学习者,可以在短时间内学习新的框架,API甚至编程语言。这是最低限度的标准。花费很长时间学习新框架,API或语言的人不会成为Microsoft大多数团队的成功开发者。

当然,除了数据结构的原始知识以外,我们在访谈中还关注许多其他方面。例如,具有处理模棱两可的规范的能力,或者能够识别产生不安全代码的编码模式的能力,或者其他许多功能。但是理解数据结构的能力无疑是很大的。

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

我必须承认,我在数据结构方面并不那么强

知道自己的事真是太好了。如果您无法或不愿意更改自己的身份,那么我的建议是您不要申请需要具备数据结构便利的工作。

这种普遍的观点认为,一个好的程序员必然是一个对数据结构有充分了解的程序员。

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

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

我问有关数据结构的面试问题,因为开发人员每天都在我的团队中设计,实现和操纵复杂的数据结构。昨天我们举行了四个小时的会议,其中有六个开发人员争论将单个布尔字段添加到特定树节点的优缺点。在我的团队中,没有什么技能比深入了解数据结构的能力更重要。不问面试问题是愚蠢的,因为那是我们要做的。

对数据结构的了解真的不会影响一个人的编程生涯吗?

好吧,那肯定会阻止您找到我的团队。但是就像我之前说的,编程是一个巨大的领域。有许多不需要编程知识的计算机程序。

这门学科的知识真的是区分优劣程序员的充分基础吗?

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


10
谢谢一吨埃里克!这是我对这个问题最没有动力的答案。:-)
Vamsi Emani 2011年

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

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

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

133

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

不了解数据结构真的会影响一个人的编程生涯吗?

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

还是该学科的知识确实是区分优秀和劣质程序员的充分基础?

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


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

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

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

9
@konrad:如果/当量子计算机成为标准时,我可以想到更多。但我认为OP不想等到那时才接受他的工作面试;-)
nikie 2011年

3
...或者当我们的新AI霸主淘汰了微不足道的人类程序员时
Homde 2011年

45

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

听起来并不太苛刻,但是任何体面的开发人员都可以在相对较短的时间内选择新的语言或框架。

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

(至少,除了他们目前正在使用的东西,他们还应该在测试基础知识如果他一生中从未编写过任何代码,就没有必要聘请计算机科学向导)


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

1
数据结构是通用的,直到您迷上纯函数式编程:P。
蒂洪·耶尔维斯

30

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

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

但是许多公司都在寻找F1开发人员。会了解代码背后的内容的人。也将帮助公司打造更好产品的人们。

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



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

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

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

17

在我的数据结构课程中,教授首先说的是:该课程并不是关于能够真正快速地搜索。然后,我们花了半年的时间来寻找可能的最佳数据结构和算法,以真正地快速搜索。

尽管如此,他仍然是正确的。能够分析数据结构,将正确的数据结构应用于给定的问题,甚至提出新的数据结构,都需要工程师的许多素质:

  • 寻找抽象模型来模拟具体问题
  • 能够分解问题
  • 能够逻辑/正式地推理
  • 创造力
  • 等等

当Amazon和Microsoft雇用人员时,他们不问数据结构问题,因为他们希望发明下一个quicksort。他们想确保他们雇用具有上述素质的人。

当然,可能有大量的这些特性,但仍然会吸引数据结构。但是,如果是这样,很快就可以成为数据结构专家。


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


3
并且ArrayList,如果没有很好地掌握数据结构,您甚至可能不会意识到这种ArrayList扩展性很差,因此您需要找到并组合可扩展的结构和算法。
phoog 2011年

12

通常,算法和数据结构被视为编程中最“硬核”的两个主题。这是因为在计算机科学领域有大量有关它们的工作和研究。他们还吸引了喜欢数学和科学之类的典型“左叶”程序员(这是很多程序员)

话虽如此,对这些知识的了解可能会影响面试的职业,特别是如果您在像Google这样的面向工程的工作场所面试时。但是,其他公司现在可能根本不在乎这方面。

以我的经验,算法/数据结构的需求有时会以“程序员精英主义”的形式出现,在这种情况下,alpha极客正在竞相显示谁是最聪明的。知道那里有什么总是很高兴,但是有很多不同的编程工作都不需要知道如何使用红/黑树或编写博伊尔·摩尔搜索代码。

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

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


7

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

有两个原因。

一方面,它表明您可以用抽象的术语而不是特定的编程语言来考虑问题。您是否知道在给定情况下,与底层实现无关,为什么哈希表比红黑树更好或更坏?

另一个原因是,有一个可怕的人在那里面试谁只是就业人数他们的经验,如果有任何编程能力很小; 数据结构问题是消除这些人的快速方法。


我将在这里提出一个可能引起争议的意见。的问题,为什么一个数据结构或另一种趋于下降到效率和性能。我们告诉开发人员不要做什么?无需过早优化!除非你知道通过剖析该数据结构的选择导致性能问题,“正确”的人来接是你最熟悉的一个。任何其他决定都是过早的优化,因此是邪恶的!
汤姆W

2
选择合适的数据结构在前面根据适用性和预期的性能特性独立于底层实现的过早优化的一个例子。
约翰·博德

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

5

它们是最基本的,但是,您还会对毕业生进行什么测验?他们可能会或可能不会在课程学习之外有经验。他们的课程可能不仅涵盖Java,而且涵盖了Microsoft技术,反之亦然。数据结构是共同点。


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

4

通常,最好的代码避免重新发明底层数据结构。在高级语言中尤其如此。我注意到即使在CRUD作业中,也存在着对低级数据结构问题的趋势。YMMV,但似乎对黑客科学家专业知识的重视已经掩盖了成为优秀开发人员的其他技能:

  • 项目/时间管理:能够跟上业务驱动的现实世界,而不是运行速度快1%的新链表。
  • 最低限度的社交技能:傲慢自大且无法相处的开发人员不过是锚。
  • 快速连续学习新事物的能力:这些年来,数据结构几乎没有改变...但是其他所有功能都可以。数据结构是非常重要的基础,每个开发人员都应该非常了解它们,但是会计师在进行面试时并没有经过长距离技能测试。优秀的开发人员是那种能够发现新事物并喜欢它的人。

数据结构很棒。数据结构很重要。每个程序员都应该对它们有一个了解。但是,我们一直沉迷于将这些基本原理推到自己的位置之外。并不是所有关于数据结构的问题,在99%的情况下,没有必要提出超出数据结构基础的问题。如果要面试一位会计师,请一定要问他们81除以9是多少,但是如果您一直问“没有98425454242412 * 4512324的立方根是多少?...没有计算器!” 那么您将吓到您本来可以拥有的相当一部分合理,聪明,才华和令人愉快的人。询问他们是否可以建立基本的关系数据模型,询问他们是否可以使用相关框架提供的增强的数组结构,并询问他们是否可以解释二进制搜索何时比平面搜索快,但是没有什么比这更重要的了。如果他们能做这些事情,那么就开始寻找最好,最专业,最有创意的团队。

我喜欢乔尔(Joel)的著作,但我认为他的“ Java Schools”是完全错误的。除了掌握C ++之外,还有很多事情可以证明某人很聪明。想一想,您可以与某人交谈10分钟,而无需询问他们关于指针算术的问题,并且可以很好地了解他们是否是可以完成任务并弄清楚事情的类型。我们不需要像这样:

采访者:“告诉我你的成就。”

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

采访者:“让我澄清一下。告诉我您的编程成就”

编码器:“嗯...”

采访者:“例如,您有没有建立自己的链表?”

编码器:“ ... [走出去]”


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

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

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

4

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

一个好的面试官知道这一点,并试图确定您是否对他的团队或公司有价值。从现在起2年后您将使用的语言可能会有所不同,但是有效算法和数据结构的需求不会改变。


2

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

WHY真正使我们所有人与计算机世界的基本脚本小孩,代码猴子和咕gr声区分开。为什么要使用哈希表而不是链表,为什么我的哈希表应具有大约.6-.8的簇密度,为什么要在这里使用循环链表而不是双链表?为什么我的代码在最坏的情况下应以效率“ x”运行,而在一般情况下应以“ y”效率运行。

这些基本的数据结构和知识,不仅是如何使用的(无论如何应成为每个程序员的应有之选),而且还使用与语言无关的WHY,这往往是他们在这些情况下寻找的东西。

很多地方会让您用自己熟悉的语言编写代码,但这更多的是通用性,因为C确实不再是编程世界的通用语言,并且构造伪代码可能是一堆杂烩在大多数情况下,如果没有真正教授伪代码/ p&p代码,就不可能处理正确的问题。


0

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

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

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

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


-2

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

我必须说,在参加数据结构课程之前,我认为它们并不重要,但至少可以在链表(或ArrayList)不实用或它们的缺点很重要时重新识别。


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

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

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

-2

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

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

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

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


-3

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

例如,我们需要管理数千个对象。我们偶尔需要根据对象的ID更新其时间戳。我们偶尔需要删除未更新超过X分钟的对象。

如果您知道自己的数据结构,则可以轻松地定义问题,并且提出解决方案也非常容易。当不了解足够数据结构的程序员试图提出解决方案时,他的解决方案就很尴尬。他像您一样-聪明,代码程序员,能够快速学习框架。但是,由于对数据结构一无所知,他不得不自己发明轮子。不仅如此,他还很难理解更简单的解决方案,因为它们基于他不了解的数据结构,例如红黑树(Java中的旧TreeMap)。

因此,我要说的重要一点是,知道如何以及何时使用每个数据结构而不必考虑它。但是我认为,如果不真正了解它们的工作原理,就无法实现这一目标。

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.