为了账号安全,请及时绑定邮箱和手机立即绑定

新的一年,写一系列算法分享,名曰【算法杂谈】,此为序

大家2017新年好:)

去年10月底,我在慕课网发布了一个新课程——算法与数据结构。其实思考做这样一个课程已经很久了。因为自己在本科的时候曾经参加过ACM,成绩还算可以;后来研究生毕业以后参与创业,经常和各式各样的创业团队和技术人打交道;由于自己的技术背景,也经常受邀参与一些创业团队的技术面试,让我“把把关”;更重要的是,我还一直保持着关注算法的热情。闲暇时间随便思考一些算法问题是我的一个小爱好,就好像有人喜欢玩儿填字游戏,有人喜欢做数独一样。从经典的算法思想的应用;到精灵古怪甚至有些不靠谱的“算法脑筋急转弯”;再到热得大红大紫的机器学习算法,我都来者不拒。因为和自己正在做的事情相关,很多算法思想也能在实际项目中有所实践。去年,一家在北京做智能创业的团队还邀请我和他们的技术同学们分享了关于机器学习算法的一些思考。

因为一直关注着算法,也了解国内学府中算法教学的一些弊端,所以一直想做一套算法课程,和大家分享一下自己的思路。可是想归想,真的做起来确实还是很费劲的。算法是一个太大的领域,里面的知识点众多又很琐碎,加上课程时间有限,大家的水平又不尽相同,平衡这一切对我来说是一个很大的挑战。当我用尽自己的洪荒之力把整个课程做出来以后,其实也并没有能让自己100%的满意。所幸,我还是坚持了一些自己希望的东西,比如整个课程尽最大程度地强调实践,而暂时摒弃了很多枯燥的算法分析。我认为对于计算机学习来说,应该把实践放在理论分析的前面(放在前面不代表抛弃!)。甚至很多内容,可能需要先做出来,才能想通。即便算法这个看似很理论的领域也应如此。于是就有了课程中,我们不断尝试将算法运行在大数据上,来体会算法设计的作用和算法优化的威力。类似下面这样的算法性能测试,近乎是贯穿进课程的每一章节的。

Screen Shot 2017-01-03 at 12.00.45 PM.png

稍微改变一下思路,改动几行代码,整个算法的效率就发生了改变。这是我希望同学们能体会到的。通过亲自操作,了解算法课本上抽象地复杂度分析具体体现在了什么地方。很多同学在这个过程中体会到了“玩儿”算法的乐趣,其实这也是我希望传递给大家的。我也是因为算法如此“好玩儿”,才会闲来无事研究算法问题的:)

algo5.png

让我高兴同时也是意想不到的是,很多同学通过这个课程收获了更多。在群里,有现在战斗在ACM一线的算法大牛,他们愿意学习这门课程,给了我很大的信心:

algo1.png

也有职场老鸟。在晋升的道路上,这门课程能够有所帮助,也是我的荣幸:)

algo2.png

还有的同学拿到了offer,虽然我还在策划专门针对算法面试的课程:)

algo7.png


按照慕课网的规矩,每一个新课,尤其是实战课,讲师最好写点儿什么,来对新课做一个宣传。我本来酝酿了很久,想写一篇类似《算法为什么重要》这样的文章。不过后来发现,其实很多想说的话,都放在了这个课程的第一小节,《当我们谈论算法的时候,我们在谈论什么?》里面(虽然由于版权的原因,慕课网删掉了我举得很多算法在影视作品包括音乐、游戏等娱乐领域实际应用的例子。有时间,我会再整理一下的)。正因如此,这篇宣传文章,我迟迟没有写,而是把更多的精力,放在了做这个课程的“客服”上,直到今天。

但是回头看,我发现大多数同学,还是很能理解算法的意义的。尤其是现在这个时代,智能领域开始大规模地爆发,算法一词也被越来越多的人所熟知。(虽然机器学习领域的算法和我们在这里谈论的“经典”算法还是有着本质的区别。)不过尽管如此,对于学习算法的必要性,依然有很多争论。在这里,我并不想站队,也不想非常极端地说算法是必须要学的,或者是完全不重要的。生活经验告诉我们,非黑即白地看待任何问题,所得出的结论大抵都是片面的。我们所生活的世界是如此的复杂,以至于把这个世界尽量看完整就已经是一件极度艰巨的任务了。或许我们不应该着急下结论,而应该更多地去了解事情的每一个侧面,通过这些了解,以及自己的思考,结合自己的经历和优势,选择一条最适合自己的道路。深入展开谈“学习算法到底是不是必要的”这个话题,可能需要再写一篇文章了。有时间我会再和大家深入分享一下我对这个问题的看法:)但我相信一个简单的共识应该是有的:了解算法基础,并不是什么坏事儿。更何况稍微有点儿水平的IT公司,都一定要面试算法,尽管其工作岗位可能在一些同学眼中“并不需要算法”。而且,算法面试的内容,也并没有那么深奥,远远不需要啃完一本厚厚的《算法导论》。其实,这个课程是一个很好的开始。

