好难听懂算法课程
来源:13-3 红黑树与2-3树的等价性
car
2018-12-03
全都是理论,实际场合都没有看见过,如何选择合适的数据结构好模糊。在实际编程中基本用不到数据结构知识。不知道如何在实际编程中用好数据结构
1回答
-
由于课程时间的限制,我没有在课程中细致的讲解这些数据结构的应用,这本身也不是这门课程的定位。这门课程的定位是讲清楚数据结构的底层原理。
但是,这门课程在设计的时候,还是力争在不断提及数据结构的作用,让同学们了解他们的应用。比如在介绍栈的时候,我介绍了很多栈的应用,也可以参考这个问答:https://coding.imooc.com/learn/questiondetail/89680.html 比如讲队列,提到了消息队列;讲优先队列,更是将很多生活中的实际场景和优先队列联系起来(如果做一个银行排号系统,用普通队列可能是合理的;但是做一个医院接受手术的系统,应该用优先队列);讲Trie,提到了联系人列表的设计;讲平衡二叉树,提到了数据库的底层设计,等等等等。
至于全是理论,说实话,这个课程已经把理论放到最低程度了(对比算法导论),每一个数据结构都是真刀真枪的从底层实现了一遍。至少,如果现在又出了一个新语言X,你是X语言项目的工程师,现在上面让你实现一个X语言的标准库,给X语言的开发者提供基础的数据结构支持,你应该是有思路的。
至于说“实际工作没用过数据结构”,嗯,这一点我在课程1-2也介绍过,有兴趣可以回顾一下。简单地说,数据结构和算法,已经不是当下计算机行业的从业者必须的知识了。多少人半路出家(尤其是在三五年前),学个前端学个移动开发框架使用,根本没有接受数据结构的算法的基础训练,就进入了计算机行业。他们的工作是业务逻辑的组建,说实话,这部分工作就是不需要数据结构和算法。
但数据结构和算法充斥在他们用的每一个计算机工具中。从大家所使用的操作系统,使用的编程语言,使用的IDE;到使用的数据库,使用Google(或者百度)去搜索自己希望获得的信息;从使用word,excel,ppt等工具做各种文档,到收发邮件,和同事交流,邮件所经过的网络传输,安全检查;从ps修图,美颜相机美颜,到游戏的渲染;从手机的指纹识别,到越来越多的全面屏手机开始使用人脸识别,全部是算法。如果你不去做一个操作系统,不去开发一个新语言,不去开发一个IDE,不去开发一个数据库,不去开发一个搜索引擎,不去开发一个word,excel,ppt,不去开发一个邮件底层协议,不去碰浏览器内核和网络传送协议,不去想ps的底层实现,不去涉及游戏引擎的底层开发,不去做什么指纹识别或者人脸识别,嗯,大概率的,你在工作中不是如何“用好”数据结构的问题,而是“根本不需要用”这些数据结构的问题。这是计算机产业逐渐成熟的标志:屏蔽越来越多的底层核心,而让用户能够更加方便的使用。
所以,你在工作中觉得“不知道怎么用算法和数据结构”是正常的,因为你所用的一切工具,就是在让你“不要去用算法和数据结构”:)
在以前,远程通信至少要明白很多通信的基本原理,才能玩得转一台发报机,但如今,一个6岁小朋友拿起手机拨个电话就能通信了,就是这个原理。学习通信的底层原理不是为了能更好的打电话。因为打电话不需要这些通信基本原理。学习通信的基本原理,是努力做一台更好的,甚至超过“电话”这种形式的通信装置。
同理,学好数据结构与算法的核心目的,是能够做更好的操作系统,做更好的编程语言,做更好的IDE,做更好的数据库,做更好的搜索引擎,做更好的文字处理工具,做更好的安全系统,做更好的网络协议,做更好的浏览器,做更好的游戏引擎,等等等等。即使不能创造出更好的,优化这些东西,维护这些东西,都需要大量的数据结构和算法基础。计算机领域的任何一个子领域,稍微深入,就会发现,里面近乎全是数据结构和算法,这些都是实打实的实际应用,这些应用已经深度的改变了人类世界,改变的已经让大家觉得这写内容是如此平常,好像本来就在那里一样:)
这其实很像数学。数学是如此深入的改变了我们的世界,但大家反而觉得数学没用了。可是,仔细想想,现代化的生活,哪里都离不开数学。从通信,到建筑,从家具,到各种电器:)
所以,怎么才能用上算法和数据结构?太简单了。从今天开始,不要光想着怎么组建公司的业务逻辑,也稍微想一想:怎么做一个操作系统?怎么做一个编程语言?怎么做一个IDE?怎么做一个数据库?怎么做一个搜索引擎?怎么做一个文字处理工具?怎么做一套安全系统?怎么做网络协议?怎么做浏览器?怎么做游戏引擎?等等等等。
这些都是世界上前沿大厂在思索的问题,也是这些大厂在招聘的时候,注重算法和数据结构的原因。
一个4s店的修车师傅其实不需要知道发动机的工作原理,他只要能在发动机坏的时候,换一个新发动机就好了,他需要了解发动机是怎么和汽车的其他部分连接起来协同运作的,其实他并不需要知道发动机的内部构造;
但这绝不意味着理解发动机内部构造的知识是没有用的。各大汽车厂商里的高级工程师,就是一帮知道发动机内部构造,可以不断改良发动机,开发更新更好的发动机的家伙;
至于司机呢,完全可以不知道发动机在哪里,怎么和汽车的其他部分连接起来的,甚至,司机不知道汽车里有发动机这个东西都行。司机只需要知道方向盘,刹车和油门,就能把车开得不错了。
用户就是司机。大部分软件行业的业务组建者,其实就是修车师傅;但大厂的核心部门里,都是”懂发动机内部原理的家伙“。我没有说修车师傅低人一等,修车也是一个很好的职业,甚至司机都是一个很好的职业,大家的侧重点不同。但我想说的是,如果你想了解算法与数据结构到底在实际中是怎么用的,你需要去当那些”懂发动机内部原理的家伙“。如果你只是修车,你并不是“不会用发动机的原理相关的知识”,虽然偶尔,这些知识会给你带来一些“wow,原来是这样”的感慨,但在大多数时候,你确实不需要“发动机原理的相关知识”:)
希望我解释清楚了我的观点:)
加油!:)
1162019-10-21