为什么要写这篇文章
从5月份开始,我加入了Coursera上的“斯坦福算法Specialization”, 到现在已经完成了两门课,收获颇为丰富。今天想到一个道理:学习是要有产出的,我回顾了一下这几个月的学习历程,程序写得不少,笔记也记了一叠又一叠,总结性的文章却没有怎么写。这篇博文就是要fill this gap, 我到底学到了什么,这些东西有用在哪里,总结就是为了给自己一个清楚的概念,让我能够很快地回答这些问题。
同时写作也是一个爱好。看到博客上文章的阅读量攀升,我是能够感觉到很强烈的成就感,虽然至今没有评论,但那些真实的阅读量给我一种intuition which is like “我写的东西有人看,这挺好的”。废话少说,我们进入正题。
收获一:建立起与Graph的舒适感
用英文讲就是 Now I can feel more comfortable working with graph. 最早接触图论的时候总觉得它是个高不可攀的东西,各种概念种类繁多;图这个东西不仅有结点,还有边,边还能有向和无向,方向之外它还可以有权重…. 总之对初学者来说,这么多概念砸在一起确实让人挺无奈。大学里学了离散数学,对图论已经有所了解,现在再学起跟图有关的算法,其实是把高中那些overwhelming的知识点重学一遍,自然是感觉舒服得多。
我的Primary Language是Java,现在碰到用得到图的问题,我会很熟练地去使用JGraphT这个API. 在pom.xml
里加上一些dependency信息就能够很好地调用,这是一个挺好的库,跟图有关的操作比如 getEdge(Vertex v1, Vertex v2), getEdgeWeight 还有一些获取结点neighbor的方法都非常实用,免去了自己实现的烦躁。最近实习的项目里需要管理一些dependency, 有些依赖是双向的,有些是单向的,我很自然地就用graph作为数据结构,PM需要app能够取出所有的dependencies 可以用获取结点所有neighbor的方法解决。
我自己的图论词汇量也获得了拓展。Dijkstra 这个词我一直觉得可怕,一方面觉得它的算法难以理解,另一方面我始终不知道怎么念这个名字。这两方面都是问题,但我都找到解决的办法了。如果对图的基本概念熟悉以后,研究一下Dijkstra Shortest Path的伪代码就会发现这是一个非常容易理解的算法,实际上所有好的算法都share this property of simplicity. 我又自己实现了一下,算法在一个很大的data set上运算正确,第一个问题就算我解决完毕。第二个问题其实更简单,视频课里面斯坦福的老师一遍又一遍重复他的名字,我不想知道也要知道了他的读音,j k 都不发音,念它的时候可以把两个字母省略掉… pe