Skip to content

坚持一件小事情

记得小时候看过一个关于挥手的故事,可能很多人都看过:

苏格拉底在上课时,要求他的学生每天做一个简单的挥手动作。动作虽然很简单,但坚持了半年以上的却只有一个人,这个人就是柏拉图。

无意中在qq群里看到有位巨巨提出了一个每天AC一题的想法并得到了很多人的响应。出于just for fun的心态,我也加入了这个活动。活动有固定一个qq群,没有ac的人自觉退群。因为出发点不是利益驱动,所以大家也无所谓故意造假之类的。
活动有一个Github的rep,大家会把AC的代码放到这上面。感兴趣的同学可以 >>戳这里<< 。

我的做法是把我自己每天AC的第一道题代码贴在上面,并标明日期。有记录的是从2016年05月05日开始的这个小游戏,不知不觉间,已经更新到了2017年05月10月。我在这天之后,最终决定停止游戏。

这整个过程总结起来就是两字–“坚持”。

目标很简单,每天都AC一题,但实践的时候,难度并不小。记得自己有好几次因为事情忙,差点忘记写题。印象最深一次是已经23:40了,在床上休息的我突然想起来自己今天好像没有写题,匆匆忙忙跳下床完成了AC。

从一开始的经常忘记到后来的形成习惯,每天坐在电脑前第一件事情就会想想自己今天有没有写题。

记得在准备区域赛的时候,自己每天都会写很多题,所以完成难度并不大,可在自己退役准备考研以后,每天主要时间都花在复习上,经常性是一天中第一次打开电脑已经是晚上22.30以后了,一方面疲惫的自己没精力去想难题,另一方面时间上也不允许我去思考很难的题,所以我只好不得不找点简单的题目写。

但还是坚持下来了,github上记录了我所有的commit过程。当然,偶然有几天发生了意外,我也在github上做了记录和说明。我的记录页面 >>戳这里<<

至于结束游戏的原因也很简单,我确确实实证明了自己坚持的能力,游戏的初衷达到了。能坚持一年以上,这自然已经成了习惯,在外部环境不发生巨大变化的条件下,坚持一年和坚持十年其实是一样的。

坚持是一件很有意思的事情,有时候我经常会问自己是否具有走向成功的必要条件,“坚持”就是我认为其中的一项。 (Continued)

C++坑点记录- set删除

最近在写一道Facebook hacker cup的题时,需要使用平衡树维护操作。遂调用了C++标准库里的set,在确保解题思路没有出错的情况下,我发现自己始终有一组样例无法通过。在检查了很久的细节并找了标程对跑中间过程以后,我发现我在使用set做删除的时候,迭代器发生了和我预想不一样的变化。

我在一个函数中调用了set的erase操作来删除某个迭代器,函数的传入参数为要删除的迭代器,类似如下

set<int> aha;

void del(set<int>::iterator it)
{
    //一顿操作
    aha.erase(it);
}

然后我在main中想要删除一个迭代器,并左移一位或右移一位迭代器,类似如下

int main()
{
    set<int>::iterator now;
    //一顿操作

    //操作1
    now=aha.find(5);
    del(now);
    now--;

    //操作2
    now=aha.find(8);
    del(now);
    now++;
}

上面是我原来的写法,删除这个迭代器所在的位置,然后移位。
但理想很美好,现实有差距。在我用标程对拍以后,我发现上述操作存在很大问题。
使用erase操作删除一个迭代器以后,我访问该迭代器,他仍旧是原来的值。
但当我想要左右移位时,经测试发现不管你左移还是右移,他返回的都是删除的迭代器在原set中的前一个位置。
也即

    set<int>::iterator now=aha.find(8);
    del(now);
    /*
    现在--now和++now都是同一个位置
    为未删除now的set中,now的前一个位置
    */

了解这个就好办了,我预先存下我要删除的位置,然后迭代器先更新,再调用删除即可。
这个主要还是对STL不够熟悉造成的,为此,我后来还去翻阅了set中erase操作的函数原型及返回值

学习Machine Learning

machinelearning1719

最近在Coursera上了一门Machine Learning的MOOC课程。

该课程是由Stanford的Andrew教授授课,内容由浅入深,从基础的机器学习概念到中期的几个利用机器学习的例子再到后来比较复杂的运用,Andrew教授讲得很清晰,哪怕你没有接触过机器学习,也能很容易理解课程。而且大部分课后都会有一个编程的大作业,让你用这周学到的东西实现一个真实的Machine Learning结果。编程大作业里面的内容被分割成一个个的小部分,当你完成了里面的一部分时,可以使用submit进行在线评判该部分是否正确。这有点像我平时OnlineJudge上刷题然后返回结果。

而当完成一份编程大作业的时候,那种感觉真的是非常满足。

比如在学到中期时,我了解了神经网络的算法,并使用该算法成功做出了简单的图像识别(识别图片中的阿拉伯数字):预先将图像的像素点处理好,然后构建多层神经网络,机器一步步学习调节参数,直到最后可以用作预测。

当一张图片显示在屏幕上,并且你的程序给出了该图片中的数字时,我发现原来自己这一周学的东西并不是非常理论性的内容,它能确确实实做出点很COOL的东西。

课程使用的是Matlab/Octave 进行编程,如果你没接触过这两门语言并不要紧,Andrew教授在课程中有讲解该怎么使用。而且,课程也会提供给你一定时限的Matlab授权(课程时间左右),同时,你也可以使用免费的Octave(GNU项目,两者语法基本相同)编程。我自己在Ubuntu下就是使用Octave完成编程大作业。

在此,我强烈推荐对Machine Learning感兴趣的童鞋去听一下这课,由于他的MOOC形式,你可以在任何你有空的时间看,形式非常自由。

我自己把我每周完成的编程作业上传到了>>Github<<以供自己复习和大家参考。