程序员如何高效学好数据结构与算法?

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

主题:

1.为什么要学数据结构

2.数据结构学习秘籍

3.算法为什么那么难

4.算法学习秘籍

5.如何打开数据结构与算法这两扇门

随着科学技术的发展,人工智能已渗透到各个行业,算法工程师非常火爆,急缺大量人才,年薪也越来越高。刚毕业30-40万很常见。很多人想入手学习算法,那么多算法,究竟该如何下手呢?

很多人看到招聘要求,算法工程师有很多具体分支:

音/视频算法工程师图像处理算法工程师信号算法工程师自然语言算法工程师数据挖掘算法工程师搜索算法工程师例如有的招聘要求:

1至少熟悉一门编程语言C/C++/java/python/R

2.熟练掌握数据结构,具有良好的算法基础和编程功底;

/熟练运用各种常用算法和数据结构,有独立的实现能力;

3熟悉数据挖掘算法

加分项:具有较为丰富的项目实践经验那么是不是要直接学习这些算法呢?

其实不然,万丈高楼平地起,任何高深的算法都要从基础算法学起,不可能一口吃个胖子,所以入门算法还是要从基础开始:

首先学习一门语言,例如C/C++/Java/python,初学者学C++比较普遍。

学数据结构,数据结构书有很多,但是有些教材晦涩难懂,建议看图解多,通俗易懂的书,推荐《趣学数据结构》。

学算法,不要直接看《算法导论》,大量证明会让你崩溃。推荐《趣学算法》,有问题分析,完美图解,伪码详解,实战演练,适合初学者快速掌握经典算法。

1.为什么要学数据结构?

招聘搞笑事

我曾经推荐一个学生到某知名公司,没多久,学生给我说了应聘的事情:“我介绍我开发了企业管理系统、在线商城系统等等,没想到他问我使用了什么数据结构和算法,我懂很多技术,那么多功能我都实现了,他不问,却问我使用了什么数据结构和算法,你说搞笑不?数据结构、算法我早就忘了,我会开发软件还不行吗?”人力资源总监也反馈过来意见:“很搞笑,这个学生做了不少系统,却说根本没用到数据结构和算法。”

既然双方都觉得这是一个件搞笑事,我们就摊开来看,数据结构到底是什么东西。

拨云见日,看清数据结构

遇到一个实际问题,需要解决两个事情:

(1)如何将数据存储在计算机中;

(2)用什么方法策略解决问题。

前者是数据结构,后者是算法。只有数据结构没有算法,相当于只把数据存储到计算机中而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。

数据是一切能输入到计算机的信息总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有效地存储在计算机中。算法是指对特定问题求解步骤的一种描述,说白了就是解决问题的方法策略。数据结构和算法不依赖于语言,什么语言无所谓。但是如果上机实现的话,就要使用计算机语言。

遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现,这就是N.Wirth教授所说的:数据结构+算法=程序。

为什么要学习数据结构?

计算机专业本科生都开设数据结构课程,它是计算机学科知识结构的核心和技术体系的基石。研究生考试也是必考科目,随着科学技术的飞速发展,数

据结构的基础性地位不仅没有动摇,反而由于近年来算法工程师的高薪火爆,而得到了业内空前的重视。很多人觉得基本的数据结构及操作己经在高级语言(如C++、JAVA语言中)中封装,栈、队列、排序、优先队列等都可以直接调用库函数,学会怎么调用就好了,干嘛要重复造轮子?那么到底有没有必要好好学习数据结构?

先看学习数据结构有什么用处:

(1)学习数据有效存储的方法

很多学生在学习数据结构时,问我要不要把单链表插入删除代码背下来?

(2)处理具有复杂关系的数据

