摘要:
很有段时间没写此系列了,今天我们来说Trie树,Trie树的名字有很多,比如字典树,前缀树等等。一:概念 下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?从上面的图中,我们或多或少的可以发现一些好玩的特性。 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 第二:从根节点到某一节点,路径上经过的字符连接起来,就是该节点对应的字符串。 第三:每个单词的公共前缀作为一个字符节点保存。二:使用范围 既然学Trie树,我们肯定要知道这玩意是用来干嘛的。 第一:词频统计。 可能有人要说了,词频统计简单啊,一个hash或者一个... 阅读全文
摘要:
相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上我们需要同样的一种替代物,如果简简单单的在数据库里面去捞,去比较,几乎是完成不了的,这时我们就需要一种协同推荐算法,来高效的推荐浏览者喜欢的商品。一:概念 SlopeOne的思想很简单,就是用均值化的思想来掩盖个体的打分差异,举个例子说明一下:在这个图中,系统该如何计算“王五“对”电冰箱“的打分值呢?刚才我们也说了,slopeone是采用均值化的思想,也就是:R王五=4-{[(5-10)+(4-5)]/2}=7 。下面我们看看多于两项的商品,如. 阅读全文
摘要:
这篇我们看看最长公共子序列的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地。一:概念 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。比如如下的字符串:我们通过种种操作,痉挛之后编辑距离为3,不知道你看出来了没有?二:解析 可能大家觉得有点复杂,不好理解,我们试着把这个大问题拆分掉,将"字符串 vs 字符串“,分解成”字符 vs 字符串“,再分解成”字符 vs 字符“。<1> ”字符“vs”字符“ 这种情况是最简单的了,比如”A 阅读全文
摘要:
一: 作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。二:概念 举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出子序列不见得一定是连续的,连续的那是子串。 我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看出:cnblogs和belong的公共子序列吗?在你找出的公共子序列中,你能找出最长的公共子序列吗?从图中我们看到了最长公共子序列为blog,仔细想想我们可以发现其实最长公共子序列的个数不是唯一的,可能会有两个以上,但是长度... 阅读全文
摘要:
这一篇我们聊聊在页面抓取时应该注意到的几个问题。一:网页更新 我们知道,一般网页中的信息是不断翻新的,这也要求我们定期的去抓这些新信息,但是这个“定期”该怎么理解,也就是多长时间需要抓一次该页面,其实这个定期也就是页面缓存时间,在页面的缓存时间内我们再次抓取该网页是没有必要的,反而给人家服务器造成压力。就比如说我要抓取博客园首页,首先清空页面缓存,从Last-Modified到Expires,我们可以看到,博客园的缓存时间是2分钟,而且我还能看到当前的服务器时间Date,如果我再次刷新页面的话,这里的Date将会变成下图中If-Modified-Since,然后发送给服务器,判断浏览器... 阅读全文
摘要:
在ajax横行的年代,很多网页的内容都是动态加载的,而我们的小爬虫抓取的仅仅是web服务器返回给我们的html,这其中就跳过了js加载的部分,也就是说爬虫抓取的网页是残缺的,不完整的,下面可以看下博客园首页从首页加载中我们看到,在页面呈现后,还会有5个ajax异步请求,在默认的情况下,爬虫是抓取不到这些ajax生成的内容的,这时候要想获取就必须调用浏览器的内核引擎来下载这些动态页面,目前内核引擎三足鼎立。Trident: 也就是IE内核,WebBrowser就是基于该内核,但是加载性内比较差。Gecko: FF的内核,性能相对Trident较好。WebKit: Safari和Chrome... 阅读全文
摘要:
第一篇我们做了一个简单的页面广度优先来抓取url,很显然缺点有很多,第一:数据结构都是基于内存的,第二:单线程抓取速度太慢,在实际开发中肯定不会这么做的,起码得要有序列化到硬盘的机制,对于整个爬虫架构来说,构建好爬虫队列相当重要。 先上一幅我自己构思的架构图,不是很完善,算是一个雏形吧。一:TODO队列和Visited集合 在众多的nosql数据库中,mongodb还是很不错的,这里也就选择它了,做集群,做分片轻而易举。二:中央处理器 群架,斗殴都是有带头的,那中央处理器就可以干这样的事情,它的任务很简单, 第一: 启动时,根据我们定义好的规则将种子页面分发到各个执行服务器。 第... 阅读全文
摘要:
前段时间做一个产品,盈利方式也就是卖数据给用户,用wpf包装一下,当然数据提供方是由公司定向爬虫采集的,虽然在实际工作中没有接触这一块,不过私下可以玩一玩,研究研究。 既然要抓取网页的内容,肯定我们会有一个startUrl,通过这个startUrl就可以用广度优先的方式遍历整个站点,就如我们学习数据结构中图的遍历一样。既然有“请求网页”和“解析网页”两部分,在代码实现上,我们得需要有两个集合,分别是Todo和Visited集合,为了简单起见,我们从单机版爬虫说起,说起爬虫,就必然逃避不了海量数据,既然是海量数据,那么性能问题不容忽视,在Todo和Visited集合的甄别上,我们选择用Qu... 阅读全文
摘要:
一:用途 用于描述系统的静态结构,或许在所有的uml图中,类图是我们最熟悉不过的,在我们没有接触uml的时候,可能都看过类图,早在vs2005里面“解决方案资源管理器”的下边有一个“查看类图”的小图标,并且还能支持“正向“和”反向“工程。<1>反向工程 首先我们定义两个类:User和Product 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 class Prog 阅读全文
摘要:
一:用途 对一个开发团队来说,序列图是非常重要的,因为序列图用于描述系统内部一群对象之间的交互情况,尤其在做爬虫这种业务复杂性的项目,序列图可以让我们更快的理清这些复杂流程。二:基本元素 序列图中的uml元素还是相对比较少的,先截个图。1:生命线首先我们要知道序列图有一种动静结合的特点,以类图作为静态结构,用例图作为动态行为的过程。所以我们可以认为生命线就是一个类,比如下图中,customer:Customer ,前者是类的实例,后者是类名,图中的“X”是类的析构函数,也就是销毁。这里有一个注意的地方,我们将图中的”Actor“属性设为True是,该生命线就会变成参与者生命线。2:同步,异步. 阅读全文
摘要:
在所有的UML图中,最容易理解的是用例图,也是元素最少的一种UML图,也是产品经理最拿手的一种图。一: 用途 用例图常用来描述需求,让用户第一时间了解系统所具有的功能,可能有人就会问,几个图怎么可能让人一下就了解系统所具有的功能的?其实在产品经理的prd中都是“图文相依”的形式展现,这里的“文”也就是“用例描述”。二:基本元素 用例图中的所有元素都是初级概念,所以所有的元素都是我们常用的,首先我们还是看看工具箱中的元素。1:参与者,泛化 <1>参与者: 我们知道用例图是展示系统功能的,以后这个成型的系统给谁用,这个系统以后要跟谁进行交互,那 么“参与者”就... 阅读全文
摘要:
在平时的项目开发中,可能有的团队对业务都是用口头在团队里面进行交流,有时程序员的理解跟老大表达的意思不一致,还有其他等等的弊端就不说了。我们知道建筑工人都是按照图纸做事的,同样在软件开发中,我们应该也有这样一份”图纸“,这也就是我们要说的UML,有了它就可以让我们做事统一口径,而从更快的理解业务并完成项目。 可喜的是VS2010已经集成了我们平时最常用的一些UML图,这个系列也准备介绍这4种图。我们从”活动图“说起,平时我们在看prd的时候,经常会看到一些”用例图“和”活动图“,对的,一个好的产品经理这些都是基本功。一:用途 活动图是一种工作流程图,非常容易看懂,非常适合于和用... 阅读全文
摘要:
这一篇说下第二种特征数列,等比数列,同样我们也应该知道它的”基本性质”,“扩充性质”和“判定方法”。一:基本性质 1:通项公式: an=a1qn-1 2: 前n项和公式: Sn= a1(1-qn)/(1-q)二: 判定方法 1: an+1/an=q (q是常数) => {an}是等比数列。 2:an=cqn => {an}是等比数列。 3: an+12=an*an+2 => {an}是等比数列。三:扩充性质 1: an=am*qn-m; 2: 若m+n=p+q 则 aman=apaq; 3: 若{a... 阅读全文
摘要:
这篇就扯一下等差数列,只要看到等差数列,就应该有条件反射的想起它的”基本性质”,“扩充性质”和“判定方法”,之后俺们就可以对相应的题目进行秒杀。一:基本性质 1:通项公式: an=a1+(n-1)d; 2: 前n项和公式: Sn=n(a1+an)/2; Sn=na1+nd(n-1)/2;二: 判定方法 1: an+1 -an=d(常数) => {an}是等差数列。 2:2an+1=an+an+2 => {an}是等差数列。 3: an=kn+b (k,b为常数) => {an}是等差数列。 当然这个是将通项公式... 阅读全文
摘要:
好久没写博客了,这个系列就来聊聊数学,我们知道数学是一种工具,更是一种思想,在我们的日常生活和工作中都有广泛的应用。 比如算法中有一种叫做“递推思想”,转化到数学上来说就是“数列”,而我们苦逼的coding,复杂度搞死也只能控制在O(N),但有没有想过对这种问题可以一针见血,一刀毙命,这就需要用到“数学”上的知识。猴子吃桃问题就是一个活生生的例子,评论上给出了很好的解决方案,学习数学就应该能让它解决点实际上的问题,下面来推导一下。 为了方便,将递推公式写成: an=2an-1+2 ①已知首项:a1=1将①变形得an+2=2(an-1+2) ②由②可推导an-1+2=2(an... 阅读全文