摘要:
一: 作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。二:概念 举个例子,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... 阅读全文
摘要:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了。 令S10=1,容易看出S9=2(S10+1),简化一下 S9=2S10+2 S8=2S9+2 ..... Sn=2Sn+1+2遥想公瑾当年,老师说递归是最... 阅读全文
摘要:
古代数学巨著《九章算数》中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。最后问:井有多深?每家的绳子各有多长?分析:同样这套题也是属于不定方程,拿这个题... 阅读全文
摘要:
百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。分析:估计现在小学生都能手工推算这套题,只不过我们用计算机来推算,我们可以设公鸡为x,母鸡为y,小鸡为z,那么我们 可以得出如下的不定方程, x+y+z=100, 5x+3y+z/3=100, 下面再看看x,y,z的取值范围。 由于只有100文钱,则5x<100 => 0<x<20, 同理 0<y<33,那么z=100-x-y, 好,我们... 阅读全文