<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>::SinRain&#039;s Blog:: &#187; Algorithms</title>
	<atom:link href="http://www.sinrain.cn/category/all/sci/algorithm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sinrain.cn</link>
	<description>Simple Dream Easy Go~</description>
	<lastBuildDate>Wed, 28 Jul 2010 09:30:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>再说Common Sub-sequence</title>
		<link>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/</link>
		<comments>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:15:32 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>
		<category><![CDATA[Code Jam]]></category>
		<category><![CDATA[LCS]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/</guid>
		<description><![CDATA[在之前的一个文里有谈及到过最长公共字序列的问题，这个可以用来衡量俩个序列的相似度。
今年的Goolge Code jam的qualification Round 也有一道类似的问题：
【Sub-Sequence-Match】x=[]是一序列，y=[]是... ]]></description>
			<content:encoded><![CDATA[<p>在之前的一个文里有谈及到过最长公共字序列的问题，这个可以用来衡量俩个序列的相似度。</p>
<p>今年的Goolge Code jam的qualification Round 也有一道类似的问题：</p>
<blockquote><p>【Sub-Sequence-Match】x=[]是一序列，y=[]是另一序列：问x中共有多少个不同的子序列等于y</p>
</blockquote>
<p>和这个问题有一点类似的问题是IJCAI07的一篇文里提到的：</p>
<blockquote><p>【All-Common-Subquence】x=[]是一序列，y=[]是另一序列：问x，y共有多少个不同的公共子序列</p>
</blockquote>
<p>想法还是DP:</p>
<blockquote><p><strong>For S-S-M:</strong></p>
<p>def f(x,y):     <br />&#160;&#160;&#160; if len(x)&lt;len(y):      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0      <br />&#160;&#160;&#160; if len(y)==1:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; count=0      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for k in x:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if k==y:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; count=count+1      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return count      <br />&#160;&#160;&#160; a=len(x)      <br />&#160;&#160;&#160; b=len(y)      <br />&#160;&#160;&#160; if x[a-1]==y[b-1]:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return f(x[0:a-1],y[0:b-1])+f(x[0:a-1],y[0:b])      <br />&#160;&#160;&#160; if x[a-1]!=y[b-1]:      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return f(x[0:a-1],y[0:b])</p>
</blockquote>
<p>意思就是：   <br />如果x长度比y小，那么返回0；如果长度y=1了，那么就看x串中有几个y，返回这个个数；    <br />不然的话    <br />如果最后一个元素相等，那么让x’为x去掉最后一个元素的序列，y’为y去掉最后一个元素序列：    <br />返回s-s-m(x’,y’)+s-s-m(x’,y)</p>
<p>如果最后一个元素不等，那么直接返回s-s-m(x’,y)</p>
<p>当然可以把上面的递归改写成递推的，这样效率会大大提高，并且不改的话，Code jam的大数据肯定是要会TLE的，改写起来很简单就不写鸟。</p>
<p>再来看看A-C-S的DP，大家基本可以自己想想就可以解决了，和上面的思路很类似</p>
<blockquote><p>N(i, j) = N(i − 1, j − 1) × 2, if Ai = Bj     <br />N(i, j) = N(i − 1, j) + N(i, j − 1) − N(i − 1, j − 1),      <br />if Ai!= Bj</p>
</blockquote>
<p>如果最后的元素相同，实际就是前面的A-C-S(i-1,j-1)×2.（有或没有最后一个item作为CS的一部分）   <br />不然的话等于下面那个，注意要扣除掉重复计算的A-C-S(i-1,j-1)</p>
<p>E-O-F</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2009/09/04/%e5%86%8d%e8%af%b4common-sub-sequence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>说点关联法则</title>
		<link>http://www.sinrain.cn/2009/08/12/association_rule/</link>
		<comments>http://www.sinrain.cn/2009/08/12/association_rule/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 07:04:42 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>
		<category><![CDATA[Data Mining]]></category>
		<category><![CDATA[关联法则]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2009/08/12/%e8%af%b4%e7%82%b9%e5%85%b3%e8%81%94%e6%b3%95%e5%88%99/</guid>
		<description><![CDATA[Association Rule Learning是一种用来发掘目前的数据库里的变量之间潜在的关系的例子，这里最有名的例子当属“啤酒与纸尿布”的故事了，实际就是 做了A，然后又会去做B 。
一个直接的应用就是... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Association_rule_learning" target="_blank">Association Rule Learning</a>是一种用来发掘目前的数据库里的变量之间潜在的关系的例子，这里最有名的例子当属“啤酒与纸尿布”的故事了，实际就是 做了A，然后又会去做B 。</p>
<p>一个直接的应用就是购物篮分析，或者更流行的，推荐系统( recommendation system )。这些都是能很快想到的应用。可能用到的场所比如沃尔玛（也是之前的啤酒尿布的故事来源）、<a href="http://www.douban.com/" target="_blank">豆瓣</a>儿（我猜，我猜，我猜猜猜）、<a href="http://www.amazon.com" target="_blank">Amazon</a>、<a href="http://www.taobao.com" target="_blank">Taobao</a>或者<a href="http://www.netflixprize.com" target="_blank">NetFlix</a>之类的。</p>
<p>提到关联规则几乎第一个跳出来的要讲的就是Apriori系列的算法，此算法是前IBM Lab的<a href="http://rakesh.agrawal-family.com/" target="_blank">Rakesh Agrawal</a>大牛在94的VLDB的一篇叫《<a href="http://rakesh.agrawal-family.com/papers/vldb94apriori.pdf" target="_blank">Fast Algorithms for Mining Association Rules</a>》的paper里提出来的，该算法在2006年的ICDM里被评选为Top 10 algorithms in data mining. 这个paper也有超过8k的引用，可谓是非常非常的seminal了。</p>
<p>这儿有个八卦，2006年的时候微软偷偷挖走了Rakesh，IBM一看急了，你这个把我们数据组核心专家挖走了以后日子还怎么过啊！而且IBM之前也是给了有超过70万美金的股票期权等来试图以这种方式留人，结果二月份时候Rakesh先是把期权给卖了，然后才加入了M$。IBM就直接一纸诉状给他告上了法庭。结果不了了之，搞技术的挖墙角的事儿见多了。</p>
<p>回到正题，Apriori要解决的是：找出出现的次数大于一个指定的threshold的项集(itemSet)。直接暴力解决的复杂性是不言而喻的，单一个n元素的集合的不同的子集的个数就有{2^n}个，就别说再搭配了。而Apriori的算法的核心思想就是化大为小，从item很小开始做起，慢慢变大。</p>
<blockquote><p>“老鼠的爸爸也是老鼠”原理：非频繁项集的超集也是非频繁的<br />
if an itemset is not frequent, any of its superset is never frequent</p></blockquote>
<p>很容易理解吧，因为超集的support（支撑度def: Freq/Obs）肯定小于等于子集嘛。理解了这么多基本就可以猜出算法啦：</p>
<p><a rel="lightbox" href="http://www.sinrain.cn/wp-content/uploads/138/13847/2009/08/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://www.sinrain.cn/wp-content/uploads/138/13847/2009/08/image-thumb.png" border="0" alt="image" width="568" height="482" /></a></p>
<p>第三行的函数Apriori-gen函数分两步走：</p>
<ol>
<li> 
<ol>
<li>连接步: R_{k+1}，连接所有的满足前{k-1}个元素相同的P_k和R_k生成一个k+1元的itemset<br />
e.g.:P_k={ a_1, a_2, …a_{k-1}, a_k},  R_k={ a_1, a_2, …a_{k-1}, a_k’ }<br />
      &#8212;&gt; R_{ k+1 }={ a_1, .. a_{k-1}, a_k, a_k’ }</li>
<li>剪枝步: 如果R_{k+1}中有任一k元子集R’不是频繁集，那么直接剪去该枝，如前所言，必须要是所有的自己都是频繁的，那么超集本身才可能是频繁的。</li>
</ol>
</li>
</ol>
<p>与此同时，Apriori的缺点也是一堆啦，频繁的扫描数据库，必然带来算法效率的低下，下篇给一个算法Demo和潜在的改进。</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2009/08/12/association_rule/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>春天到，复苏了</title>
		<link>http://www.sinrain.cn/2009/03/14/spring-comes/</link>
		<comments>http://www.sinrain.cn/2009/03/14/spring-comes/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 05:41:55 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[Nankin Story]]></category>
		<category><![CDATA[赛先生]]></category>
		<category><![CDATA[雨先生]]></category>
		<category><![CDATA[0-1背包]]></category>
		<category><![CDATA[DP]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2009/03/14/spring-comes/</guid>
		<description><![CDATA[最近一段时间非常慵懒，加上连日阴雨。除了窝在宿舍看看闲书，偶尔出去打打球之外基本没有什么活动，实在是浪费韶华。
今天出门一瞥，竟然花开燕语春欣然而至也！遂决定从连日冬眠里... ]]></description>
			<content:encoded><![CDATA[<p>最近一段时间非常慵懒，加上连日阴雨。除了窝在宿舍看看闲书，偶尔出去打打球之外基本没有什么活动，实在是浪费韶华。</p>
<p>今天出门一瞥，竟然花开燕语春欣然而至也！遂决定从连日冬眠里复苏，重出江湖。</p>
<p>先弄个昨日的题目：</p>
<blockquote><p>Subset SUM Problem<br />
{a[1],a[2]&#8230;a[k]} choose some a[i]s<br />
S.T.<br />
\sum a[i]=T   T is a positive integer.</p></blockquote>
<p>其实就是个简单的<strong>0-1背包问题</strong><br />
可以用DP来解：</p>
<blockquote><p>f(i,x)=Max{  f(i-1,x-a[i])+a[i]   f(i-1,x) }</p></blockquote>
<p>这个是背包的变种。。i.e.  重量w[i]和价值c[i]是一样的。<br />
采取非递归算法（只需要从f(1,x)开始往上推就好了），复杂度 O(KT)</p>
<p>那如果这个背包的解是f(k,T)=T那么问题就解决了。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>不了解0-1背包的同志，可以看看这个<a target="_blank" href="http://en.wikipedia.org/wiki/Knapsack_problem">Zero One Knapsack Problem</a></p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2009/03/14/spring-comes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>部分和序列、抽屉原理的应用</title>
		<link>http://www.sinrain.cn/2008/12/16/the-application-of-sum-of-subsequence/</link>
		<comments>http://www.sinrain.cn/2008/12/16/the-application-of-sum-of-subsequence/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 07:22:28 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[Idea&Books]]></category>
		<category><![CDATA[德先生]]></category>
		<category><![CDATA[赛先生]]></category>
		<category><![CDATA[maths]]></category>
		<category><![CDATA[部分和序列]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2008/12/16/the-application-of-sum-of-subsequence/</guid>
		<description><![CDATA[部分和序列，往往是我们关注的一种东西，例如下面的题目：
问题描述：给定一个含有 n 个元素的数列，元素有正有负，找出和最小的一组相邻的数。即给定 a[n]，求 i,j 使得 a[i] + a[i+1] + &#8230;... ]]></description>
			<content:encoded><![CDATA[<p>部分和序列，往往是我们关注的一种东西，例如下面的题目：</p>
<blockquote><p>问题描述：给定一个含有 n 个元素的数列，元素有正有负，找出和最小的一组相邻的数。即给定 a[n]，求 i,j 使得 a[i] + a[i+1] + &#8230;+ a[j] 的和最小。</p></blockquote>
<p>转化为和序列:S[1],S[2]&#8230;S[n]，求$latex Min: S_{[j]}-S_{[i]}$，具体的可以参考<a target="_blank" href="http://blog.solrex.cn/articles/smallest-subsequence-from-an-array-of-signed-numbers.html">Solrex的文章</a>，这个问题给我们的愉悦主要体现在后来的min max 的转换上。<br />
下面我想再举一个例子来说明如何做这类部分和序列问题</p>
<blockquote><p>Problem Description:<br />
一个拳击手在75天的赛季里，每天都要最少打一场比赛，但是整个赛季不能打超过125场比<br />
赛。那么，我们可以证明，可以从赛季中选出连续的K天，使得这K天的比赛总场数是30场。</p></blockquote>
<p>这个是个很有趣的问题，我们可以证明，不仅仅是30，甚至是所有小于等于30的场次都可以通过上面的方法选出来。</p>
<p>分析：<br />
抽象成数学问题：</p>
<blockquote><p>$latex X_{[k]}$ $latex \in$ $latex \mathbb{N}$,$latex X_{[k]}$ $latex \geq 1 $, $latex \sum_{k=1}^{75} X_{[k]}\leq 125$</p>
<p>Prove: Exist $latex i,j$ ($latex j \geq i$),S.T. $latex \sum_{k=i}^j X_{[k]} =30$</p></blockquote>
<p>首先，这是个部分和序列的问题，如果要用累加这种相对朴素的方法直接求解部分和序列的问题会使问题变得复杂化。那么转化为和序列是个好主意。<br />
令$latex S_{[i]}= \sum_{k=1}^i X_{[k]}$，那么就是要证明存在$latex i,j$,使得$latex S_{[j]}-S_{[i]}=30$；</p>
<p>下面就是这个题目精彩的地方了：构造抽屉，{1,31},{2,32},&#8230;{61,91}{62,92}..{90,120}{121}{122}{123}{124}{125}，每个{}内为一个抽屉，共有65个抽屉，要从中选出75个数，必然有一个抽屉内的两个数被选出来了，哈，这不是最朴素的那种抽屉原理么。<br />
所以问题得以解决。</p>
<p>反过来思考这个问题，还是有那么点意思的:-)<br />
1. 部分和序列转化为和序列的差。<br />
2. 巧妙的构造抽屉</p>
<p>下期预告：<br />
马尔可夫过程的首达及其应用:-)</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/12/16/the-application-of-sum-of-subsequence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>重复元素</title>
		<link>http://www.sinrain.cn/2008/04/23/duplicate-element/</link>
		<comments>http://www.sinrain.cn/2008/04/23/duplicate-element/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 12:04:46 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>

		<guid isPermaLink="false">http://www.sinrain.cn/2008/04/23/%e9%87%8d%e5%a4%8d%e5%85%83%e7%b4%a0/</guid>
		<description><![CDATA[
其实无论是你这里的+N还是taocp里面求逆序中的改用相反数，本质都相同，都是使用了数据中一些没有被使用的bit位。
而对于这道题目，在n &#60;2^31时，如果可以这样做，还有更加简单的方法。... ]]></description>
			<content:encoded><![CDATA[<p><!--DATA[一个数组，里面有N个数，值从1-N，在不修改原数组的情况下能否找到时间复杂度O(N），空间复杂度O(1)的方法判断这个数组中有没有两个相同的元素<--></p>
<p>其实无论是你这里的+N还是taocp里面求逆序中的改用相反数，本质都相同，都是使用了数据中一些没有被使用的bit位。<br />
而对于这道题目，在n &lt;2^31时，如果可以这样做，还有更加简单的方法。<br />
直接将原数组的最高比特位看作一个比特位数组就可以了</p>
<dl class="code">
<dt>C/C++ code </dt>
<dd>
<pre><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000">
</span><span style="color: #0000ff">bool</span><span style="color: #000000"> duplicate</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;
</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">N;i</span><span style="color: #000000">++</span><span style="color: #000000">){
   </span><span style="color: #0000ff">int</span><span style="color: #000000"> x</span><span style="color: #000000">=</span><span style="color: #000000">abs(a[i]);
   </span><span style="color: #0000ff">if</span><span style="color: #000000">(a[x</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">]</span><span style="color: #000000">&lt;</span><span style="color: #800080">0</span><span style="color: #000000">){
      duplicate</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;
      </span><span style="color: #0000ff">break</span><span style="color: #000000">;
   }</span><span style="color: #0000ff">else</span><span style="color: #000000">{
      a[x</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">]</span><span style="color: #000000">=-</span><span style="color: #000000">a[x</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">];
   }
}
</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">N;i</span><span style="color: #000000">++</span><span style="color: #000000">){
    a[i]</span><span style="color: #000000">=</span><span style="color: #000000">abs(a[i]);
}
</span><span style="color: #0000ff">return</span><span style="color: #000000"> duplicate;
</span></pre>
</dd>
</dl>
<p>&#8230;<br />
]]&gt;</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/04/23/duplicate-element/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculate the similarity of two strings</title>
		<link>http://www.sinrain.cn/2008/04/23/calculate-the-similarity-of-two-strings/</link>
		<comments>http://www.sinrain.cn/2008/04/23/calculate-the-similarity-of-two-strings/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 12:04:06 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>

		<guid isPermaLink="false">http://arain.yo2.cn/2008/04/23/calculate-the-similarity-of-two-strings/</guid>
		<description><![CDATA[... ]]></description>
			<content:encoded><![CDATA[<p><!--DATA[</p>
<p class="--><font face="Courier New"><strong><span lang="EN-US">Abstract</span></strong><span lang="EN-US"> Given two strings S of length m and string T of length n, the paper presents a new algorithm for calculating the similarity of the two strings. By the LCSubstr (longest common substring) algorithm we can find the maximal matching of the two given strings. Then eliminate the LCSubstr we will get two temp result strings. My algorithm will calculate the temp result strings iteratively until the two result strings’ common string is null. The similarity of the two strings will be measured by accumulating the non-linear mapping length of the maximal matched substring. The algorithm is always searching for the maximal continuous matching (MCM) in every step. In the end of the article I will introduce an application of this algorithm. </span></font></p>
<p class="a"><strong><span lang="EN-US"><font face="Courier New">Keywords:</font></span></strong><span lang="EN-US"><font face="Courier New"> pattern matching, LCSubstr, non-linear mapping, string similarity, maximal continuous matching (MCM)</font></span></p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/04/23/calculate-the-similarity-of-two-strings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyRss之三&#8212;从LCS到MCC去重复</title>
		<link>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%b8%89-%e4%bb%8elcs%e5%88%b0mcc%e5%8e%bb%e9%87%8d%e5%a4%8d/</link>
		<comments>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%b8%89-%e4%bb%8elcs%e5%88%b0mcc%e5%8e%bb%e9%87%8d%e5%a4%8d/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 12:04:13 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>

		<guid isPermaLink="false">http://arain.yo2.cn/2008/04/22/myrss%e4%b9%8b%e4%b8%89-%e4%bb%8elcs%e5%88%b0mcc%e5%8e%bb%e9%87%8d%e5%a4%8d/</guid>
		<description><![CDATA[Toy程序中很重要的一个功能是去重：即去掉那种转载流的文字，转载扩赛了信息但是也造成了相当麻烦的信息冗余，我不想看的信息逼着我看了一遍又一遍。
最牛逼的方法当然是能比较两个文... ]]></description>
			<content:encoded><![CDATA[<p>Toy程序中很重要的一个功能是去重：即<strong>去掉那种转载流</strong>的文字，转载扩赛了信息但是也造成了相当麻烦的信息冗余，我不想看的信息逼着我看了一遍又一遍。<br />
最牛逼的方法当然是能比较两个文章的全文，看全文的匹配度了，但是这个方法的时间代价太大。还有那种选取一部分Digest 出来比较的方法理论性远远大于使用性。最直接的方法就是看两个文章的<strong>标题的最长公共子串</strong>，亦即<strong>LCS</strong>( <em>longest common substring</em>).</p>
<p>LCS的原理非常的简单：</p>
<table border="1" width="200" cellPadding="1" cellSpacing="1">
<tr>
<td>A串为：   A1 A2 A3 &#8230;..  An</td>
</tr>
<tr>
<td>B串为： B1 B2 B3 &#8230;..  Bm</td>
</tr>
</table>
<p>只要反复的算下AB以各种位置叠在一起的最长连续字符个数就好了</p>
<p>数学上来说：就是写成这样一个矩阵：<br />
match[n][m]=</p>
<table border="1" width="200" cellPadding="1" cellSpacing="1">
<tr>
<td> </td>
<td>A1</td>
<td>A2</td>
<td>&#8230;..</td>
<td>&#8230;..</td>
<td>Am</td>
</tr>
<tr>
<td>B1</td>
<td>01</td>
<td>01</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>01</td>
</tr>
<tr>
<td>B2</td>
<td>01</td>
<td>01</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>01</td>
</tr>
<tr>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
</tr>
<tr>
<td>Bn</td>
<td>01</td>
<td>01</td>
<td>&#8230;</td>
<td>&#8230;</td>
<td>01</td>
</tr>
</table>
<p>中间的值match[i][j]都是0或者1 (match[i][j]=1 means Bi=Aj)，下面就在这个表中选出最长的连续对角线都是1的串，对应的子串就是AB的最大的匹配。</p>
<p>举个例子吧：</p>
<p>from:  <font face="Arial"><a href="http://www.5do8.com/blog/doc/569/index.aspx"><strong><font color="#3d81ee">http://www.5do8.com/blog/doc/569/index.aspx</font></strong></a><br />
</font></p>
<p>  A= I MISS MY CODE HI</p>
<p>  B= One Like MY Code</p>
<table border="0" align="left" cellPadding="3" cellSpacing="1" style="width: 360px; background-color: #a2a2a2; border: #f00 2px solid">
<tr>
<td align="center" style="background-color: #fff"> </td>
<td align="center" style="background-color: #fff">i</td>
<td align="center" style="background-color: #fff">m</td>
<td align="center" style="background-color: #fff">i</td>
<td align="center" style="background-color: #fff">s</td>
<td align="center" style="background-color: #fff">s</td>
<td align="center" style="background-color: #fff">m</td>
<td align="center" style="background-color: #fff">y</td>
<td align="center" style="background-color: #fff">c</td>
<td align="center" style="background-color: #fff">o</td>
<td align="center" style="background-color: #fff">d</td>
<td align="center" style="background-color: #fff">e</td>
<td align="center" style="background-color: #fff">h</td>
<td align="center" style="background-color: #fff">i</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">o</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">n</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">e</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">l</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">i</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
</tr>
<tr>
<td align="center" style="background-color: #fff">k</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">e</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">m</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">y</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">c</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">o</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">d</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
<tr>
<td align="center" style="background-color: #fff">e</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff"><font color="#ff0000">1</font></td>
<td align="center" style="background-color: #fff">0</td>
<td align="center" style="background-color: #fff">0</td>
</tr>
</table>
<p>那个mycode就是最长匹配的串<br />
在具体计算的时候考虑到汉字字符的多变性和英文很不一样，我们可以直接计算一个对角线上的所有的1而不用考虑联系性。<br />
就变成了MCC(Max common characters)了，而这个MCC就是我们去判定重复的一个重要依据。<br />
如果<strong>len</strong>(MCC) / <strong>min</strong>( <strong>len</strong>(string_A) ,<strong>len</strong>(string_B))<strong>&gt;</strong><font face="Arial">valve_Value就判定为转载。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</font><font face="Arial"> </font><font face="Arial">这里可以有一个<strong>非常重要的改进，认为连续匹配会有非线性加成</strong>，如match_degree=<strong>sigma</strong>( <strong>len</strong>(common_substring[i])<strong>^2</strong>)<br />
甚至我觉得可能某些搜索引擎就是这么干的。。【未验证】</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
这样就实现了新闻的唯一性的保证，为了确保系统的效率不会被这个比较拖累的太多，可以只比较最近3个月的标题。</p>
<p>晚上写一个实现，能配合现在已经有的模块实现标题的唯一性。</p>
<p></font></p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%b8%89-%e4%bb%8elcs%e5%88%b0mcc%e5%8e%bb%e9%87%8d%e5%a4%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyRss之二&#8212;需求和必要性</title>
		<link>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%ba%8c-%e9%9c%80%e6%b1%82%e5%92%8c%e5%bf%85%e8%a6%81%e6%80%a7/</link>
		<comments>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%ba%8c-%e9%9c%80%e6%b1%82%e5%92%8c%e5%bf%85%e8%a6%81%e6%80%a7/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 11:04:06 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>

		<guid isPermaLink="false">http://arain.yo2.cn/2008/04/22/myrss%e4%b9%8b%e4%ba%8c-%e9%9c%80%e6%b1%82%e5%92%8c%e5%bf%85%e8%a6%81%e6%80%a7/</guid>
		<description><![CDATA[听从Solrex的建议,在学习的时候直接看Python的tutorial和Lib，然后通过写一些简单的代码来逐步熟悉库：）
Mock Bank的测试工作已经进行的差不多了，最近要集中精力来做这个&#8220;可配置的Spider&#8221... ]]></description>
			<content:encoded><![CDATA[<p><![CDATA[
<p>听从<a href="http://blog.solrex.cn">Solrex</a>的建议,在学习的时候直接看Python的tutorial和Lib，然后通过写一些简单的代码来逐步熟悉库：）<br />
Mock Bank的测试工作已经进行的差不多了，最近要集中精力来做这个&ldquo;可配置的Spider&rdquo;</p>
<p>这个玩意的需求是具有普遍性的，我们有时候会去搜索引擎反复的搜索某个关键字，比如特别关注<strong>奥运</strong>的 可能每天都去搜索下和奥运有关的新闻。但是这么做的人倒没有想象的多，就是因为搜索引擎的重复结果太令人烦躁了。这个东西很讨厌，我举个例子就很清楚了：</p>
<p>单击显示大图<br />
<img height="455" alt="Google" width="600" border="0" src="http://node1.foto.ycstatic.com/200801/23/1/14092033.jpg" /></p>
<p>当然这个是<strong>冗余中的一种：由于转载引起的搜索结果冗余</strong><br />
另外一种我管他叫挖坟，什么叫挖坟：历史沉淀引起的结果冗余。<br />
Google下 <em>奥运火炬</em>就可以了。很多奥运火炬手选拔的网页由于SEO的作用很靠前，那么我最想看的<strong><em>敏感事件</em></strong>呢，基本是没有的。</p>
<p>现在Google news已经做得很好了，但是出于学习的态度和扩展性的态度。还是试探性的写写吧：）<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/04/22/myrss%e4%b9%8b%e4%ba%8c-%e9%9c%80%e6%b1%82%e5%92%8c%e5%bf%85%e8%a6%81%e6%80%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数学模型与简化(modeling simplify)</title>
		<link>http://www.sinrain.cn/2008/04/12/modeling-simplify/</link>
		<comments>http://www.sinrain.cn/2008/04/12/modeling-simplify/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 09:04:38 +0000</pubDate>
		<dc:creator>Rain</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[All]]></category>
		<category><![CDATA[赛先生]]></category>

		<guid isPermaLink="false">http://arain.yo2.cn/2008/04/12/%e6%95%b0%e5%ad%a6%e6%a8%a1%e5%9e%8b%e4%b8%8e%e7%ae%80%e5%8c%96modeling-simplify/</guid>
		<description><![CDATA[... ]]></description>
			<content:encoded><![CDATA[<p><!--[CDATA[一个Taobao同事的文，其中对在校生做实践项目还是很有启示的。<br />
原文链接：<br />
<font face="Arial"><a href="http://www.wespoke.com/2008/01/modeling-simplify.html">http://www.wespoke.com/2008/01/modeling-simplify.html</a></font></p>
<p><font color="#993300">在google之前有相当多的搜索引擎，都有过短暂的辉煌，在google之前，所有的搜索引擎里关于相关度计算的最重要的部分是被广泛了解的TF*IDF算法，然而当google使用page rank来计算网页的重要度的时候，良莠就显现出来了。page rank来自于一个假设：重要的网页会被链接的次数更多。<b>一个简单的假设</b>再加上<b>一个简单的迭代公式</b>，作为page rank的原型，google的搜索明显优于其它的搜索引擎了。虽然接下来的几年里google又调整了page rank算法和加上了hilltop算法，但都是锦上添花，而不是革命性的变革。</font></p>
<p><font color="#993300">我们能从google的模式上学到什么呢？google的创新模式有什么规律可循？</font></p>
<p><font color="#993300">1. 对网络社会的认识，设定一个<b>假设</b><br />
2. 针对假设进行一个数学<b>建模</b><br />
3. 对建立的模型进行<b>实际数据</b>的对比，以<b>简化</b>或可计算化<br />
4. 将实际收集的数据进行<b>实际运算</b></font></p>
<p><font color="#000080">例如就拿page rank为例，我们对网络社会的假设就是“重要的网页会被链接的次数更多”。这个假设是建立在我们认为好的网页、有用的网页往往会被别人收录，或者通过链接的方式连接起来。<br />
针对这个认识，建立一个数学模型。在这个数学模型里有几个核心：第一，每一张网页都有一个重要度、第二，被其他网页链接会提高重要度、第三，链出会降低重要度。整个模型就像一个一个水池，每个池子的水量就是重要度，池子之间的管道就是链接。</font></p>
<p><font color="#000080">数学模型建立起来了，这个数学模型更像是解一个多元方程组，其中的变量可能高达数千万甚至上亿，要对整个互联网的全部的网页进行计算，规模巨大。解这样一个方程组显然是不可能的，因此简化算法，采用迭代的计算方法。首先将网页的重要度设定一下初始值，然后进行多次迭代，在迭代的过程中找到稳定的结果，也就是最终这个多元方程组的最后的答案。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p><font color="#000000">PageRank现在其实<b>效果很差</b>，尤其是中文网页，百度就更差了（LOL，可能我的要求比较高～）。<br />
等下我整理几张PageRank效果<b>差在哪</b>的图片出来，以及下面一步搜索引擎应该向<b>那个方向发展</b>的一个设想。<br />
这个对我们<b>数据分析团队</b>有什么启示，我们可以做出怎么样的一个结果<img alt="" src="http://sta.yculblog.com/images/smiley/1/11.gif" />。</p>
<p></font></font></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
<a title='推荐到鲜果热文' href='http://www.xianguo.com/api/submitdigg/?feed=http%3A%2F%2Frss.ycool.com%2Fblog%2Frainme.xml&#038;link=WEB_URL'>推荐到鲜果</a>&#8230;<br />
]]&#8211;></p>
<p>&copy;2010 <a href="http://www.sinrain.cn">::SinRain&#039;s Blog::</a>. All Rights Reserved.</p>.]]></content:encoded>
			<wfw:commentRss>http://www.sinrain.cn/2008/04/12/modeling-simplify/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
