以Java语言学到的数据结构不能举一反三到其它语言
来源:10-2 Trie字典树基础
真宰
2018-09-16
bobo老师:
我之前学过 C,C++(不是很深入),现在看到您用 java 描述的数据结构和算法时,我就想用 C 的思路去扩展一下,看是否能梳理出相应的C 语言描述的结构。但是问题是:有很多我自己想不太清楚,还是要去网上搜索相关的代码学习一下。
- 这是因为我数据结构和算法基础不是很好的缘故么?
- 有什么方法能克服这种障碍,实现在多个语言中出入自如?
谢谢 bobo 老师分享经验!
之前我看过一本算法竞赛训练指南的书,里面的内容啃起来比较困难,还是 bobo 老师的讲解和代码逻辑更清晰易懂。如果老师出一套“算法竞赛培训系列视频”,我觉得会有销量的。对于我来说,一开始没有机会接受算法竞赛那种思维训练,总感觉编码的思路、逻辑和结构不够灵活,也不能很好的扩展思维。算法竞赛思维对于我这种类型的学习者来说,应该能帮助甚大。老师出的话,我先预定一份~~
1回答
-
首先,如果你能做到对于本课程的内容,学完以后,不参考课程的代码,将这些数据结构能够自己根据自己理解的逻辑,写出相应的Java代码,至少对于这个课程所介绍的数据结构来说,你已经掌握了。掌握了这个课程所介绍的所有数据结构,我坚信你的数据结构水平也在中上层次了。注意,这里我说的“自己根据自己理解的逻辑实现”,不是指背代码,是指你清楚的理解每一种数据结构的每一种操作背后的原理,根据这些原理写出了代码。写出的代码也不一定一次性写对,但最终能调通,就ok。
如果你的数据结构在一门语言上已经足够过关了,却无法在另一门语言上顺畅的实现出来,我倾向于认为是语言问题,而不是数据结构的问题。你对另一门语言没有熟悉到能够把自己想清楚的逻辑随意表达出来的程度。不过,用另一门语言实现一遍所有的数据结构,对于不了解怎么实现的语法特性在网上查清楚,本身是一个非常好的深入学习语言的方式。
在这里,你的问题究竟在哪里,你要自己感受一下:阻碍自己用另一门语言实现的关键,到底是数据结构上的问题,还是这门语言的语言特性问题。从而找到自己的原因和进一步学习的方向。
由于你提到了C语言,我要特别说一下。虽然C语言是所有计算机专业的必修课,但是我个人不建议使用C语言实现这个课程的所有代码,这是因为C语言不支持面向对象。你应该可以看到,这个课程的代码是大量依托于面向对象的编程思想的。使用不支持面向对象的语言实现,由于从编程范式上有着本质的不同,将造成更大的阻碍。相较而言,我建议使用C++来实现这个课程的代码,而不是C。
当然,我并不是说C语言没有用,实际上,我是建议所有计算机专业的同学都接触一下C语言的。但是这个接触不应该是在大一初学计算机的时候,我更倾向于认为在大三学习操作系统的时候接触更好。由于C语言更接近底层,所以应该放在更进阶的内容中去理解。这就好像我们现在已经不可能用汇编作为计算机的入门语言一样,但对于计算机的理解,学习汇编还是很有意义的。不过这扯远了。
既然扯远了,就多说一句,C语言也是可以实现面向对象的编程思想,有兴趣可以搜索相关话题。如果你使用过一些比较古老的框架的话(比如苹果的一些底层框架。。。),更会实际接触到基于C语言通过面向对象思想编写出的API。关于使用C语言实现面向对象的编程思想,这方面最好的一个学习材料应该是这本书: http://www.planetpdf.com/codecuts/pdfs/ooc.pdf,我也推荐所有学习过C语言的同学读一遍。无论是对C语言,对面向编程,甚至对计算机程序设计的理解,都能上一个阶梯。但是,依然是,这些属于高级话题,初学计算机不应该接触。有现成的面向对象语言,非要从不支持面向对象的语言出发,绕远去实现面向对象语言的功能,不是最优的学习路径。因为我相信你买这门课,是想学习数据结构,不是想学习如何使用C语言实现面向对象的语言特性。学习一定要认清目标,朝目标去,不要跑偏:)
关于算法竞赛,我近乎肯定不会做一门课程叫做《玩转算法竞赛》,这是因为一门课程无论如何是无法玩转算法竞赛的。算法竞赛之所以难,除了深度以外,另外一个很重要的原因,是其涵盖的内容广泛。从基础的数据结构到高级的数据结构的灵活运用;从各种算法范式的设计应用到算法模型的建立;图论,数论,计算几何,组合数学,运筹学,博弈论,离散数学......太多的内容,全都在算法竞赛的范围里。事实上,无论是我的《算法与数据结构》中介绍的索引堆和并查集;这个课程中的Trie和线段树;《玩转算法面试》中的算法设计相关内容,都同时也是在照顾准备算法竞赛的同学。当然,肯定是远远不够的。如果不出意外,我以后也会逐渐推出更多课程,专门阐述一些细分领域的算法知识,其中涉及的高级内容,都能在算法竞赛中有用武之地。敬请期待:)
我不确定你现在的水平,如果你现在正在准备算法竞赛,去看《玩转算法面试》的课程,以那个课程为纲,从刷Leetcode开始,其实是很好的入门级准备算法竞赛的方式。当然,Leetcode中问题相对算法竞赛,难度是不够的。但是其中涉及的很多基础问题,如果能够想清楚想明白,达到切Leetcode如切瓜的水平,在我看来其实已经具有了相当的算法水平。在算法竞赛中也是具有相当的竞争力的。即使是我,现在在慕课网上很多同学提出的Leetcode上的问题,在回答这些问题的过程中,也能不时的有新的感悟和收获:)
当然,想在算法竞赛中取得好成绩,肯定还是要去见更难,更复杂的问题。我想表达的是,不要忽视基础。而且,根据我的经验,其实在算法竞赛中,基础比大多数选手想象的要重要得多。对于基础的扎实掌握,甚至可以帮助你推导出高级的算法模型;但是基础不牢靠,就算接触了很多高级算法思想,可能大多也是死记硬背而已,无法做到消化吸收乃至灵活运用,近乎不可能在高水准的算法竞赛中取得好成绩:)
加油!:)
462018-09-16
相似问题
回答 1
回答 1