<?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>木瓜Blog &#187; 算法</title>
	<atom:link href="http://www.ardy.cn/tag/%e7%ae%97%e6%b3%95/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ardy.cn</link>
	<description>把简单的事做好</description>
	<lastBuildDate>Mon, 08 Aug 2011 06:46:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>搜索引擎算法研究</title>
		<link>http://www.ardy.cn/java/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e7%ae%97%e6%b3%95%e7%a0%94%e7%a9%b6.html</link>
		<comments>http://www.ardy.cn/java/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e7%ae%97%e6%b3%95%e7%a0%94%e7%a9%b6.html#comments</comments>
		<pubDate>Thu, 30 Aug 2007 04:17:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log233.html</guid>
		<description><![CDATA[搜索引擎算法研究 １．引言 万维网WWW（World Wide Web）是一个巨大的，分布全球的信息服务中心，正在以飞快的速度扩展。1998年WWW上拥有约3.5亿个文档[14]，每天增加约1百万的文档[6]，不到9个月的时间文档总数就会翻一番[14]。WEB上的文档和传统的文档比较，有很多新的特点，它们是分布的，异构的，无结构或者半结构的，这就对传统信息检索技术提出了新的挑战。 传统的WEB搜索引擎大多数是基于关键字匹配的，返回的结果是包含查询项的文档，也有基于目录分类的搜索引擎。这些搜索引擎的结果并不令人满意。有些站点有意提高关键字出现的频率来提高自身在搜索引擎中的重要性，破坏搜索引擎结果的客观性和准确性。另外，有些重要的网页并不包含查询项。搜索引擎的分类目录也不可能把所有的分类考虑全面，并且目录大多靠人工维护，主观性强，费用高，更新速度慢[2]。 最近几年，许多研究者发现，WWW上超链结构是个非常丰富和重要的资源，如果能够充分利用的话，可以极大的提高检索结果的质量。基于这种超链分析的思想，Sergey Brin和Lawrence Page在1998年提出了PageRank算法[1] ，同年J. Kleinberg提出了HITS算法[5]，其它一些学者也相继提出了另外的链接分析算法，如SALSA，PHITS，Bayesian等算法。这些算法有的已经在实际的系统中实现和使用，并且取得了良好的效果。 文章的第2部分按照时间顺序详细剖析了各种链接分析算法，对不同的算法进行了比较。第3部分对这些算法做了评价和总结，指出了存在的问题和改进方向。 ２．WEB超链分析算法 ２.１　Google和PageRank算法 搜索引擎Google最初是斯坦福大学的博士研究生Sergey Brin和Lawrence Page实现的一个原型系统[2]，现在已经发展成为WWW上最好的搜索引擎之一。Google的体系结构类似于传统的搜索引擎，它与传统的搜索引擎最大的不同处在于对网页进行了基于权威值的排序处理，使最重要的网页出现在结果的最前面。Google通过PageRank元算法计算出网页的PageRank值，从而决定网页在结果集中的出现位置，PageRank值越高的网页，在结果中出现的位置越前。 ２.１.１　PageRank算法 PageRank算法基于下面2个前提： 前提1：一个网页被多次引用，则它可能是很重要的；一个网页虽然没有被多次引用，但是被重要的网页引用，则它也可能是很重要的；一个网页的重要性被平均的传递到它所引用的网页。这种重要的网页称为权威（Authoritive）网页。 前提2：假定用户一开始随机的访问网页集合中的一个网页，以后跟随网页的向外链接向前浏览网页，不回退浏览，浏览下一个网页的概率就是被浏览网页的PageRank值。 简单PageRank算法描述如下：u是一个网页， 是u指向的网页集合， 是指向u的网页集合， 是u指向外的链接数，显然 =&#124; &#124; ，c是一个用于规范化的因子（Google通常取0.85），（这种表示法也适用于以后介绍的算法）则u的Rank值计算如下： 这就是算法的形式化描述，也可以用矩阵来描述此算法，设A为一个方阵，行和列对应网页集的网页。如果网页i有指向网页j的一个链接，则 ，否则 ＝0。设V是对应网页集的一个向量，有V=cAV，V为A的特征根为c的特征向量。实际上，只需要求出最大特征根的特征向量，就是网页集对应的最终PageRank值，这可以用迭代方法计算。 如果有2个相互指向的网页a，b,他们不指向其它任何网页，另外有某个网页c，指向a，b中的某一个，比如a，那么在迭代计算中，a，b的rank值不分布出去而不断的累计。如下图： 为了解决这个问题，Sergey Brin和Lawrence Page改进了算法，引入了衰退因子E(u)，E(U)是对应网页集的某一向量，对应rank的初始值，算法改进如下： 其中， ＝1，对应的矩阵形式为V’=c(AV’+E)。 另外还有一些特殊的链接，指向的网页没有向外的链接。PageRank计算时，把这种链接首先除去，等计算完以后再加入，这对原来计算出的网页的rank值影响是很小的。 Pagerank算法除了对搜索结果进行排序外，还可以应用到其它方面，如估算网络流量，向后链接的预测器，为用户导航等[2]。 ２.１.２　算法的一些问题 Google是结合文本的方法来实现PageRank算法的[2]，所以只返回包含查询项的网页，然后根据网页的rank值对搜索到的结果进行排序，把rank值最高的网页放置到最前面，但是如果最重要的网页不在结果网页集中，PageRank算法就无能为力了，比如在 Google中查询search engines，像Google，Yahoo，Altivisa等都是很重要的，但是Google返回的结果中这些网页并没有出现。 同样的查询例子也可以说明另外一个问题，Google，Yahoo是WWW上最受欢迎的网页，如果出现在查询项car的结果集中，一定会有很多网页指向它们，就会得到较高的rank值， 事实上他们与car不太相关。 在PageRank算法的基础上，其它的研究者提出了改进的PageRank算法。华盛顿大学计算机科学与工程系的Matthew Richardson和Pedro Dominggos提出了结合链接和内容信息的PageRank算法，去除了PageRank算法需要的前提2，增加考虑了用户从一个网页直接跳转到非直接相邻的但是内容相关的另外一个网页的情况[3]。斯坦大学计算机科学系Taher Haveliwala提出了主题敏感（Topic-sensitive）PageRank算法[4]。斯坦福大学计算机科学系Arvind Arasu等经过试验表明，PageRank算法计算效率还可以得到很大的提高[22]。 ２.２　HITS算法及其变种 PageRank算法中对于向外链接的权值贡献是平均的，也就是不考虑不同链接的重要性。而WEB的链接具有以下特征： 1.有些链接具有注释性，也有些链接是起导航或广告作用。有注释性的链接才用于权威判断。 2.基于商业或竞争因素考虑，很少有WEB网页指向其竞争领域的权威网页。 3.权威网页很少具有显式的描述，比如Google主页不会明确给出WEB搜索引擎之类的描述信息。 [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/java/%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e7%ae%97%e6%b3%95%e7%a0%94%e7%a9%b6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>椭圆曲线密码算法介绍</title>
		<link>http://www.ardy.cn/java/%e6%a4%ad%e5%9c%86%e6%9b%b2%e7%ba%bf%e5%af%86%e7%a0%81%e7%ae%97%e6%b3%95%e4%bb%8b%e7%bb%8d.html</link>
		<comments>http://www.ardy.cn/java/%e6%a4%ad%e5%9c%86%e6%9b%b2%e7%ba%bf%e5%af%86%e7%a0%81%e7%ae%97%e6%b3%95%e4%bb%8b%e7%bb%8d.html#comments</comments>
		<pubDate>Sat, 30 Jun 2007 06:57:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[加密]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log216.html</guid>
		<description><![CDATA[1，有限域上的椭圆曲线 设K表示一个有限域，E是域K上的椭圆曲线，则E是一个点的集合： E/K = { ( x, y ) &#124; y2+ a1xy + a3y = x3 + a2x2 + a4x + a6, a1, a3, a2, a4, a6 x, y K } { O } 其中O表示无穷远点。 在E上定义‘+’运算，P + Q = R，R是过P、Q的直线与曲线的另一交点关于x轴的对称点，当P = Q时R是P点的切线与曲线的另一交点关于 x轴的对称点。这样，( E, + )构成可换群( Abel群)，O是加法单位元(零元)。椭圆曲线离散对数问题ECDLP定义如下：给定定义在K上的 椭圆曲线E，一个n阶的点P E/K，和点Q E/ K，如果存在l，确定整数l, 0 l n - 1, Q = lP。前面已经提到，ECDLP是比 因子分解难得多的问题。 椭圆曲线上的加法: P + Q = R 椭圆曲线上一点的2倍: P + P = R. 2，椭圆曲线上的密码算法 基于该难题，Neal Koblitz[13] 和Victor Miller[14]在1985年分别利用有限域上椭圆曲线的点构成的群实现了离散对 数密码算法，其中被广泛接受的是椭圆曲线上的DSA，称ECDSA。随即展开了椭圆曲线密码学研究，除椭圆曲线外，还有人提出在其它类型的曲线如超椭圆曲 线上实现公钥密码算法。 此后，有人在椭圆曲线上实现了类似ElGamal的加密算法，以及可恢复明文的数字签名方案。除有限域上的椭圆曲线密码算法外，人们还探索了在椭圆曲线上实现RSA算法，如KMOV等，笔者也设计了一种算法(“一种基于Z/nZ上椭圆曲线的公钥密码算法”，王汉强、魏庆福，通信学报，1999，第7期)。 3，椭圆曲线密码算法的发展 由于其自身优点，椭圆曲线密码学一出现便受到关注。现在密码学界普遍认为它将替代RSA成为通用的公钥密码算法，SET ( Secure Electronic Transactions )协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法，目前已成为研究的 热点，是很有前途的研究方向。]]></description>
		<wfw:commentRss>http://www.ardy.cn/java/%e6%a4%ad%e5%9c%86%e6%9b%b2%e7%ba%bf%e5%af%86%e7%a0%81%e7%ae%97%e6%b3%95%e4%bb%8b%e7%bb%8d.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>产生素数的算法</title>
		<link>http://www.ardy.cn/java/%e4%ba%a7%e7%94%9f%e7%b4%a0%e6%95%b0%e7%9a%84%e7%ae%97%e6%b3%95.html</link>
		<comments>http://www.ardy.cn/java/%e4%ba%a7%e7%94%9f%e7%b4%a0%e6%95%b0%e7%9a%84%e7%ae%97%e6%b3%95.html#comments</comments>
		<pubDate>Sat, 30 Jun 2007 06:51:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log215.html</guid>
		<description><![CDATA[Solovag-Strasson Robert Solovag和Volker Strasson开发了一种概率的基本测试算法。这个算法使用了雅可比函数来测试p是否为素数：（1） 选择一个小于p的随机数a。 （2） 如果 gcd(a,p) &#60;&#62; 1，那么 p 通不过测试，它是合数。 （3） 计算j=a^(p-1)/2 mod p。 （4） 计算雅可比符号J（a,p）。 （5） 如果j&#60;&#62;J（a,p），那么p肯定不是素数。 （6） 如果j=J(a,p),那麽p不是素数的可能性值多是50% 数a被称为一个证据，如果a不能确定p，p肯定不是素数。如果p是合数。随机数a是证据的概率不小于50%。对a选择t个不同的随机值，重复t次这种测试。p通过所有t次测试后，它是合数的可能性不超过1/2^t。 Lehmann 另一种更简单的测试是由Lehmann独自研究的。下面是它的测试算法： （1） 选择一个小于p的随机数a。 （2） 计算a^(p-1)/2 mod p （3） 如果a^(p-1)/2&#60;&#62;1或-1（mod p），那么p肯定不是素数。 （4） 如果a^(p-1)/2=1或-1（mod p），那麽p不是素数的可能性值多是50% 同样，重复t次，那麽p可能是素数所冒的错误风险不超过1/2^t。 Rabin-Miller 这是个很容易且广泛使用的简单算法，它基于Gary Miller的部分象法，有Michael Rabin发展。事实上，这是在NIST的DSS建议中推荐的算法的一个简化版。 首先选择一个代测的随机数p，计算b，b是2整除p-1的次数。然后计算m，使得n=1+(2^b)m。 （1） 选择一个小于p的随机数a。 （2） 设j=0且z=a^m mod p （3） 如果z=1或z=p-1，那麽p通过测试，可能使素数 （4） 如果j&#62;0且z=1, 那麽p不是素数 （5） [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/java/%e4%ba%a7%e7%94%9f%e7%b4%a0%e6%95%b0%e7%9a%84%e7%ae%97%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个非常简单的私有加密算法（java版）</title>
		<link>http://www.ardy.cn/java/%e4%b8%80%e4%b8%aa%e9%9d%9e%e5%b8%b8%e7%ae%80%e5%8d%95%e7%9a%84%e7%a7%81%e6%9c%89%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%ef%bc%88java%e7%89%88%ef%bc%89.html</link>
		<comments>http://www.ardy.cn/java/%e4%b8%80%e4%b8%aa%e9%9d%9e%e5%b8%b8%e7%ae%80%e5%8d%95%e7%9a%84%e7%a7%81%e6%9c%89%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%ef%bc%88java%e7%89%88%ef%bc%89.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 06:54:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA开发]]></category>
		<category><![CDATA[加密]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log214.html</guid>
		<description><![CDATA[public class ZYGEncrypt { private static final byte[] enkeystore = { 0&#215;08, 0&#215;02, 0x0b, 0x0c, 0&#215;01, 0x0a, 0&#215;00, 0x0d, 0&#215;07, 0&#215;03, 0x0e, 0&#215;05, 0x0f, 0&#215;06, 0&#215;04, 0&#215;09 }; private static final byte[] dekeystore = { 0&#215;06, 0&#215;04, 0&#215;01, 0&#215;09, 0x0e, 0x0b, 0x0d, 0&#215;08, 0&#215;00, 0x0f, 0&#215;05, 0&#215;02, 0&#215;03, 0&#215;07, 0x0a, 0x0c }; public static byte[] [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/java/%e4%b8%80%e4%b8%aa%e9%9d%9e%e5%b8%b8%e7%ae%80%e5%8d%95%e7%9a%84%e7%a7%81%e6%9c%89%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%ef%bc%88java%e7%89%88%ef%bc%89.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google的搜索算法将做出重大改进</title>
		<link>http://www.ardy.cn/web/google%e7%9a%84%e6%90%9c%e7%b4%a2%e7%ae%97%e6%b3%95%e5%b0%86%e5%81%9a%e5%87%ba%e9%87%8d%e5%a4%a7%e6%94%b9%e8%bf%9b.html</link>
		<comments>http://www.ardy.cn/web/google%e7%9a%84%e6%90%9c%e7%b4%a2%e7%ae%97%e6%b3%95%e5%b0%86%e5%81%9a%e5%87%ba%e9%87%8d%e5%a4%a7%e6%94%b9%e8%bf%9b.html#comments</comments>
		<pubDate>Mon, 04 Jun 2007 01:29:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB技术]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log207.html</guid>
		<description><![CDATA[昨日，纽约时报的一篇关于Google的报道在新闻界引起了相当大的震撼，各家网站纷纷转载或者进行扩展评论。 Google正在不断改进它的搜索算法，这将是Yahoo和微软噩梦。过去，Google的搜索结果排名是注重网站的受欢迎程度，这对于大网站非常有利。 未来甚至现在已经开始，Google的搜索结果排名将更注重时效性，即如果你发布的新闻最早的话，尽管你的网站流量很小，但也会排在搜索结果的前面，这就 类似于Google News和Google blogsearch的搜索结果。]]></description>
		<wfw:commentRss>http://www.ardy.cn/web/google%e7%9a%84%e6%90%9c%e7%b4%a2%e7%ae%97%e6%b3%95%e5%b0%86%e5%81%9a%e5%87%ba%e9%87%8d%e5%a4%a7%e6%94%b9%e8%bf%9b.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>估值函数与优化搜索</title>
		<link>http://www.ardy.cn/live/%e4%bc%b0%e5%80%bc%e5%87%bd%e6%95%b0%e4%b8%8e%e4%bc%98%e5%8c%96%e6%90%9c%e7%b4%a2.html</link>
		<comments>http://www.ardy.cn/live/%e4%bc%b0%e5%80%bc%e5%87%bd%e6%95%b0%e4%b8%8e%e4%bc%98%e5%8c%96%e6%90%9c%e7%b4%a2.html#comments</comments>
		<pubDate>Tue, 20 Mar 2007 23:28:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活匣子]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log103.html</guid>
		<description><![CDATA[&#160; 前面说了最小最大原理，为什么要最小最大原理？为什么要搜索？我们可以更简单的看对弈这件事儿，下棋的时候，从一开始到结束，每当我要走棋时，我会考虑怎么走？有N种可行走法，但只能选一种，换个方式想这问题，人工智能不过是作一种&#8216;选择&#8217;，而这里的&#8216;选择&#8217;要能促使你最终赢棋！ &#160; 可以选择的前提是要能分出谁高谁低，哪步着法臭，哪步着法妙，于是就需要要一个估值函数Eval(p),p是局面，也就是由这个评价函数分出哪个局面（或者着法，着法可以看成下一个局面）更好，如果Eval(p1)&#60;Eval(p2)，我们就有理由说，或者大胆地说，p2比p1更好！但是很多时候，你并不能断言，你做的决定是最好的，这在于棋类游戏的复杂程度，像一些高深的棋类游戏，棋的变化非常多非常复杂，那你能完全相信你的估值函数吗？不能，有可能，现在看来一步很臭的棋，在不久的将来将会使局面变得很好，这就是妙手，这是经常出现的。出现这样情况的原因是，我们找到的估值函数都是从一个局面来看的，它是静止的，它看不到未来的变化，所以它是非常粗糙的。而搜索的目的正是为了&#8216;更好的&#8217;评价棋局，可以把搜索看成是动态的估值！ 如何估值？ &#160; 这和具体的棋类游戏有关，同时也和你最终打包的程序的棋力有关，估得好，棋力高，这是很显然的。不管什么棋类的估值，它都有一个共同点： 对特定的局面估值要非常准确！特定的局面是那些&#8216;胜负&#8217;非常明显的局面，你要为&#8216;胜&#8217;打一个最高的分HScore，为&#8216;负&#8217;打一个负最高的分-HScore，而&#8216;平局&#8217;可以适中给分，可以给一个稍大于0的分，在不能获胜的局面里，会趋向于平局。 然后就是要有前瞻性，从一个局面分析，不搜索也不是不可以看得&#8216;深刻&#8217;，也可以说是&#8216;全局观&#8217;，估值函数要体现游戏的全局观，它是从整体上把握，从一个点看到了一条线！这样才是好的估值。 &#160; 好了，下一个话题是&#8216;优化搜索&#8217;，哦，这可难了，我现在还看不懂一些高级搜索算法。其实用负极大搜索算法编出来的程序是不能搜的，基本上不能搜。因为搜索量实在太大了！在一些规则简单的棋类游戏中，像黑白棋，平均分支因子都有10左右，直接去搜索，是搜不了几层的，这样的指数效应太明显了！最简单和最基本的优化方法是alpha-beta剪枝！ &#160; 这是一种纯数学上的方法，是在不对搜索的结果影响的前提下剪枝，它可以使分支因子变为原来的开根号那么大（平均情况）！alpha是一个当前最好的值，如果有更好的(&#62;alpha)将更新它，而beta是一个当前最差的值，如果有更差的(&#62;beta)将马上产生截断（也就是不再搜索，而是直接返回原来的beta）代码如下： int AlphaBeta(int depth, int alpha, int beta) { 　if (depth == 0) &#160; { 　　return Evaluate(); 　} 　GenerateLegalMoves(); 　while (MovesLeft()) &#160; { 　　MakeNextMove(); 　　val = -AlphaBeta(depth &#8211; 1, -beta, -alpha); //注意到代入子树搜索的alpha,beta值 　　UnmakeMove(); 　　if (val &#62;= beta) &#160;&#160;&#160; { 　　　return beta; 　　} 　　if [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/live/%e4%bc%b0%e5%80%bc%e5%87%bd%e6%95%b0%e4%b8%8e%e4%bc%98%e5%8c%96%e6%90%9c%e7%b4%a2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于人工神经网络</title>
		<link>http://www.ardy.cn/live/%e5%85%b3%e4%ba%8e%e4%ba%ba%e5%b7%a5%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c.html</link>
		<comments>http://www.ardy.cn/live/%e5%85%b3%e4%ba%8e%e4%ba%ba%e5%b7%a5%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c.html#comments</comments>
		<pubDate>Tue, 20 Mar 2007 23:24:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活匣子]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log102.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 今天有看这方面资料，一点点感想。 &#160;&#160;&#160; 首先这样的模型，从功能上讲是很强的，人脑有神经元10^11左右个，我们就可以随心所欲的思考。人的视觉，触觉，听觉都是输入，肢体的控制神经，语言中枢神经和口腔发声控制神经都是输出，从本质上讲这样的抽象是根本的，所谓思维就是这个神经网络中的神经元的相互作用的过程。其次，什么是记忆？记忆就是&#8216;反馈神经&#8217;，不知道这个名词准确与否。在《数字逻辑》中时序逻辑电路中也是这样的，输出反过来当成输入，构成一个&#8216;反馈线&#8217;，反馈线上的电信号就是&#8216;记忆&#8217;，简单的触发器就是这样两个反馈线的与非门构成的，触发器就是&#8216;存储器&#8217;的基本元件，一个触发器可以记录一bit，内存上的Memory就是这样做的，同样在神经网络中也是这样，我们把回忆拿出来，重新思考，我们把昨天未下完的一盘棋拿出来继续思考，这就是反馈输入嘛。至于有没有硬盘式的存储器，就不清楚了，实际上，如果把我们的神经系统看成&#8216;电系统&#8217;，我们什么时候断过电哟，你拿你的脑袋使劲往墙上撞，有可能会断一会电-_- &#160;&#160;&#160; 其次一点，就是怎么&#8216;学习&#8217;？总的来讲，分两种，有教师的学习和无教师的学习，有教师的学习就像是一种训练，我想要这组人工神经网络（ANN）的功能是这样的，我就拿一堆的正确的[输入，输出]去训练它，拿输入数据得到真实的输出，再和理论输出比较，拿这个误差去修改&#8216;弧&#8217;上的权值，最终使得它满足所有的&#8216;学习资料&#8217;，就拿最简单的与逻辑门来说吧，输入神经元x1,x2（0,1），输出y=f(x1*w1+x2*w2-e)，测试数据是： 0,0,0 0,1,0 1,0,0 1,1,1 &#160;&#160;&#160; 初使w1,w2,e随机得到，假设是7,4,5吧，第三组数据训练有误差，结果是7-5=2输出是1，于是修正 w1=w1+a(0-1)x1 w2=w2+a(0-1)x2 &#160;&#160;&#160; 其中a是(0,1)间的值，表示学习的增益因子，用于控制调整的速度，就取0.5吧，于是修正后的w1=6.5,w2=4，还是不满足，再修正几次，直到w1=4.5,w2=4,e=5就满足了，于是它就会做&#8216;与&#8217;运算了。 &#160;&#160;&#160; 这里教师的作用就是提供&#8216;正确&#8217;的训练数据，这样做学得很快，跟人一样，我们在学校里学习就是这样。另外一种无教师的学习，就会慢很多，会在失败中学习，想起以前英语老师教我们学英语就是要&#34;Make mistakes &#38; try again!&#34;，从错误中学习。而正确与错误与否是外界告诉的，这就是要去尝试，去栽根头，然后再爬起来。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;算法驿站&#160; (rickone 的 BLOG)]]></description>
		<wfw:commentRss>http://www.ardy.cn/live/%e5%85%b3%e4%ba%8e%e4%ba%ba%e5%b7%a5%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>素数检验法</title>
		<link>http://www.ardy.cn/live/%e7%b4%a0%e6%95%b0%e6%a3%80%e9%aa%8c%e6%b3%95.html</link>
		<comments>http://www.ardy.cn/live/%e7%b4%a0%e6%95%b0%e6%a3%80%e9%aa%8c%e6%b3%95.html#comments</comments>
		<pubDate>Fri, 16 Mar 2007 05:09:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活匣子]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log85.html</guid>
		<description><![CDATA[&#160;&#160; 数的素性检验方法问题在近几年得到了飞速的发展,过去,要检验一个数 n 是否是素数,最简单的方法是用试除法,用小于n的平方根以下的所有素数去除n,若都除不尽,则n就是素数,否则为合数.这对于比较小的数来说还适用,若用计算机编成程序,对于10位数,几乎瞬间即可完成,对于一个20位数,则需要2个小时,对于一个50位数就需要一百亿年,令人吃惊的是,要检验一个一百位数,需要的时间就猛增到10^36年.到了1980年,这种困难的情况得到了改观,阿德曼(Adleman),鲁梅利(Rumely),科恩(Cohen),和伦斯特拉(Lenstra)研究出一种非常复杂的技巧,现在以他们的名字的首字母命名的ARCL检验法,检验一个20位数只消10秒钟,对于一个50位数用15秒钟,100位数用40秒钟,如果要他检验一个1000位数,只要用一个星期也就够了.但是大部分的素性检验法都不能分解出因数来,只能回答一个数是否是素数. &#160;&#160;&#160;&#160;&#160;&#160; 我们知道,费马小定理是现代素数判定方法的基础,如果该定理的逆命题成立那该多好,只要计算一下ap-a是否能被p整除,能则p是素数,否则p是和数.遗憾的是这只对1&#60;p&#60;341内的数成立,因为2341-2能被合数341整除,即费马小定理的逆命题不成立.前面已经说过像341这样的数叫做伪素数. &#160;&#160;&#160; ARCL检验法改进了费马检验,它不再受伪素数的愚弄.这种检验法需要相当多的高深的数学知识.现在我还不能提供这个方法的详细情况,以后可能会的.在下面我将要讲的是n-1检验法和n+1检验法. &#160;&#160;&#160; 1.n-1 检验法 如果对于奇数 n,我们已经知道了n-1的素因子分解式,那么如下的n-1检验法将是有效的.在1891年,E.卢卡斯将费马小定理改进成对于检验素数很实用的形式,后来又由克拉奇科和莱默进一步改进: 定理一:设n&#62;1是一个奇数,如果对于n-1的每一个素因子q存在一个整数a使得: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; an-1 = 1 (mod n), and &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a(n-1)/q &#8800; 1 (mod n); 则n是素数. 这个定理的不足之处是需要知道n-1的全部因子,那么能不能不需要如此呢?下面一个定理是泊克林顿(Pocklingdon)在1914年发现的: 泊克林顿定理:设n-1=qkR,这里q是素数,并且R不能被q整除.如果存在一个整数a使得an-1=1并且 gcd(a(n-1)/q-1,n) = 1,则n的每一个素因子q都具有qkr+1的形式. 利用这个定理,我们可以将定理一改进如下: 定理二:假定 n-1 = FR, 这里 F&#62;R, gcd(F,R)=1 并且已知 F的素因子分解.如果对于F的每一个素因子q 都存在一个整数a &#62;1 使得 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; an-1 = 1 (mod n) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; gcd(a(n-1)/q-1,n) = [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/live/%e7%b4%a0%e6%95%b0%e6%a3%80%e9%aa%8c%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最短带权路径问题的解法::Dijkstra &amp; Floyd</title>
		<link>http://www.ardy.cn/live/%e6%9c%80%e7%9f%ad%e5%b8%a6%e6%9d%83%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98%e7%9a%84%e8%a7%a3%e6%b3%95%3a%3adijkstra%26amp%3bfloyd.html</link>
		<comments>http://www.ardy.cn/live/%e6%9c%80%e7%9f%ad%e5%b8%a6%e6%9d%83%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98%e7%9a%84%e8%a7%a3%e6%b3%95%3a%3adijkstra%26amp%3bfloyd.html#comments</comments>
		<pubDate>Fri, 16 Mar 2007 05:03:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活匣子]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log84.html</guid>
		<description><![CDATA[　　在一个网络中，如果两个结点之间有直接的因果关系，则这两个结点直接连通，在连接 两个结点的弧上标上它的代价或权，值得注意的是这样的代价不一定是对称的，即A到B 的代价不一定等于B到A的代价，实际问题中以行船为例，有顺水和逆水的区别。在图Ｇ 中，给出两个结点求这样一条最短的路径，使经过这条路径上的代价之和最小，这就是最短 路径问题。 　　如果所有弧上的权都相等，则问题退化为求两个结点间的一条路径使经过的中间结点最 少。比如在一个城市的交通网络中，乘客关心的可能只是旅途中中转的次数，只希望转更少 次数的车。对于这样的问题，运用ＢＦＳ对图进行层次遍历，可以在O(n)的时间复杂度上 完成搜索，考虑到ＢＦＳ的层次遍历性质，不难理解，在此不讨论。 　　考虑到带权的有向图（无向图可看成特殊的有向图），如何求最短路径呢？ １、 Dijkstra算法 　　Dijkstra是最早提出这个算法的大牛：）。这是图论中非常有名的一个算法。 　　图采用邻接矩阵的形式描述，M[i][j]表示结点i到结点j间的代价，如果没有直接因果 关系，则为无穷大，计算机中可以用一个很大的数据代替。后面的Floyd算法同样这样描述。 　　差点忘了，dijkstra算法只能求出从结点i到其它各结点的最短路径。算法引入这样两 个集合S和Ｔ，Ｓ是那些已经确定了到Ｉ结点的最短路径的结点，在计算过程中为什么可 以确定某些结点已经到达了最短的要求了呢？后面再讲。Ｔ为全集Ｕ和Ｓ的差集，即那些还 未确定最短路径的结点。而且Ｓ的初值是{i}，Ｔ的初值是Ｕ-{i}。另外再引入一个标记数组 Ｄ[N]，其中在某一步D[k]表示当前从i到k的较短路径，D[k]的初值为M[i][k]，整个算法 过程如下： 　　１、 在Ｔ中选择一个Ｄ[k]最小的结点k，将k并入Ｓ，并从Ｔ中去掉，如果Ｔ为｛｝则 　　转到３； 　　２、 用k结点和Ｔ中其余结点进行一遍比较，如果D[i]&#62;D[k]+M[k][i]，则用D[k]+M[k][i] 　　取代原来的Ｄ[i]，重复１； 　　３、 算法结束，此时Ｄ[k]中保存的就是从Ｉ到k结点的最短路径。 　　算法就以这样非常简单的形式完成了求解，时间复杂度是O(n^2)，确定了从Ｉ到其余 各结点的最短路径，如果要求记录路径，也很容易，可以引入一个路径标记数组P[k][m]， 如果P[k][m]为０则说明从i到k的当前最短路径中不含有m结点作为中间结点，如果为１ 则m成为其路径的所经结点。 　　就前面提出为什么可以这样一部分一部分的确定解集Ｓ，举个例子，第一遍比较，得到 了能够直接抵达的最小代价的结点s0，为什么s0不可能含有其它路径了呢？假设从i到s0 并不是最短路径，则至少含有不是s0的结点k，使i-&#62;k-&#62;&#8230;-&#62;s0比原路径更短，而此路径比 i-&#62;k大，i-&#62;k又比i-&#62;s0大，所以不可能比i-&#62;s0小，矛盾，得证。再证在算法第k+1步时， 前一次求得了由至多k步可到达的最短路径终结点sk，有i?sk最短，在与后面剩下Ｔ中结 点的比较中，如果D[k]+M[k+1][i]更短，则替换，替换的原则是在不能与某条至多m（m&#60;k） 步可到达的最短路径替换，为什么？在前面的过程已经替代了，所以只考虑当前的D[k+1]。 　　这只是我的理解，如果需要更加完善的证明还需用数学语言，略之。 与Dijkstra算法平分秋色的还有Floyd算法。 ２、 Floyd算法 　　如果要求所有两结点间的最短路径，则可以使用dijkstra算法n次完成，时间复杂度是 O(n^3)，Floyd还提出过另一个算法，同样是O(n^3)的复杂度，但形式上更简单些。 　　要求的解是一个矩阵Ｓ[N][N]，其中S[i][j]表示结点i到j的最短路径，算法很像动态 规划算法，甚至更简单些，不同的是这里规划的是一个矩阵，而不是简单的数组。 　　Floyd算法过程描述如下： 　　１、 首先Ｓ以边集Ｍ初始化，得到所有的直接连通代价； 　　２、 依次考虑第k个结点，对于Ｓ中的每一个Ｓ[i][j]，判断是否满足： 　　S[i][j]&#62;S[i][k]+S[k][j]，如果满足则用S[i][k]+S[k][j]代替Ｓ[i][j]，此为第k步； 　　３、 [...]]]></description>
		<wfw:commentRss>http://www.ardy.cn/live/%e6%9c%80%e7%9f%ad%e5%b8%a6%e6%9d%83%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98%e7%9a%84%e8%a7%a3%e6%b3%95%3a%3adijkstra%26amp%3bfloyd.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>满足任意概率密度函数分布的随机变量生成算法</title>
		<link>http://www.ardy.cn/live/%e6%bb%a1%e8%b6%b3%e4%bb%bb%e6%84%8f%e6%a6%82%e7%8e%87%e5%af%86%e5%ba%a6%e5%87%bd%e6%95%b0%e5%88%86%e5%b8%83%e7%9a%84%e9%9a%8f%e6%9c%ba%e5%8f%98%e9%87%8f%e7%94%9f%e6%88%90%e7%ae%97%e6%b3%95.html</link>
		<comments>http://www.ardy.cn/live/%e6%bb%a1%e8%b6%b3%e4%bb%bb%e6%84%8f%e6%a6%82%e7%8e%87%e5%af%86%e5%ba%a6%e5%87%bd%e6%95%b0%e5%88%86%e5%b8%83%e7%9a%84%e9%9a%8f%e6%9c%ba%e5%8f%98%e9%87%8f%e7%94%9f%e6%88%90%e7%ae%97%e6%b3%95.html#comments</comments>
		<pubDate>Fri, 16 Mar 2007 05:01:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活匣子]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.ardy.cn/live/log83.html</guid>
		<description><![CDATA[概率密度的定义 　　概率简单地说就是在空间某处附近一确定的范围内发生某事件的可能性，而概率密度则是概率与空间范围之比的极限。在讨论更复杂一些的空间之前，可以从一维的线性空间出发定义它们。 　　在一维空间中，用数轴表示所有的点，定义Ф(x)为：随机变量i，当i&#60;x时的概率，因此得Ф(-&#8734;)=0，Ф(+&#8734;)=1（因为全概率为1），这个条件是直接由定义得出，称为归一化条件。 　　由此当x取数轴上的点时，随机变量i取到[x,x+△x](△x&#62;0)中时的概率应该为Ф(x+△x)-Ф(x)，则定义i取到这个区间的平均概率密度p^=(Ф(x+△x)-Ф(x))/ △x，此时如果极限: 　　lim(Ф(x+△x)-Ф(x))/ △x=p(x)　存在 　　△ x-&#62;0 　　则称极限值为这一点的概率密度，由数学知识这正是导数的定义，于是有p(x)=dФ/dx，于是有△Ф=&#8747;p(x)dx，积分区域为△，虽然这是从一维情况推出，这是概率的一般形式定义。于是归一化条件就相应为&#8747;p(v)dv=1，积分区域为全空间。 　　由此概率密度函数就唯一决定了随机变量的分布，反过来我们也说随机变量服从某种概率密度函数的分布。 如何由p函数模拟随机变量的生成 　　首先我们要有一个这样的随机函数，Ｃ的原型如下： double random();/*返回一个大于等于0，小于1之间的等概率随机双精度小数*/ 　　&#8211;&#62;规格化的随机变量&#60;&#8211; 　　这个算法的实现将在以后给出算法，事实上笔者最开始学习编程时就是学的这种随机函数，它是BASIC里的标准函数，这里只是为了讨论的需要，因为由它可以非常方便的得到任意范围内的随机数，包括浮点数或整数。 　　然后我们再拿来这样一个任意的概率密度函数p(x)，且满足归一化条件&#8747;p(x)dx=1，积分区域为[0,1)。最后再给出这个函数在[0,1)上的上限（最大值）h。然后用下面的方法生成服从该分布的随机变量。 　　首先得到一个等概率的随机的二维的点(x,y)，它落在矩形区域[0,1;0,h]内，同时我们还要求这样一个条件y&#60;p(x)，如果得到的点不满足这个条件则重新取点，也就是说把那些不满足此条件的点&#8216;去掉&#8217;。最后我说这里的x满足p(x)的分布。证明如下： 证明 　　首先由算法过程将得到在y=0,x=0,x=1,y=p(x)四条曲线围成的二维区域内的等概率随机点。 　　任取x属于[0,1)，则在x的一个邻域内[x,x+△x]（取△x，使这个邻域也在[0,1)内），上述随机变量i取到这个邻域的概率记为△Ф(x)，由几何性质△Ф(x)=S&#39;/S，其中S&#39;为这一区域围成的曲顶梯形的面积，而S为整个y=p(x)曲线围成的面积，由归一化条件马上知S=1于是△Ф(x)就是那块曲顶梯形的面积，由中值定理，有△Ф(x)=p(x&#39;) △x，其中x&#39;为上面那个邻域内的某一点，现令△x-&#62;0，则由夹逼定理x&#39;-&#62;x，于是得p(x)=dФ(x)/dx，这正是p(x)的定义，于是产生的随机变量即满足p(x)的分布。证毕。 C++语言算法描述 double random_rickone(double (*p)(double),double h) { &#160;&#160; double x=random(),y=random()*h; &#160;&#160; if(y&#60;p(x))return x &#160;&#160; return random_rickone(p,h); } 算法驿站&#160;&#160;(rickone 的 BLOG)]]></description>
		<wfw:commentRss>http://www.ardy.cn/live/%e6%bb%a1%e8%b6%b3%e4%bb%bb%e6%84%8f%e6%a6%82%e7%8e%87%e5%af%86%e5%ba%a6%e5%87%bd%e6%95%b0%e5%88%86%e5%b8%83%e7%9a%84%e9%9a%8f%e6%9c%ba%e5%8f%98%e9%87%8f%e7%94%9f%e6%88%90%e7%ae%97%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