很多同学很纠结,因为这个课程是使用C++语言写的,但是大多数同学的工作语言不是C++。虽然大多数同学都接触过C/C++,但也对C/C++有畏惧感。对此我完全理解。毕竟,这个年代还需要手动管理内存的语言已经不多了。其实这也是我在做这个课程的过程中,很纠结的一件事情。最后,我还是选择了C++语言。1)我认为C++的覆盖面最广,即使很多同学“不精通”,但学习算法也不需要精通C++。算法是一种思想,语言是表达的工具,我希望大家专注在算法思想的表达上;2)顺便简单看看内存的管理,包括指针的操作,也没什么不好,毕竟计算机底层是相通的;3)通过课程学习,看懂了算法思想,大家再尝试用自己熟悉的或者常用的工作语言,把这些算法再实现一遍,其实是非常好的训练,也对更深入的理解另一门语言有帮助。

尽管如此,依然有同学对待学习非常“完美主义”,看了一部分课程以后,表示自己又回去啃C++了。我很欣赏这样的学习态度,但对于这门课程来说,我认为大可不必。我在这个课程的群里和问答区里都已经分享了我的一点学习经验:学习切忌完美主义。获得了很多同学的认同。

algo6.png

尽管如此,我和慕课网的小伙伴们也意识到了:应该为大家提供另一个选择。为此,这门课成后续会再做一个java实现版本,实现课程中的所有代码并配有视频。java版本不会单独收费,放在已有课程中。想看C++实现的同学请点击C++的视频;想看java实现的同学请点击java视频。这个事情可能要等到2017年上半年才会完成。在这里,我先对等待的同学说抱歉了。

对于这个课程,我还一直在思考,对于已经购买这个课程的同学,如何能够让他们更加的物超所值?在这个课程的介绍里,我曾经说过,希望这个课程是“活”的。毕竟,算法领域零零散散的问题,有太多内容可以分享。就算不是零散的内容,每一个算法可以延展出的内容也太多了。我在短短的一个课程里,很难把他们都涵盖上。正因为如此,我希望这个课程的内容只是一个“主线”。基于这个主线,希望大家能够对基础的算法和数据结构有一个整体的认识,进而,可以自己再不断深入,在繁杂的算法世界里遨游。非常高兴,有些同学通过这个课程的学习,拥有了这样的收获。

algo3.png

不过也正因为算法领域有很多零散的问题,我决定从2016年12月26日开始,也就是这个课程正式上线八周以后(这个课程最初设计希望同学们花八周时间学完),每周分享一到两个算法的话题。这些话题有可能是结合课程相关的算法面试问题;有可能是课程没有细讲的某个具体算法思想或者数据结构;也可能是我觉得值得分享的学习经验。和代码相关的分享,我都会在一周后给出完整的代码和解答思路;如果是面试问题,我会尽量选择在线OJ支持的问题,这样方便同学实际操作,来检验自己的实践水平。对于这些分享,我会有选择地放一部分在慕课网的手记中,公开和大家一起分享。大家也可以把我的这个分享内容理解成是防盗版的一个手段。毕竟盗版可以一次性盗走视频内容,但是每周盗走不固定的分享内容,成本就高了很多。希望通过这个举措,大家觉得购买bobo老师的这个课程不太吃亏:)

新的一年,每个人都有自己的小目标。我的小目标,就是能够把这个有意义的分享坚持下去。让更多的同学面对算法不要总是挠头。我也不知道自己能不能做到,但是不去尝试,就永远做不到。也希望大家能够监督我。随时给我提建议。

自己没什么文采,于是给这个算法分享起了一个很俗的名字——《算法杂谈》。此为序。

祝大家在2017年,都收获满满。在追寻梦想的道路上,更加斑斓:)


关于我的更多文章,欢迎关注我的公众号:是不是很酷:)

图片描述

点击查看更多内容
159人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消