摘要: 前段时间做一个产品,盈利方式也就是卖数据给用户,用wpf包装一下,当然数据提供方是由公司定向爬虫采集的,虽然在实际工作中没有接触这一块,不过私下可以玩一玩,研究研究。 既然要抓取网页的内容,肯定我们会有一个startUrl,通过这个startUrl就可以用广度优先的方式遍历整个站点,就如我们学习数据结构中图的遍历一样。既然有“请求网页”和“解析网页”两部分,在代码实现上,我们得需要有两个集合,分别是Todo和Visited集合,为了简单起见,我们从单机版爬虫说起,说起爬虫,就必然逃避不了海量数据,既然是海量数据,那么性能问题不容忽视,在Todo和Visited集合的甄别上,我们选择用Qu... 阅读全文
posted @ 2012-11-02 22:44 一线码农 阅读(12003) 评论(20) 推荐(12)
摘要: 一:用途 用于描述系统的静态结构,或许在所有的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 阅读全文
posted @ 2012-10-17 23:48 一线码农 阅读(9880) 评论(12) 推荐(3)
摘要: 一:用途 对一个开发团队来说,序列图是非常重要的,因为序列图用于描述系统内部一群对象之间的交互情况,尤其在做爬虫这种业务复杂性的项目,序列图可以让我们更快的理清这些复杂流程。二:基本元素 序列图中的uml元素还是相对比较少的,先截个图。1:生命线首先我们要知道序列图有一种动静结合的特点,以类图作为静态结构,用例图作为动态行为的过程。所以我们可以认为生命线就是一个类,比如下图中,customer:Customer ,前者是类的实例,后者是类名,图中的“X”是类的析构函数,也就是销毁。这里有一个注意的地方,我们将图中的”Actor“属性设为True是,该生命线就会变成参与者生命线。2:同步,异步. 阅读全文
posted @ 2012-10-16 23:17 一线码农 阅读(8215) 评论(22) 推荐(7)
摘要: 在所有的UML图中,最容易理解的是用例图,也是元素最少的一种UML图,也是产品经理最拿手的一种图。一: 用途 用例图常用来描述需求,让用户第一时间了解系统所具有的功能,可能有人就会问,几个图怎么可能让人一下就了解系统所具有的功能的?其实在产品经理的prd中都是“图文相依”的形式展现,这里的“文”也就是“用例描述”。二:基本元素 用例图中的所有元素都是初级概念,所以所有的元素都是我们常用的,首先我们还是看看工具箱中的元素。1:参与者,泛化 <1>参与者: 我们知道用例图是展示系统功能的,以后这个成型的系统给谁用,这个系统以后要跟谁进行交互,那 么“参与者”就... 阅读全文
posted @ 2012-09-26 23:24 一线码农 阅读(8498) 评论(23) 推荐(9)
摘要: 在平时的项目开发中,可能有的团队对业务都是用口头在团队里面进行交流,有时程序员的理解跟老大表达的意思不一致,还有其他等等的弊端就不说了。我们知道建筑工人都是按照图纸做事的,同样在软件开发中,我们应该也有这样一份”图纸“,这也就是我们要说的UML,有了它就可以让我们做事统一口径,而从更快的理解业务并完成项目。 可喜的是VS2010已经集成了我们平时最常用的一些UML图,这个系列也准备介绍这4种图。我们从”活动图“说起,平时我们在看prd的时候,经常会看到一些”用例图“和”活动图“,对的,一个好的产品经理这些都是基本功。一:用途 活动图是一种工作流程图,非常容易看懂,非常适合于和用... 阅读全文
posted @ 2012-09-24 00:14 一线码农 阅读(14884) 评论(16) 推荐(16)
摘要: 这一篇说下第二种特征数列,等比数列,同样我们也应该知道它的”基本性质”,“扩充性质”和“判定方法”。一:基本性质 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... 阅读全文
posted @ 2012-09-14 00:12 一线码农 阅读(3432) 评论(7) 推荐(2)
摘要: 这篇就扯一下等差数列,只要看到等差数列,就应该有条件反射的想起它的”基本性质”,“扩充性质”和“判定方法”,之后俺们就可以对相应的题目进行秒杀。一:基本性质 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}是等差数列。 当然这个是将通项公式... 阅读全文
posted @ 2012-09-10 00:21 一线码农 阅读(4344) 评论(3) 推荐(3)
摘要: 好久没写博客了,这个系列就来聊聊数学,我们知道数学是一种工具,更是一种思想,在我们的日常生活和工作中都有广泛的应用。 比如算法中有一种叫做“递推思想”,转化到数学上来说就是“数列”,而我们苦逼的coding,复杂度搞死也只能控制在O(N),但有没有想过对这种问题可以一针见血,一刀毙命,这就需要用到“数学”上的知识。猴子吃桃问题就是一个活生生的例子,评论上给出了很好的解决方案,学习数学就应该能让它解决点实际上的问题,下面来推导一下。 为了方便,将递推公式写成: an=2an-1+2 ①已知首项:a1=1将①变形得an+2=2(an-1+2) ②由②可推导an-1+2=2(an... 阅读全文
posted @ 2012-09-07 01:53 一线码农 阅读(6612) 评论(14) 推荐(8)
摘要: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了。 令S10=1,容易看出S9=2(S10+1),简化一下 S9=2S10+2 S8=2S9+2 ..... Sn=2Sn+1+2遥想公瑾当年,老师说递归是最... 阅读全文
posted @ 2012-08-08 12:40 一线码农 阅读(26365) 评论(23) 推荐(8)
摘要: 古代数学巨著《九章算数》中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。最后问:井有多深?每家的绳子各有多长?分析:同样这套题也是属于不定方程,拿这个题... 阅读全文
posted @ 2012-08-06 16:57 一线码农 阅读(18253) 评论(19) 推荐(6)
摘要: 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡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, 好,我们... 阅读全文
posted @ 2012-08-05 20:22 一线码农 阅读(68129) 评论(57) 推荐(29)
摘要: 我们知道AVL树为了保持严格的平衡,所以在数据插入上会呈现过多的旋转,影响了插入和删除的性能,此时AVL的一个变种伸展树(Splay)就应运而生了,我们知道万事万物都遵循一个“八二原则“,也就是说80%的人只会用到20%的数据,比如说我们的“QQ输入法”,平常打的字也就那么多,或许还没有20%呢。一:伸展树1:思想 伸展树的原理就是这样的一个”八二原则”,比如我要查询树中的“节点7”,如果我们是AVL的思路,每次都查询“节点7”,那么当这棵树中的节点越来越多的情况下就会呈现下旋,所以复杂度只会递增,伸展树的想法就是在第一次查询时树里面会经过一阵痉挛把“节点7”顶成“根节点”,操作类似A... 阅读全文
posted @ 2012-08-04 22:30 一线码农 阅读(19663) 评论(9) 推荐(18)
摘要: 我们知道,二叉查找树相对来说比较容易形成最坏的链表情况,所以前辈们想尽了各种优化策略,包括AVL,红黑,以及今天要讲的Treap树。 Treap树算是一种简单的优化策略,这名字大家也能猜到,树和堆的合体,其实原理比较简单,在树中维护一个"优先级“,”优先级“采用随机数的方法,但是”优先级“必须满足根堆的性质,当然是“大根堆”或者“小根堆”都无所谓,比如下面的一棵树:从树中我们可以看到:①:节点中的key满足“二叉查找树”。②:节点中的“优先级”满足小根堆。一:基本操作1:定义 1 #region Treap树节点 2 /// <summary> 3 //... 阅读全文
posted @ 2012-07-30 02:01 一线码农 阅读(23618) 评论(6) 推荐(19)
摘要: 上一篇我们聊过,二叉查找树不是严格的O(logN),导致了在真实场景中没有用武之地,谁也不愿意有O(N)的情况发生,作为一名码农,肯定会希望能把“范围查找”做到地球人都不能优化的地步。 当有很多数据灌到我的树中时,我肯定会希望最好是以“完全二叉树”的形式展现,这样我才能做到“查找”是严格的O(logN),比如把这种”树“调正到如下结构。 这里就涉及到了“树节点”的旋转,也是我们今天要聊到的内容。一:平衡二叉树(AVL)1:定义 父节点的左子树和右子树的高度之差不能大于1,也就是说不能高过1层,否则该树就失衡了,此时就要旋转节点,在编码时,我们可以记录当前节点的高度,比如空节... 阅读全文
posted @ 2012-07-22 19:58 一线码农 阅读(58601) 评论(45) 推荐(36)
摘要: 一直很想写一个关于树结构的专题,再一个就是很多初级点的码农会认为树结构无用论,其实归根到底还是不清楚树的实际用途。一:场景:1:现状 前几天我的一个大学同学负责的网站出现了严重的性能瓶颈,由于业务是写入和读取都是密集型,如果做缓存,时间间隔也只能在30s左右,否则就会引起客户纠纷,所以同学也就没有做缓存,通过测试发现慢就慢在数据读取上面,总共需要10s,天啊...原来首页的加载关联到了4张表,而且表数据中最多的在10w条以上,可以想象4张巨大表的关联,然后就是排序+范围查找等等相关的条件,让同学抓狂。2:我个人的提供解决方案① 读取问题 既然不能做缓存,那没办法,我们需要自己... 阅读全文
posted @ 2012-07-21 15:44 一线码农 阅读(44165) 评论(47) 推荐(55)