如何更好地理解记忆算法?
来源:1-1 我们究竟为什么要学习算法
Richard0328
2017-01-21
老师您好!我是大二的学生,现在在学习您的算法课程,我觉得学习中比较大的一个困难就是看视频能听懂算法的计算步骤,也就是思想,但是自己要手写相关内容的时候就很容易忘记,特别是每一个循环的I,j,他们的遍历的范围,边界等等经常容易忘记,请问我是需要背诵相关代码吗?怎样才可以达到自己可以手写相关代码的水平?
2回答
-
liuyubobobo
2017-01-22
非常理解你的问题。
首先,个人认为代码不要背。对于算法,第一步是要了解其思路。但是了解思路和编写正确代码之间还是有差距的,这是非常非常正常的。否则算法就太容易了:)事实上这个世界上的大多数事情都是这个样子,说起来很容易,聊聊框架,谈谈路线的,但是真正做起来,完全不是这么回事儿。所以技术界流行的态度是:Don't talk, Show me your code.
当你理解了算法的思路以后,尝试自己编写的时候,就会遇到各种各这样的问题。这个时候,就是锻炼你debug能力的时候。事实上,这种情况在以后你真正工作的时候经常会用到。很多时候我们实现一个功能,在组里讨论,大家讨论的就是逻辑而已。这些逻辑不会涉及具体诸如边界等问题。但是具体逻辑的实现,就是我们developer的任务。我们就是需要把通过自然语言交流出的编程思想,落实到实际的代码上。这恰恰是我们的价值。这个过程肯定会遇到问题,所以我们要调试程序。debug是每一名开发者必须掌握的非常重要的技能,甚至在实际工作中,说80%的时间都是在调试程序也不为过。这是每一个合格的开发者必须经历坎儿,需要极大的耐心,一点儿一点儿跟踪自己的程序,设计简单的测试用例,看自己的程序到底出了什么问题。写的代码多了,调试的代码多了,自然就有了自己的经验。再具体实现中可能会碰到那些问题,问题可能出在哪里,也会有属于自己的经验以及方式方法进行判断。
不过具体到方法论的层面,还是有一些方式可以帮助我们思考,来更快地编写正确的程序的。最重要的一点,我认为是明确每一个变量的意义。这一点或许我在课程中强调的不够。我们设立的每一个变量,都是有他的原因的。这个原因,体现在他的表意上。换句话说,每一个变量都应该在开发者心里有明确的意义。我们必须维护这个意义。举个例子,很多同学觉得写一个快排的partition非常困难,可以看看我在3-5中讲解的,特别强调了:我们在partition中的循环里,就是维护了arr[l+1...j] < v;arr[j+1...i] > v 这样的性质。在这个性质里,其实每个变量的边界很清晰。我们的循环要始终维持这样的定义。我们首先从逻辑的角度想清楚了我们的循环要做这样的事情:让数组的前一部分大于v;后一部分小于v,那么在编写代码的时候,就要用代码维持这个性质。进而,如果我们的程序出了问题,就需要去查证,是不是我们的代码没有维持这样的性质。专业的说法叫做维护了一个循环不变量。如果该兴趣,可以查阅一下这方面更多的内容。同理,我在这个课程中讲二分查找法的时候,也强调了这一点。
希望对你有帮助。
20 -
Richard0328
提问者
2017-01-23
看了老师的回复感触良多,真的很感谢老师的指导,祝老师工作顺利,提前祝老师新年快乐!
00
相似问题