最近完成的一些算法题

一个多月没写博客了,赶紧填个坑。

kickstart
离上一篇博客居然已经过去一个多月啦,看来研究生还是要比本科忙多了,每天都有事情要做。最近呢,就是参加了昨天的Google Kickstart Round G 2018,本来顺利做完了2.5题,做完的时候有60名左右,结果有个大数据犯了一个低级错误,结果一个大数据挂了,最后只有100多名!啊!好气啊!看了一下题解,发现方法和我自己实现的方法差挺多的,所以想简单讲一下我的算法。

阅读更多

优化Hexo博客的访问速度

使用CDN和对象存储OSS来优化博客的访问速度

由于我的整个博客部署在GitHub Pages上,从国内直接打开的访问速度是很慢的。过慢的访问速度会使得用户在访问网站的时候失去耐心,导致有些用户可能会直接关闭你的网站,这就会使得网站的用户留存率降低。说句题外话,这就是为什么很多网站在设计进度条的时候并没有反映网站的真实访问速度,而是先给你一个很快的加载动画,让会让你产生好像网站就要加载好的错觉,在一定程度上能增加用户的耐心。这种手段除了应用在微信的网页进度条上,还包括比如一些清理软件设计的清理系统进度条上,还有之前Windows 7在文件浏览器中的文件扫描进度条上等等——好像说的有点远了。总之在这篇文章中,我会以我的Hexo博客为例,介绍一些优化网站访问速度的方法,这也是我在优化这个博客时使用的方法。

阅读更多

报社的故事

本文将通过一个故事带你了解CDN

B报纸是最近新发行的一种特殊的报纸、B报纸会在每周定期发布,并且不对外出售。在B报纸刚刚发行的时候由于读者太少,所以只有在W报社才能看到。此外,报社每次只会印刷少量的B报纸供阅览。小U平时很喜欢看B报纸,因此他会经常专门跑去报社看报纸。

在读者比较少的时候,这种办法相对奏效,但是当观看B报纸的人越来越多的时候,问题就出现了。第一,小U离报社很远,每次要看B报纸的时候,小U都要花好长时间的路程才能到报社。第二,由于看B报纸的人越来越多,有时印刷好的所有B报纸都已经被其他的用户拿去看了,小U这个时候必须要排队,并且等到有人看完之后才能看B报纸。

阅读更多

使用开源评论系统isso

一个开源的评论系统,可惜已经不太维护了,于是我进行了一些简单的修改,并做好了Docker镜像。

我这两天还在寻找合适的评论系统,主要是因为当前可用的评论系统都不能满足基本的要求。我的基本要求其实也就两点,第一,可以通过邮箱直接评论,不需要注册。第二,在有人回复的时候可以发送邮件进行通知。同时,评论者被回复时也可以收到相应的通知。上一篇中提到的Valine勉强支持,可惜Valine在安全性上存在很大的问题。Livere总的来说还不错,但缺乏邮件提醒功能。最终,我还是使用了一个开源评论系统isso,并进行了一部分的调整,部署在了我自己的服务器上。我进行了一些修改,并已经做好了Docker镜像,可供直接拉取使用。

阅读更多

配置Hexo时遇到的一些问题

前几天还在说,使用Hexo搭建博客比较顺利,没什么大坑,后来就接二连三的遇到各种问题。

其实这些问题也不全是Hexo的原因,这些问题在搭建一个静态博客的时候都有可能遇到,不过还是能拿来讲讲,以供参考。Hexo的配置确实非常容易,这一点不可否认。只需要安装好Node.js以及其他必要的依赖,按照官网提供的文档一步一步做就行了。我把博客部署在GitHub Pages上,这样就省去了自己搭建服务器的成本,为了加快访问GitHub的速度,我配置了CDN和对象存储的优化,这在后续的博客中也会慢慢介绍。

阅读更多

第一篇

心血来潮使用Hexo在GitHub上部署了一个Blog,总的来说还是挺容易的,没什么大坑。

记得搭博客最早在高三的时候就试过了,那个时候是在新浪云(SAE)上面搭了一个WordPress,其实现在看来感觉WordPress过于臃肿,不适合做随便写写的那种博客。但那个时候WordPress的宣传语好像是,不用敲一行代码就能搭一个个人博客。Emmmm,要知道那个时候我才刚开始写C和C++,成天面对黑底白字的控制台的时候突然告诉我,现在可以一句代码都不写,直接搭一个个人的博客了,还是很有吸引力的。

阅读更多

PyTorch学习笔记

使用PyTorch的一些笔记,以防写完就忘,看完API又想起来,长此以往。

torch.nn

torch.nn.LSTM

LSTM中的hidden state其实就是指每一个LSTM cell的输出,而cell state则是每次传递到下一层的「长时记忆」,我总觉得这个名字起的特别别扭,所以总不能很好的理解。下面这张图能更好的说明这些变量的意义。

LSTM

再来简单的回顾一下LSTM的几个公式

其中$h_t$和$c_t$就是所谓的hidden statecell state了。可以看到LSTM中所谓的output gate,即$o_t$其实是中间状态,它和cell state经过$\tanh$相乘,得到了hidden state,也就是输出值。

PyTorch中LSTM的输出结果是一个二元组套二元组(output, (h_n, c_n))。第一个output是每一个timestamp的输出,也就是每一个cell的hidden state。第二个输出是一个二元组,分别表示最后一个timestamp的hidden statecell state。因此,如果把h_nc_n记录下来,就可以保留整个LSTM的状态了。

PyTorch中可以通过bidirectional=True来方便的将LSTM设置为双向,此时output会自动把每一个timestamp的正向和反向LSTM拼在一起。而h_nc_n的第一维长度会变为2(单向是长度为1)。而且此时有

即正向output的最后一个timestemp(对应LSTM的最后一个cell)的输出和正向的hidden state相同,反向output的最后一个timestamp(对应LSTM的第一个cell)的输出和反向的hidden state相同。

此外,在PyTorch中,LSTM输出的形状和别的框架不太一样,它是序列长度优先的,(seq_len, batch_size, hz),如果觉得不习惯,可以通过batch_first=True来设定为batch_size优先。

C++ <algorithm> 中比较冷门但实用的函数

总结一下<algorithm>头文件中的常用函数。

每隔一段时间,我总能在<algorithm>中发现一些神奇的函数,这些函数我之前基本上没有听说过,所以最近我阅读了一下algorithm头文件的相关文档,把那些很实用,但是之前没怎么听说过的函数简单的罗列一下。我主要阅读的文档来自DevDocs上的algorithm头文件介绍,此外Visual C++也有类似的文档供参考。

最常用的函数

1
2
3
void sort(RandomIt first, RandomIt last);                                   // 排序
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value); // 求第一个大于等于
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value); // 求第一个大于