为什么java都有数据结构,封装的已经非常好了,为什么还要出此课程呢,一开始我以为是运用已经有的方法做leetcode题目

来源:2-9 均摊复杂度和防止复杂度的震荡

qq_人生若只如初见_106

2018-12-28

为什么java都有数据结构,封装的已经非常好了,为什么还要出此课程呢,一开始我以为是运用已经有的方法做leetcode题目,重写的这些方法有什么用吗?

写回答

1回答

liuyubobobo

2018-12-29

当然有用啦!


1)所有领域的底层原理课程,都是在探讨已经实现好的技术,底层到底是怎么实现的。我们不能因为计算器可以直接帮助我们计算加减乘除,就不去学习加减乘除是怎么回事儿。我们也不能因为我们已经有成熟的操作系统可用,就不去探讨操作系统的原理;有成熟的编译器可用,就不去探讨编译器原理;有成熟的芯片可用,就不去探讨芯片的原理。


2)为什么所有领域都要探讨已经实现好的技术,底层到底是怎么回事儿?因为如果想改进已经实现好的技术,进而创新更优秀的技术,必须了解当下的技术,原理是怎样的,有什么限制,有什么假设,有什么优点,又有什么缺点。所谓站在巨人的肩膀上。只有了解了当下,才能着眼未来。


3)在具体应用上,也只有了解了这些数据结构的底层封装机理,才能更好的应用。在这个课程中,你将看到很多数据结构,从用户的角度看是一样的,但是由于底层机制不同,所以适用的场合不同。比如很快你将看到,动态数组和链表都是线性结构,但是包装成队列这种数据结构的时候,效率是不够的。因此,我们才会探讨循环队列的实现。


4)这个过程本身也是一个学习计算机技术,提高计算机思想的过程。你可以理解成课程中所处理的每一个问题,就是一个Leetcode上的问题。比如你看到这一小节,应该已经学会了动态数组的resize机制。resize这个机制本身,就是一个典型的技术问题。你不妨设想:Leetcode上有一个问题,让你尝试解决静态数组是“静态”这样的限制,要怎么做?答案就是resize。实际上,Leetcode作为经典的面试题库,就是因为其中隐含着大量的考察这类底层机制的问题。另一方面,功利的讲,从面试的角度,各个大厂的面试问题,本身也是考察这些已有技术的底层机制。


5)并不是课程中所讲的每一个数据结构,Java中都有封装的。比如这个课程中介绍的线段树,Trie和并查集,Java中都没有封装。要想使用这些数据结构解决问题,就必须自己从底层实现。实际上,越高级的数据结构,语言的标准库中越不会封装。学习高级数据结构的基础,就是先搞懂这些基础数据结构。


6)另一方面,Java语言属于在标准库中封装的数据结构最多的语言了。很多其他语言,连很多在Java中看是“标准的数据结构”,都没有封装。比如go。如果使用这些语言解决一些问题,就要自己从底层实现这些数据结构。甚至,很多项目本身,就是要提供更优秀的数据存储结构,乃至发明一门新的语言,对着门新的语言,提供更多底层数据结构支持。要完成这些项目,都需要扎实的基础数据结构的功底。


7)最后,如果你对Leetcode题目感兴趣,可能我的这个课程更适合你:https://coding.imooc.com/class/82.html


加油!:)

4
3
ciggii
回复
qq_人生若只如初见_106
你怕不是个傻子哟
2020-02-16
共3条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程