Homework_01
首先说说GitHub
第一次用GitHub,也是第一次代码版本管理器,暑假的时候在实验室写一个java的项目的时候,就挺烦的,不知道怎么能够管理每天的修改,只能不断地加包,显得很累赘,也不好分清楚不同包之间到底有哪些变化。现在有了GitHub,问题就迎刃而解了。
当然,因为是第一次接触GitHub,自己也做了很多尝试,所以就会出现很多奇奇怪怪的repository,而且还不知道怎么删除,不过我相信在后续的课程中不会再出现这种情况。
关于作业题
看到题目,不由自主的就想到了一个O(N^2)的算法,但是想想,如果就这么用两个for循环,简简单单地做完了作业,这应该不太符合老师的用意。
所以,出于算法优化的考虑,我开始一步一步推演O(n^2)算法,希望从里面找出一些可以省略的地方。刚开始还觉得算法无懈可击,不过,观察了一段时间后,自己又结合上学期算法里面讲过的最长公共串,然后便想到了用动归的方法来解决这个问题,应该能使算法复杂度降到O(n)。
算法如下:
在O(n)的算法下,顺序遍历数组。在遍历的过程中,在添加第i个元素时,得出来的结论其实是基于第i-1次的结果。并且,添加第i个元素后,得到的结果,也只有两种变化,一个是以它为结尾的新字串,一个是与它无关的旧串,如果是后者,那么很容易知道,无需修改。如果是前者,那么就得看第i个元素是是正是负。
所以就得到了如下两行关键代码:
tailMax = Max(tailMax+arr[i],arr[i]);
result = Max(result, tailMax);
tailMax是最大尾串。result是最终结果。
至此,算法完成。
和所给参考比较
发现自己对这种问题的理解还是不够深刻,虽然可以写出O(n)的算法,但是,相比参考给出的4种解法,我完全没有想到有O(nlogn)的算法,其实,后来回想起来虽然nlogn算法复杂度更高,但是,其中蕴含的分治思想还是需要我们掌握的。
心得体会
第一次写这种偏科学性的博文,心里还是有点紧张的。而且我发现,写博文时的思考与自己在写代码时的思考是不一样的。在写代码时,我们往往只追求一种,自己悟了就悟了的地步但是这样很有可能是自己的一时灵感所致,而在写博文的时候,你要想的是,怎么能让别人看懂你书写的算法,理解你的思维脉络,这是很难得一点。
比如这次,我就纠结了好久,怎么措辞能够更为的简洁易懂。最终结果发现,自己所写的,和自己心里所想的差别很大,以后在这一方面还是要加强。这也是为以后写论文做准备吧!
至于书籍
我也是和大部分人一样,用的是《代码大全》。