目录
文章6900字,阅读时间约5分钟
【概述】
学习编程有两门基础课程,即数据结构和算法。数据结构中网络公开课中评价一直居高不下的就是UCBerckley的数据结构了。数据结构是CS入门的内功心法。就像九阳神功,掌握了内功心法,张无忌再去学习乾坤大魔移,太极拳法等等就能很快的融会贯通。内功不足直接学一些招式可以很快的看到效果。就像梅超风九阴白骨爪,白蟒鞭法摧心掌名震江湖,但内力不足则后劲不足。但这一门伯克利的Data Structure就相当于上卷的九阳神功,主修内力。虽然修炼需要的时间长,却十分值得。
网上传的帖子“3个月学会JAVA,月薪3000到1万!”,“想要转码,这样刷题就对了!”。“我就是普通人,这样学JAVA,3个月跳槽大厂”。让你忍不住点进去看,有些很坑人。朋友们,在错误的道路上行走,你觉得走得很快,此时快就是慢。学习编程不在于用多久学会了java,python。而是在于在对的路上持续行走,在重要的路上扎实推进。这个时候,慢就是快。幂律法则中提出自然界的一大规律呈现二八分布,成甲在《好好学习》中提到将80%的精力投入到此门技术前20%重要的知识上学习,效率是最高的。而“数据结构”就是编程这门技术的前20%最重要的部分。
CS61B主要用java编写,前面几节课课讲述java的语法和用法。后面开始进入数据结构部分,数组,链表,二叉树,图,搜索,排序。其中一部分 与普林斯顿的神课 Algorithms 有重复部分,但普林斯顿的算法课更深一些,跟注重算法的思想的探究。如果是小白,入门编程,先修这一门是不错的选择。
【课程传送门】
- 课程名称:CS61B (Data Structures)
- 课程定位:入门
- 所在学校:UCB
- 讲师:Josh Hug
- 课程链接:https://fa20.datastructur.es/index.html
【课程评价】
- 老师幽默风趣,讲课深入浅出。 Josh在伯克利的评价确非常非常的高。他有多受欢迎呢?在reddict上学生对他的抱怨就是 “The only negative thing about Josh Hug is that he doesn't teach every course in which I am enrolled. 我想起大学教我C++的化学老师(没错,我们化院教计算机的也是化学老师),我学的一塌糊涂,就是老师太烂啊。C++语法就讲半个多学期,后面两节课上机直接懵逼。hug是边编程边讲语法概念像扣子一样缝进你的知识体系里。每节课之间的知识点连接得很紧密,循序渐进的深入。我们原来的C++老师是罗列了一对知识晶体摆出来赤果果的给你看让你背。Josh是先放一块晶体,放第二块进去的时候告诉你他们的联系和关系是一条直线,再放下一块,这一块和以前知识晶体的联系是一条波浪线。循序渐进的帮助你搭建出了一个知识体系,告诉你他们的关系呈现三角形。这样的方法让我记的更牢固了。
- 教材好。我记得我大学学习必修课C++教材的还是我们大学自己编的,现在看完了《My first Head Java》《Data Structures》《Algorithms 4th》,回头看才发现我们当时学的教材也真tm的烂,学习曲线陡峭的一飞冲天,像我这样资质平庸的人根本就在山脚下倒了。虽然陡峭,但我们可以多好几条路走。我的感受就是遇到不会的概念就去多看几本参考资料,上网找帖子,youtube上搜索相关视频。你可以从多个维度去看待这个概念,这条路陡峭,我们可以选择山后面的梯田啊。你可以将难以理解的概念想象成一片拼图,你拼不进去你的脑海里是因为大脑中没有找到他相邻的拼图(相关的基础的神经回路),但左边突出部分拼不进去,可以去试试右边凹进的形状啊。像hashtable我刚学的时候,觉得好难好抽象,对于其中用到的liner probing 方法说的云里雾里,我就找youtube小连环画的视频,廖雪峰java网站上看读同一个概念的解释,感觉好懂多了。
-
注重实践。这门课的作业和项目很棒。
2020的版本的内容更加丰富,项目有4个,后两个大的project做完后收获很大。一是将A*,Tries,Priority Queue,Map,HashTable 多个数据结构和复杂的搜索算法融合在一起的BearMap。你会实现伯克利校园大小的谷歌地图,完成地图查询,道路搜索,路径指引。 第二个大的project是 设计一个游戏Build your Own World,这个项目不需要fancy的数据结构和算法,主要锻炼你handle比较大的项目的能力。Lab每次任务比较琐粹了,共有13个。 Homwork有两个,一个是basic java synax,一个是Disjoint Set结构的延伸题目。
-
完全免费。
【课程版本选择】
本课程有很多版本,如果你想要使用本课程自动评分系统的话,可以选择2018spring的版本跟着学,因为只有这一年的邀请码公开在了github上面。如果你觉得自己就可以写测试代码,推荐你学更近一期的课程。我开始学的是2014年版本,还是在黑板上手输入的那种,环境搭建没有lab支持自己花费了很多的时间。后来发现了2020 Fall版本,因为疫情的大家都是网课,所以在网络上可以找到非常非常全面的资料。关于lab,homework和project每个步骤怎么做非常详细。是我最爱的版本。
【课程教材选择】
开始学习Java的基础的时候,可以看《My First Head Java》,通俗易懂,幽默风趣,就像看小说一样,每天翻几页。后来讲解数据结构的时候,最有效率的课本当然是Josh自己在github是哪个写的课本啦。链接放在这里。老师推荐的看的书是这个Data Structure。看了一段时间Josh自己编的书,学到后面的数据结构的时候就感觉不够用了,讲的比较浅。我就看了红宝书4版《Alogrithms 4th》里面的代码都是用Java实现的,不是伪码,很容易理解。课程的后半段和《算法》课有一部分重叠,我就是看算法4th这本书的。
【课程难度与作业量】
每周大约10小时,3个小时视频可按讲义,4个小时写作业,2-3小时左右看《my first head java》和课程自己变得e-textbook。我是完全小白,什么编程语言都不会,学的比较慢,我用了4个月才学完这一门课。
【课程简介】
上完这门课你会学到什么呢?
1)了解数据结构类型
这门课是用Java学习数据结构。数据结构的存储方式两种“数组”和“链表”。这是数据结构的源头,是数据结构大厦最基础的两块基石。其他的数据结构知识这两种基础数据结构的变种而已。比如说“Stack”,“Queue”可以用链表可以用数组,数组实现就存在扩容的问题,链表实现就需要更多的内存来存放指针。用数组结构实现堆和栈的API我们可以选用ArrayList,用链表实现的话我们可以选用LinkedList。这门课中作业用数组和链表两个数据结构实现双端队列就是一个非常好的作业。
[树]这种结构,用数组来实现就是[堆],一个完全的二叉树;如果用链表实现就是最常见的二叉树,因为不一定是完全二叉树,所以我们需要指针指向子节点。从次延伸出红黑树,KD-Tree(一次很好的大作业),B Tree,BPS Tree(project3随机地图会用到)
[图]这种结构,用数组实现就是邻接矩阵。可以很快速的判断临边。但是如果边比较稀疏的话相对会浪费掉一大部分空间。此时用链表实现,就是邻接链表。虽然效率会慢一些,但节约了大量的空间。
[哈希表] 就是通过一个散列函数将key银蛇到一个大的数组里面。对于解决哈希表冲突的方法,可以用数组结构,也可以用链表结构。lineat probing 法需要数组的特性,占用空间少,只是删除的时候需要重新排序,以便连续寻址。seperate chain法需要链表的特性,同一个key接一个链表,操作简单。但需要而外的空间存储指针。
以上就是这门课中涉及到的数据结构了,或许你会感叹,万事皆是链表啊。这也就是为什么Josh会用两个章节的内容讲解链表吧。
2)根据场景应用数据结构
我们学了数据结构,应用的操作基本就是四个 “增删查改”。所有的数据结构都是根据数据的特性设计,按照最终目的,选择最优的的方式去实现“增删查改”这几项操作的。
如何高效的去增删查改,也就是访问,就是应用数据结构的重点了。
数组是线性结构,他的访问框架:
traverse(int[] arraylist){
for(int i=0; i<arraylist.length; i++){
print(arraylist[i]);
}
}
链表是非线性的结构,访问的框架有两种,一种是用