如果想成为Java/C++程序员,是否必须学习数据结构?

16

我真的需要学习栈、链表、堆等数据结构吗?有没有一种有趣的方式来学习它们?我觉得这是一个很无聊的主题。

发布这个问题时显示了一些警告。我不能发布这样的问题吗?管理员请澄清,我会删除它 :/

警告:: 您正在提问的问题似乎具有主观性,并且可能会被关闭。

好吧...我明白了,那么学习它们最好的方法是什么?我应该参考哪本书?哪个网站?


6
主观性问题通常会被关闭,因为它们没有一个真正的答案。通常情况下,通过将其设为社区维基并以最少主观方式陈述同一问题(例如去掉"讨厌他们"的引言),您可以获得一些答案。 - David Rodríguez - dribeas
1
可能是http://stackoverflow.com/questions/2279521/why-should-i-learn-algorithms的重复问题。 - P Shved
1
我非常尊敬的一位程序员曾经说过:“要理解你的程序,我只需要看它的数据结构”(或类似的话)。 - Bryan Oakley
4
展示给我你的流程图,隐藏你的表格,我会继续感到神秘。展示给我你的表格,我通常不需要看你的流程图;它们会变得显而易见。--弗雷德·布鲁克斯,《人月神话》,1975年。 - Ken
1
学徒木匠问道:“我需要学习如何握锤子和使用锯来成为一名木匠吗?” - foxwoods
显示剩余2条评论
16个回答

63

如果您想成为程序员,了解数据结构是必须的。数据结构是编程中的基础知识——如果您不理解基本结构(如数组、链表、栈、队列、树(二叉树/多叉树、自平衡类型)、哈希表、堆和图)以及运行在它们上面的算法(插入/定位/删除)的行为、用途和运行时间复杂度(“大O”),就无法知道在什么情况下使用哪种结构。

每个行业都有其工具;这些就是我们的工具。数据结构是几乎任何您将要学习的算法的最基本支撑。除非您想成为 货车崇拜者程序员,否则您需要了解它们的工作原理。

是否存在有趣的学习方式是完全不同的问题... :)


8

我甚至可以说,大部分的编程都围绕着数据结构的操作展开,毕竟这是计算机科学的基础:你获取一些数据,对其进行处理,最后可能输出结果。所有的数据通常都存储在数据结构中,选择不合适的数据结构会对项目产生更大的影响。


7
随着您越来越有经验,您会发现算法和数据结构对您的日常开发非常宝贵,而且相当有趣。通过现在学习它们,您将学到:
- 哪种数据结构适合哪种情况,例如何时使用单向链表、何时使用栈、何时使用队列、何时使用树。 - 哪些算法适用于哪些目的,例如树的深度优先搜索或广度优先搜索。 - 算法的时间和空间复杂度,例如为什么快速排序有时是最佳解决方案,有时是堆排序。 - 总体上,它将教您计算机科学的基础知识,即使您再也不必实现一个栈,您也会知道其中涉及的思考和考虑类型。如果您需要实现自己的数据结构(很有可能),那么您将知道该怎么做和不该怎么做。

在我(不是很重要的)观点和经验中,你只有在犯错后才能学习数据结构。你可能已经掌握了相关信息,并且了解可用的数据结构是必要的,但是要知道如何以及何时使用它们,我需要先犯错,然后进行纠正。 - penguat
我在计算机科学教育的最初阶段就学习了算法和数据结构,我非常喜欢它们 - 所以我个人在学术环境中了解了它们。 然而,直到第一次真正需要运用这些知识的时候,你才能真正体会到其价值,“在领域中”的经验通常是你做错了很多次后才获得的 :) - Joris Timmermans

4
如果你想成为一名成功的程序员,数据结构是必须掌握的。如果你不懂数据结构和算法,你将如何编写程序呢?

3
无论你是否喜欢,所有的编程都是围绕数据结构构建的。你可能永远不必写一个,但你会多次选择使用哪个。这并不是编程的普遍要求,但如果你想在这个领域脱颖而出,基本的理解是必须的。
任何人都可以在没有材料或施工技术的知识的情况下建造一个棚屋。你甚至可以在别人的指导下在房子里工作并放置砖块和灰泥,但如果你想自己建造一座房子,你需要了解材料和技术。
数据结构是编程的材料。算法是技术。你会使用数据结构吗?你会每天使用最简单的那些,有时你需要解决一个需要特定数据结构的问题,虽然你可能不用自己制造砖块,但你需要了解你是否需要砖块或混凝土墙来满足你的需求。

我明白了。作为一个初学者,我无法意识到它们的重要性。我像是在想:为什么要使用它们呢?也许我需要再做一些研究。谢谢。 - Serenity
学习数据结构的替代方案实际上是在面对比计算2+2更复杂的任务时,必须创建自己的实现。这意味着重新发明轮子,甚至是从手推车一直到蒸汽机,而其他程序员已经拥有驾照并使用预制汽车。 - Gnudiff

3
如果你想证明数据结构的重要性,可以看看谷歌的招聘流程hiring process。无论你对谷歌公司有何看法,不可否认的是他们有一些非常优秀的员工。他们的面试流程旨在确定候选人对数据结构和算法的知识。因为归根结底,这就是编程的核心,无论你使用什么语言或者在哪个领域进行编程。
如果你计划成为一名专业的程序员,你需要知道基本原理,而不仅仅是如何编写“可用”的代码。否则,你只是在玩游戏。

2

作为一名工程师,是否必须学习算术?


2
如果你对编程语言的任何构建块持有“是否必须”的态度,那么你可能不适合成为一名程序员。无论是否“必须”,你都应该始终寻找新的概念来学习,并看看它是否能提高你的编码风格和标准。
但是回答你的问题:是的。

2
我认为在你的发展过程中某个时候掌握数据结构是必不可少的。我并不确定标准的数据结构课程是学习它们的最佳方式。有时候,学习它们的最佳方式是“我遇到了问题X。由于某些原因,我的算法花费了很长时间来解决X。如何使它更快?”
我强烈推荐一本书《编程珠玑》。它有一些非常好的分析,并且有很多例子说明解决方案的真实世界动机。它以有趣的方式呈现问题,并且从不通过给出数据结构的清单来教授。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接