现实中很多具有复杂关系的数据,无法通过简单的库函数调用实现。专业认证中特别强调培养学生解决复杂工程问题的能力,什么是复杂工程问题?就是需要综合运用多个知识技术解决的问题。如同现在很多芯片高度集成,完全不需要芯片内部如何,直接使用就行了。但是,如果在现实中遇到一个复杂问题,一个芯片只能完成其中一个功能,难道要连接十几块芯片来解决这一个问题?你在搞圣诞树嘛?一个树枝挂个小礼物,叮叮当当的乱响。这显然是不合适的,我们需要的是完成该复杂问题的一个芯片,因此需要运用所学的数据结构知识,高效处理具有复杂关系的数据。

通过学习数据结构,更加准确、深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓。

数据结构为什么那么难?

网络上太多的同学吐槽被虐,如滔滔江水连绵不绝,数据结构太难了!真的很难吗?其实数据结构只是讲了三种:线性结构、树、图。到底难在哪里呢?通过调查了解大概有四个原因:

(1)无法接受的描述方式

数据结构的描述大多是抽象的形式,我们使用自然语言表达习惯了,不容易接受数据结构的抽象表示。不止一个学生问我,书上的“ElemType”到底是什么类型?运行时怎么提示错误。它的意思就是“元素类型”,只是这样的描述,你需要什么类型就写什么类型,例如int。这样的表达方式让不少人崩溃。

(2)不知道什么用处

尽管很多人学习数据结构,有的人是应付考试,有的人考研需要,有的人参加算法竞赛需要,而很多人不太清楚学习数据结构有什么用处,迷迷糊糊看书、做题、考试。

(3)体会不到其中的妙处

由于教材、教师等等各种因素影响,很多学生没有体会到数据结构处理数据的妙处,经常为学不会而焦头烂额,无法体会其中乐趣,有趣是才有意思,兴趣是最大的驱动力。一旦体会到其中的奥妙,就会有停不下来的感觉。有读者给我留言,老师看了你的书根本停不下来。其实,我写书的时候也停不下来,神同步。

(4)语言基础不好

我一直强调先看图解,理清思路,再上机。还是有很多同学己经理解了思路后,因为缺少main函数,输入输出格式不对,缺少括号等等各种语言问题卡壳,而这一切统统戴给了“数据结构太难了”这个大帽子。

数据结构学习秘籍

在讲学习秘籍之前,首先了解一下数据结构学习的三种境界:

(1)会数据结构的基本操作

这是最基础的要求,学会各种数据结构的基本操作,取值、查找、插入、删除等。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。初学时,要想理解数据结构,一定要学会画图,通过画图形象表达,更能体会其中的数据结构关系。因此,初学阶段学习利器:画图,理解,画图。

(2)会利用数据结构,解决实际问题

在掌握了书上的基本操作之后,就可以尝试利用数据结构解决一些实际问题了,先学经典应用问题的解决方法,体会数据结构的使用方法,然后再做题,独立设计数据结构解决问题。要想熟练应用就必须做大量的题,从做题中体会其中的方法。最好进行专项练习,比如线性表问题,二叉树问题,图问题,该阶段学习利器:做题,反思,做题。

(3)熟练使用和改进数据结构,优化算法

这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。它需要在学习算法的过程中慢慢修炼。在学习算法的同时,逐步熟练应用、改进,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法。该阶段已经在数据结构之上,通过在测试系统上刷各种算法题,体会利用数据结构改进优化算法。该阶段学习利器:刷题,总结,刷题。

刷题网站:打比赛HDU、POJ、Vjudge、CodeForces,找工作LeetCode

很多人感叹:算法为什么那么难!

首先,算法本身具有一定的复杂性,还有一个原因:讲的太烂!

算法的教与学有两个困难:

(1)我们学习了那些经典的算法,在惊叹它们奇思妙想的同时,难免疑虑重重:这么牛,怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。但这对菜鸟来说,

说,是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?看似学会了,其实两手空空。遇到一个新问题,仍然无从下手。可这偏偏又是极重要的,无论作研究还是实际工作,一个计算机专业人士最重要的能力,就是解决问题一解决那些不断从实际应用中冒出来的新问题。

