作者丨rainchxy
https://www.jianshu.com/p/7fe1471ea5f1
招聘搞笑事
如果你关注招聘试题,越是大的公司,问的问题越基础,有的甚至问你什么是栈和队列,反而一些小公司会关心你做过什么系统,关注点不同,大公司更注重基础扎实,发展潜力,而小公司希望你立刻、马上为他干活,通常是没什么技术含量的活。小公司喜欢细而长的竹子,大公司更喜欢碗口粗的竹笋。
我曾经推荐一个学生到某知名公司,没多久,学生给我说了应聘的事情:“我介绍我开发了企业管理系统、在线商城系统等等,没想到他问我使用了什么数据结构和算法,我懂很多技术,那么多功能我都实现了,他不问,却问我使用了什么数据结构和算法,你说搞笑不?数据结构、算法我早就忘了,我会开发软件还不行吗?”人力资源总监也反馈过来意见:“很搞笑,这个学生做了不少系统,却说根本没用到数据结构和算法。”
既然双方都觉得这是一个件搞笑事,我们就摊开来看,数据结构到底是什么东西。
拨云见日,看清数据结构
遇到一个实际问题,需要解决两个事情:
(1) 如何将数据及其关系存储在计算机中;
(2) 用什么方法策略解决问题。
前者是数据结构,后者是算法。只有数据结构没有算法,相当于只把数据及其关系存储到计算机中而没有有效的方法去处理,就像一幢只有框架的烂尾楼;若只有算法,没有数据结构,就像沙漠里的海市蜃楼,只不过是空中楼阁罢了。
数据是一切能输入到计算机的信息总和,结构是指数据之间的关系,数据结构就是将数据及其之间的关系有效地存储在计算机中。算法是指对特定问题求解步骤的一种描述,说白了就是解决问题的方法策略。
遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现。,这就是N.Wirth教授所说的:数据结构+算法=程序。
为什么要学习数据结构?
计算机专业本科生都开设数据结构课程,它是计算机学科知识结构的核心和技术体系的基石。研究生考试也是必考科目,随着科学技术的飞速发展,数据结构的基础性地位不仅没有动摇,反而由于近年来算法工程师的高薪火爆,使得数据结构的重视程序空前高涨。很多人觉得基本的数据结构及操作已经在高级语言中封装,如C++、JAVA,栈、队列、排序、优先队列等等,都可以直接调用库函数,学会怎么调用就好了,干嘛要重复造轮子? 那么到底有没有必要好好学习数据结构?
先看学习数据结构有什么用处:
(1) 学习数据有效存储的方法
很多学生在学习数据结构时,问我要不要把单链表插入删除背下来?要不合上书就不会写了。我非常诧异,为什么要背?理工科技术知识很少需要记忆的,是用的,用的!学习知识不是死记硬背,更重要的是学习处理问题的方法。同一个问题,如何有效地存储数据,不同的数据结构产生什么样的算法复杂性,有没有更好的存储方法提高算法的效率?通过学习数据结构,更加准确和深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓。
(2) 处理具有复杂关系的数据
现实中很多具有复杂关系的数据,无法通过简单的库函数调用实现。如同现在很多芯片高度集成,完全不需要芯片内部如何,直接使用就行了。但是,如果在现实中遇到一个复杂问题,一个芯片只能完成其中一个功能,难道要连接十几块芯片来解决这一个问题?这显然是不合适的,我们需要的是完成该复杂问题的一个芯片,因此需要运用所学的数据结构知识,高效处理具有复杂关系的数据。
数据结构为什么那么难?
网络上太多的同学吐槽被虐,如滔滔江水连绵不绝,数据结构太难了!真的很难吗?其实数据结构只是讲了三种:线性结构、树、图。到底难在哪里呢?通过调查了解大概有四个原因:
(1) 无法接受的描述方式
数据结构的描述大多是抽象的形式,我们使用自然语言表达习惯了,不容易接受数据结构的抽象表示。不止一个学生问我,书上的“ElemType”到底是什么类型?运行时怎么提示错误。它的意思就是“元素类型”,只是这样的描述,你需要什么类型就写什么类型,例如int。这样的表达方式让不少人崩溃。
(2) 不知道什么用处
尽管很多人学习数据结构,有的人是应付考试,有的人考研需要,有的人参加算法竞赛需要,而很多人不太清楚学习数据结构有什么用处,迷迷糊糊看书做题考试。
(3) 体会不到其中的妙处
由于教材、教师等等各种因素影响,很多学生没有体会到数据结构处理数据的妙处,经常为学不会而焦头烂额,无法体会其中乐趣,有趣是才有意思,兴趣是最大的驱动力。
(4) 语言基础不好
我一直强调先看图解,理清思路,再上机。还是有很多同学已经理解了思路后,因为缺少main函数,输入输出格式不对,缺少括号等等各种语言问题卡壳,而这一切统统戴给了“数据结构太难了”这个大帽子。
数据结构学习秘籍
在讲学习秘籍之前,首先了解一下数据结构学习的三种境界:
(1) 会数据结构的基本操作
这是最基础的要求,学会各种数据结构的基本操作,取值、查找、插入、删除等。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。初学时,要想理解数据结构,一定要学会画图,通过画图形象表达,更能体会其中的数据结构关系。因此,初学阶段学习利器:画图,理解,画图。
(2) 会利用数据结构,解决实际问题
在掌握了书上的基本操作之后,就可以尝试利用数据结构解决一些实际问题了,先学经典应用问题的解决方法,体会数据结构的使用方法,然后再做题,独立设计数据结构解决问题。要想熟练应用就必须做大量的题,从做题中体会其中的方法。最好进行专项练习,比如线性表问题,二叉树问题,图问题,该阶段学习利器:做题,反思,做题。
(3) 熟练使用和改进数据结构,优化算法
这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。它需要在学习算法的过程中慢慢修炼。在学习算法的同时,逐步熟练应用、改进,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法。该阶段已经在数据结构之上,通过在ACM测试系统上刷各种算法题,体会利用数据结构改进优化算法。该阶段学习利器:刷题,总结,刷题。
推荐↓↓↓
长
按
关
注
?【16个技术公众号】都在这里!
涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。
万水千山总是情,点个 “ 好看” 行不行