(2)算法作为一门学问,有两条几乎平行的线索。一个是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等等。另一个是算法策略:贪心、分治、动态规划、线性规划、搜索等等。这两条线索是相互独立的:同一个数据对象(例如图)上有不同的问题,例如单源最短路径和最优二叉树,就可以用到不同的算法策略,如贪心和动态规划;而同一个算法策略,例如排序和整数乘法,也会用到不同的数据结构。它们之间是多对多的关系。

两条线索交织在一起,该如何表述?

《趣学算法》,从问题出发,根据实际问题进行分析,选择合适的算法策略,并分析为什么采用这种算法策略,然后选择什么数据结构,不同的数据结构复杂性会有什么区别,巧妙地将数据结构和算法策略拧成了一条线。通过大量实例,充分展现算法设计的思维过程,让学生充分体会遇到一个问题,如何

分析,使用什么算法策略,采用什么数据结构,算法的复杂性如何?是否有优化的可能?

西方教育旨在激发学生对世界的好奇心,而在这里,我们培养的是让学生怀着一颗好奇心,思考问题、解决问题的能力。更重要的是一一体会学习的乐趣,发现算法的美!

第一个建议:多角度,对比学习

学习算法,可以先阅读一本简单的入门书,然后综合几本书横向多角度看,例如学习动态规划,拿几本算法书,把动态规划这章找出来,比较学习,多角度对比分析更清晰,或许你会恍然大悟,噢,原来如此简单。或许有同学说我哪有那么多钱买那么多书,只要你想学习,没有什么可以阻挡!你可以图书馆借,也可以联系你的老师,每学期上课前,我都会告诉学生,如果你想学习却没钱买书,我可以提供帮助。想一想,你真的没有办法?

第二个建议:大视野,不求甚解

经常有学生为了一个公式推导,或几句代码抛锚,甚至停滞数日,然后淹没在无尽的挫败感中,把自己弄得垂头丧气。公式可以不懂,代码可以不会。你不必投入大量精力试图推导书上的每一个公式,也不必探究语法或技术细节。学算法就是学算法本身,首先是算法思想,解题思路,然后是算法实现,算法思想的背后可能有高深的数学模型,复杂的公式推导,你理解了当然玄妙,不懂就拉倒。算法实现可以用任何语言,所以不必纠结是C,C++,Java,Python,更不必管严格的语法规则,除非你要上机调试。建议还是先领会算法,写伪代码,在大脑中调试吧,如果没有良好的编程经验,一开始就上机或许更让你崩溃。遇到不懂的部分,浏览一下或跳过去,读完了还不明白再翻翻别的书,总有一天,你会发现,“暮然回首,那人却在灯火阑珊处”。

第三个建议:多交流,见贤思齐

第四个建议:勤实战,越挫越勇

实践是检验一切真理的标准。古人云:“学以致用”,“师夷长技以制夷”。请不要急切期盼“实际的”例子,更不要看不起小实例,“不积跬步,无以至千里”。大规模的成功商业案例所采用的算法,人工情感,无人驾驶,不是我们目前要解决的问题。看清楚脚下的路,比仰望天空更实际,多做一些实战练习,更好地体会算法的本质,在错误中不断成长,越挫越勇,终究会成参天大树。

第五个建议:看电影,洞察未来

不管是讲《人工智能》,还是《算法分析》,我都会建议同学们去看一看科幻电影,如《人工智能》、《记忆裂痕》、《绝密飞行》、《未来战士》、《她》等等。奇妙的是,这些科幻的东西,正在一步步的实现,靠的是什么?人工智能。计算机的终极是人工智能,人工智能的核心

THE END
1.算法笔记(三)算法学习技巧从开始学习算法已经有两三个多月的时间了,从简单到深入层次展开,层层优化,对算法的理解也在逐渐加深,不在那么片面,虽然现在还是片面一些,对它的了解也仅仅知道冰山一角,还有很多的内容需要我们去学习去挖掘。 思路 在学习前我们要尽可能快速阅读一遍要学习的书籍,这样不仅仅让我们知道了有哪些内容需要学习,同时也在https://www.code456.com/article/3598351.html
2.从啥也不会的小白,如何成为合格的算法工程师?算法工程师之前有一个小伙伴在留言当中问我,说自己想要从事算法工程师的工作,但是不知道应该从哪里入手,请问我应该怎么办。 这其实是一个老生常谈的话题,也是一个很大的概念。我很难用三言两语告诉你究竟应该如何做,但我可以告诉你一个合格的算法工程师应该至少需要具备什么样的能力,也许可以帮助你们找到前进的方向。 基础 https://aiqicha.baidu.com/qifuknowledge/detail?id=10100085880
3.读者问我怎么学算法,那就来聊点方法论腾讯云开发者社区你看我写的算法套路很通俗易懂,大家喜欢看,那只能代表我这个人的逻辑性很强,并不代表我来聊天大家就喜欢看,学习的时候才需要逻辑,平时又不需要。 不过,今天还是想简单和大家聊聊,因为很多读者问起,想让我讲讲怎么刷题,怎么学好算法,有没有必要去拿个算法竞赛奖之类的。 https://cloud.tencent.com/developer/article/1880928
4.即将到来的算法革命,让孩子学好数学迟早有一天,我们将通过计算解决一切问题。如果投资这件事指的是投资未来,那么从现在开始关注一切和算法相关的事情就并不为过,至少,你可以让孩子在一个新的意义上学好数学。语言是社交的工具,算法则是他和机器打交道的工具。 AI,也就是人工智能,以算法为基础。看一个有趣的报道,法国圣母大学的研究人员最近开发出https://laoyaoba.com/html/share/news/619312?source=app_android_v2
5.《算法与数据结构》精品课:线上线下融合,师生协力共创编程教学新(更多博客推文可关注公众号“SIST算法与数据结构”或访问课程主页https://smart.sist.shanghaitech.edu.cn/cs101/进行查看) 学好这门课的秘诀? 学好一门课程,需要脚踏实地进行学习与反思,没有捷径可走。但是有一些学习建议,可以帮助同学们更好地学习和理解这门课程。 https://sist.shanghaitech.edu.cn/_t335/2023/1205/c2858a1086548/page.htm
6.什么是算法?程序员如何学好算法?怎样才能学好算法并写出优秀的程序程序员如何学好算法? 文章讲述了程序员如何通过学习基础知识、利用刷题平台和参与实际项目来提高算法技能和编程能力。强调了制定学习计划、理论与实践相结合、记录总结和寻求帮助的重要性,并提到了LeetCode等刷题平台和开源项目合作在提升过程中的作用。 摘要由CSDN通过智能技术生成https://blog.csdn.net/huangdi6678/article/details/131334402
7.算法岗还是工程岗?关于职业选择的一点小思考职业发展以机器学习平台研发工程师-Data进行举例,首先你至少要精通或者熟悉一门编程语言(重点,不要贪杯),其次就是数据结构与算法要学好(这里所谓的学好并不是说你在某某平台刷了多少题,更重要的是要了解算法在生活中的应用场景,比如对于栈这种数据结构,大家在学校里可能就只知道栈可以解决括号匹配问题,但你是否知道你在日常https://ac.nowcoder.com/discuss/995242?type=9&order=0&page=1
8.算法分析入门教程实战篇及应用篇要想既快又扎实地学好破解,必须养成一个好习惯。什么,这不是算法分析吗?你怎么竟扯好习惯?没错。要学好算法分析,必须要有一个好习惯。否则事倍功半。学破解的好习惯(也是做CRACK ME 的好习惯): 1.坚持独立完成破解(CRACK ME)。贵在坚持。开始时很吃力,成果也不明显。没关系。万事开头难,坚持。https://www.pediy.com/kssd/pediy10/59537.html
9.代码随想录——跟着Carl学算法先后在腾讯和百度从事技术研发工作多年,对数据结构和算法有深刻理解。CSDN博客专家,各大OJ刷题总计过千题。公众号:代码随想录,目前有8w+垂直程序员粉丝。 章 准备面试要知己知彼 1.1 面试官为什么要考查算法 1.2 编程语言 1.2.1 学好算法之前更要学好编程语言 1.2.2 代码规范 1.3 如何写简历 1.3.1 简历模板 http://www.96192.com/product/detail/900082
10.把力扣算法题刷熟了就能稳进大厂吗?还得学会这一招才能高枕无忧接下来我们跟随大神的脚步,一步一步学会算法分析。 Part.3 算法分析这样学,进大厂就稳了 要学好算法分析,还需要预备一些基础知识,首先是数学基础,包括离散数学、实分析和组合数学;然后要有一定的编程经验,掌握一门编程语言,了解基本数据https://mp.weixin.qq.com/s?__biz=MzA3NTIzMzIxNQ==&mid=2652925686&idx=1&sn=7a776c9f4adfb9f462932f0f1e8b8696&chksm=855fdd51414e0204d71c18234ec73586d54b9499e4c5cb6b35d02ff2dbbedd990ee1025a077d&scene=27
11.算法系列15天速成——第十五天图下(大结局)相关技巧边代表两个城市之间的距离,当有n个城市时,可能会有n(n-1)/2条边,那么怎么选择(n-1)条边来使城市之间的总距离最小,其实它的抽象模型就是求“最小生成树”的问题。3. prim算法当然如何求“最小生成树”问题,前人都已经给我们总结好了,我们只要照葫芦画瓢就是了,https://www.jb51.net/article/43301.htm
12.labuladong的算法小抄(豆瓣)《labuladong的算法小抄》专攻算法刷题,训练算法思维,应对算法笔试。注重用套路和框架思维解决问题,以不变应万变。 第1章列举了几个最常见的算法类型及对应的解题框架思路,包括动态规划、回溯、广度优先搜索及双指针、滑动窗口等算法技巧。 第2章用动态规划的通用思路框架解决了十几道经典的动态规划问题,例如,正则表https://book.douban.com/subject/35252621/
13.算法太难学了!说到这里,又有人说了,算法太难学了,哪怕在 Leetcode 上刷题,也很难坚持。 我只能说,算法学习也是有方法的,如果想要学好,必须要掌握正确的学习方法,建立自己的算法知识体系。这里推荐给大家前 Facebook 工程师覃超和极客时间联合开设的《算法训练营》。 https://www.zhuanzhi.ai/document/0218b4cf43498c210058bdadd828a03a
14.算法到底应该怎么学?优秀的小伙伴都知道,学好算法与数据结构,不单单是为了应付技术面试的需要,更重要是提升自身编程水平。https://www.zhihu.com/question/25693637/answer/516725253
15.算法简单学习(一)——前言将数据结构和算法比作计算机的基石毫不为过,追求程序的高效是每一个软件工程师的梦想。下面就是我对算法方面的基础知识理论与实践的总结。 算法是干什么的 当我们编写程序时,一般是实现一种先前设计好的、用来解决问题的方法。这种方法一般与使用的计算机无关,可能对多种计算机和多种语言同样适用,计算机里面算法(algorhttps://www.jianshu.com/p/f74f4ef33e93
16.编程竞赛宝典C++语言和算法入门首先,算法(Algorithm)一词源于算术(Algorism),具体地说,算法是一个由已知推求未知的运算过程。后来,人们把它推广到一般过程,即把进行某一工作的方法和步骤称为算法。一个程序要完成一个任务,其背后大多会涉及算法的实现,算法的优劣直接决定了程序的优劣。因此,算法是程序的“灵魂”。学好了算法,就能够设计出更加优异https://www.epubit.com/bookDetails?id=UB77a9ce8133887