﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-空城计-Code记</title><link>http://www.cnblogs.com/mz121star/</link><description>水善利万物而不争,处众人之所恶,故几于道.居善地,心善渊,与善仁,言善信,正善治,事善能,动善时.夫唯不争,故无尤</description><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 09:17:15 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 09:17:15 GMT</pubDate><ttl>60</ttl><item><title>豪门盛宴-各种浏览器大汇聚【有缺少的大家来补全】</title><link>http://www.cnblogs.com/mz121star/archive/2008/07/20/browserviews.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Sun, 20 Jul 2008 08:43:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/07/20/browserviews.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1247095.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/07/20/browserviews.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1247095.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1247095.html</trackback:ping><description><![CDATA[摘要: <p><img src="http://www.cnblogs.com/images/cnblogs_com/mz121star/images.jpg" class="desc_img"/>超强精华，浏览器的豪门盛宴..各种您见过以及没见过的浏览器大收集，如果您有这里没有的，请告诉我！我给补上！谢谢！
</p>&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/07/20/browserviews.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1247095.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>趣味测试：判断是否是云计算的十五种方法</title><link>http://www.cnblogs.com/mz121star/archive/2008/07/16/cloud.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Wed, 16 Jul 2008 09:04:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/07/16/cloud.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1244534.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/07/16/cloud.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1244534.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1244534.html</trackback:ping><description><![CDATA[摘要: <p><img src="http://server.51cto.com/files/uploadimg/20080704/152716364.gif" align="right"/>1）如果标称是“网格”或“OGSA（开放网格服务架构）”...那么，它不是云。<br><br>2）如果需要你向厂商提供一份几十页的需求说明书...那么，它不是云。<br><br>3）如果你不能用自己的信用卡来购买...那么，它不是云。<br><br>4）如果他们想卖给你硬件设备...那么，它不是云。<br><br>5）如果没有提供API...那么，它不是云。<br><br>6）如果需要你重新构架你的系统...那么，它不是云。<br></p>&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/07/16/cloud.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1244534.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>JSP用户管理系统【上学应付作业用】</title><link>http://www.cnblogs.com/mz121star/archive/2008/06/28/1231753.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Sat, 28 Jun 2008 11:50:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/06/28/1231753.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1231753.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/06/28/1231753.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1231753.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1231753.html</trackback:ping><description><![CDATA[期末实训做的...<br />
<a title="下载" href="/Files/mz121star/jsptrain.rar">下载</a>
<img src ="http://www.cnblogs.com/mz121star/aggbug/1231753.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item><item><title>java网络编程</title><link>http://www.cnblogs.com/mz121star/archive/2008/06/13/1218823.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Fri, 13 Jun 2008 00:47:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/06/13/1218823.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1218823.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/06/13/1218823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1218823.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1218823.html</trackback:ping><description><![CDATA[摘要: 课前索引课前思考　　1. 什么是TCP/ IP协议？　　2. TCP/IP有哪两种传输协议,各有什么特点？　　3. 什么是URL？　　4. URL和IP地址有什么样的关系？　　5. 什么叫套接字（Socket）？　　6. 套接字（Socket）和TCP/IP协议的关系？　　7. URL和套接字（Socket）的关系？8．1 网络编程基本概念，TCP/IP协议简介8.1.1 网络基础知识网络编程的目&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/06/13/1218823.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1218823.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41799/" target="_blank">[新闻]番茄花园作者被警方逮捕</a>]]></description></item><item><title>Stop SQL Injection Attacks Before They Stop You</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/27/1208615.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Tue, 27 May 2008 10:15:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/27/1208615.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1208615.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/27/1208615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1208615.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1208615.html</trackback:ping><description><![CDATA[摘要: Armed with advanced server-side technologies like ASP.NET and powerful database servers such as Microsoft® SQL Server™, developers are able to create dynamic, data-driven Web sites with incredible ease. But the power of ASP.NET and SQL can easily be used against you by hackers mounting an all-too-common class of attack—the SQL injection attack.<br>The basic idea behind a SQL injection attack is this: you create a Web page that allows the user to enter text into a textbox that will be used to ex&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/05/27/1208615.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1208615.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41792/" target="_blank">[新闻]WordPress和Movable Type影响社交网站的未来</a>]]></description></item><item><title>回溯法</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/25/1206743.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Sat, 24 May 2008 16:42:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/25/1206743.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1206743.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/25/1206743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1206743.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1206743.html</trackback:ping><description><![CDATA[c语言经典算法<br />
五、回溯法　<br />
回溯法也称为试探法，该方法首先暂时放弃关于问题规模大小的限制，并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时，就选择下一个候选解；倘若当前候选解除了还不满足问题规模要求外，满足所有其他要求时，继续扩大当前候选解的规模，并继续试探。如果当前候选解满足包括问题规模在内的所有要求时，该候选解就是问题的一个解。在回溯法中，放弃当前候选解，寻找下一个候选解的过程称为回溯。扩大当前候选解的规模，以继续试探的过程称为向前试探。　<br />
1、回溯法的一般描述　<br />
可用回溯法求解的问题P，通常要能表达为：对于已知的由n元组（x1，x2，&#8230;，xn）组成的一个状态空间E={（x1，x2，&#8230;，xn）∣xi&#8712;Si ，i=1，2，&#8230;，n}，给定关于n元组中的一个分量的一个约束集D，要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域，且 |Si| 有限，i=1，2，&#8230;，n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。　<br />
解问题P的最朴素的方法就是枚举法，即对E中的所有n元组逐一地检测其是否满足D的全部约束，若满足，则为问题P的一个解。但显然，其计算量是相当大的。　<br />
我们发现，对于许多问题，所给定的约束集D具有完备性，即i元组（x1，x2，&#8230;，xi）满足D中仅涉及到x1，x2，&#8230;，xi的所有约束意味着j（j&lt;i）元组（x1，x2，&#8230;，xj）一定也满足D中仅涉及到x1，x2，&#8230;，xj的所有约束，i=1，2，&#8230;，n。换句话说，只要存在0&#8804;j&#8804;n-1，使得（x1，x2，&#8230;，xj）违反D中仅涉及到x1，x2，&#8230;，xj的约束之一，则以（x1，x2，&#8230;，xj）为前缀的任何n元组（x1，x2，&#8230;，xj，xj+1，&#8230;，xn）一定也违反D中仅涉及到x1，x2，&#8230;，xi的一个约束，n&#8805;i&gt;j。因此，对于约束集D具有完备性的问题P，一旦检测断定某个j元组（x1，x2，&#8230;，xj）违反D中仅涉及x1，x2，&#8230;，xj的一个约束，就可以肯定，以（x1，x2，&#8230;，xj）为前缀的任何n元组（x1，x2，&#8230;，xj，xj+1，&#8230;，xn）都不会是问题P的解，因而就不必去搜索它们、检测它们。回溯法正是针对这类问题，利用这类问题的上述性质而提出来的比枚举法效率更高的算法。　<br />
回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T，把在E中求问题P的所有解转化为在T中搜索问题P的所有解。树T类似于检索树，它可以这样构造：　<br />
设Si中的元素可排成xi(1) ，xi(2) ，&#8230;，xi(mi-1) ，|Si| =mi，i=1，2，&#8230;，n。从根开始，让T的第I层的每一个结点都有mi个儿子。这mi个儿子到它们的双亲的边，按从左到右的次序，分别带权xi+1(1) ，xi+1(2) ，&#8230;，xi+1(mi) ，i=0，1，2，&#8230;，n-1。照这种构造方式，E中的一个n元组（x1，x2，&#8230;，xn）对应于T中的一个叶子结点，T的根到这个叶子结点的路径上依次的n条边的权分别为x1，x2，&#8230;，xn，反之亦然。另外，对于任意的0&#8804;i&#8804;n-1，E中n元组（x1，x2，&#8230;，xn）的一个前缀I元组（x1，x2，&#8230;，xi）对应于T中的一个非叶子结点，T的根到这个非叶子结点的路径上依次的I条边的权分别为x1，x2，&#8230;，xi，反之亦然。特别，E中的任意一个n元组的空前缀（），对应于T的根。　<br />
因而，在E中寻找问题P的一个解等价于在T中搜索一个叶子结点，要求从T的根到该叶子结点的路径上依次的n条边相应带的n个权x1，x2，&#8230;，xn满足约束集D的全部约束。在T中搜索所要求的叶子结点，很自然的一种方式是从根出发，按深度优先的策略逐步深入，即依次搜索满足约束条件的前缀1元组（x1i）、前缀2元组（x1，x2）、&#8230;，前缀I元组（x1，x2，&#8230;，xi），&#8230;，直到i=n为止。　<br />
在回溯法中，上述引入的树被称为问题P的状态空间树；树T上任意一个结点被称为问题P的状态结点；树T上的任意一个叶子结点被称为问题P的一个解状态结点；树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点，它对应于问题P的一个解。　<br />
【问题】 组合问题　<br />
问题描述：找出从自然数1、2、&#8230;&#8230;、n中任取r个数的所有组合。　<br />
例如n=5，r=3的所有组合为：　<br />
（1）1、2、3 （2）1、2、4 （3）1、2、5　<br />
（4）1、3、4 （5）1、3、5 （6）1、4、5　<br />
（7）2、3、4 （8）2、3、5 （9）2、4、5　<br />
（10）3、4、5　<br />
则该问题的状态空间为：　<br />
E={（x1，x2，x3）∣xi&#8712;S ，i=1，2，3 } 其中：S={1，2，3，4，5}　<br />
约束集为： x1&lt;x2&lt;x3　<br />
显然该约束集具有完备性。　<br />
问题的状态空间树T：　<br />
RE：c语言经典算法<br />
2、回溯法的方法　<br />
对于具有完备约束集D的一般问题P及其相应的状态空间树T，利用T的层次结构和D的完备性，在T中搜索问题P的所有解的回溯法可以形象地描述为：　<br />
从T的根出发，按深度优先的策略，系统地搜索以其为根的子树中可能包含着回答结点的所有状态结点，而跳过对肯定不含回答结点的所有子树的搜索，以提高搜索效率。具体地说，当搜索按深度优先策略到达一个满足D中所有有关约束的状态结点时，即&#8220;激活&#8221;该状态结点，以便继续往深层搜索；否则跳过对以该状态结点为根的子树的搜索，而一边逐层地向该状态结点的祖先结点回溯，一边&#8220;杀死&#8221;其儿子结点已被搜索遍的祖先结点，直到遇到其儿子结点未被搜索遍的祖先结点，即转向其未被搜索的一个儿子结点继续搜索。　<br />
在搜索过程中，只要所激活的状态结点又满足终结条件，那么它就是回答结点，应该把它输出或保存。由于在回溯法求解问题时，一般要求出问题的所有解，因此在得到回答结点后，同时也要进行回溯，以便得到问题的其他解，直至回溯到T的根且根的所有儿子结点均已被搜索过为止。　<br />
例如在组合问题中，从T的根出发深度优先遍历该树。当遍历到结点（1，2）时，虽然它满足约束条件，但还不是回答结点，则应继续深度遍历；当遍历到叶子结点（1，2，5）时，由于它已是一个回答结点，则保存（或输出）该结点，并回溯到其双亲结点，继续深度遍历；当遍历到结点（1，5）时，由于它已是叶子结点，但不满足约束条件，故也需回溯。　<br />
3、回溯法的一般流程和技术　<br />
在用回溯法求解有关问题的过程中，一般是一边建树，一边遍历该树。在回溯法中我们一般采用非递归方法。下面，我们给出回溯法的非递归算法的一般流程：　 <br />
<br />
在用回溯法求解问题，也即在遍历状态空间树的过程中，如果采用非递归方法，则我们一般要用到栈的数据结构。这时，不仅可以用栈来表示正在遍历的树的结点，而且可以很方便地表示建立孩子结点和回溯过程。　<br />
例如在组合问题中，我们用一个一维数组Stack[ ]表示栈。开始栈空，则表示了树的根结点。如果元素1进栈，则表示建立并遍历（1）结点；这时如果元素2进栈，则表示建立并遍历（1，2）结点；元素3再进栈，则表示建立并遍历（1，2，3）结点。这时可以判断它满足所有约束条件，是问题的一个解，输出（或保存）。这时只要栈顶元素（3）出栈，即表示从结点（1，2，3）回溯到结点（1，2）。　<br />
【问题】 组合问题　<br />
问题描述：找出从自然数1，2，&#8230;，n中任取r个数的所有组合。　<br />
采用回溯法找问题的解，将找到的组合以从小到大顺序存于a[0]，a[1]，&#8230;，a[r-1]中，组合的元素满足以下性质：　<br />
（1） a[i+1]&gt;a[i]，后一个数字比前一个大；　<br />
（2） a[i]-i&lt;=n-r+1。　<br />
按回溯法的思想，找解过程可以叙述如下：　<br />
首先放弃组合数个数为r的条件，候选组合从只有一个数字1开始。因该候选解满足除问题规模之外的全部条件，扩大其规模，并使其满足上述条件（1），候选组合改为1，2。继续这一过程，得到候选组合1，2，3。该候选解满足包括问题规模在内的全部条件，因而是一个解。在该解的基础上，选下一个候选解，因a[2]上的3调整为4，以及以后调整为5都满足问题的全部要求，得到解1，2，4和1，2，5。由于对5不能再作调整，就要从a[2]回溯到a[1]，这时，a[1]=2，可以调整为3，并向前试探，得到解1，3，4。重复上述向前试探和向后回溯，直至要从a[0]再回溯时，说明已经找完问题的全部解。按上述思想写成程序如下：　<br />
<br />
【程序】　<br />
# define MAXN 100　<br />
int a[MAXN];　<br />
void comb(int m,int r)　<br />
{ int i,j;　<br />
i=0;　<br />
a[i]=1;　<br />
do {　<br />
if (a[i]-i&lt;=m-r+1　<br />
{ if (i==r-1)　<br />
{ for (j=0;j&lt;r;j++)　<br />
printf(&#8220;%4d&#8221;,a[j]);　<br />
printf(&#8220;\n&#8221;);　<br />
}　<br />
a[i]++;　<br />
continue;　<br />
}　<br />
else　<br />
{ if (i==0)　<br />
return;　<br />
a[--i]++;　<br />
}　<br />
} while (1)　<br />
}　<br />
<br />
main()　<br />
{ comb(5,3);　<br />
}　<br />
【问题】 填字游戏　<br />
问题描述：在3&#215;3个方格的方阵中要填入数字1到N（N&#8805;10）内的某9个数字，每个方格填一个整数，似的所有相邻两个方格内的两个整数之和为质数。试求出所有满足这个要求的各种数字填法。　<br />
可用试探发找到问题的解，即从第一个方格开始，为当前方格寻找一个合理的整数填入，并在当前位置正确填入后，为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填证书，就要回退到前一方格，调整前一方格的填入数。当第九个方格也填入合理的整数后，就找到了一个解，将该解输出，并调整第九个的填入的整数，寻找下一个解。　<br />
为找到一个满足要求的9个数的填法，从还未填一个数开始，按某种顺序（如从小到大的顺序）每次在当前位置填入一个整数，然后检查当前填入的整数是否能满足要求。在满足要求的情况下，继续用同样的方法为下一方格填入整数。如果最近填入的整数不能满足要求，就改变填入的整数。如对当前方格试尽所有可能的整数，都不能满足要求，就得回退到前一方格，并调整前一方格填入的整数。如此重复执行扩展、检查或调整、检查，直到找到一个满足问题要求的解，将解输出。　<br />
回溯法找一个解的算法：　<br />
{ int m=0,ok=1;　<br />
int n=8;　<br />
do{　<br />
if (ok) 扩展;　<br />
else 调整;　<br />
ok=检查前m个整数填放的合理性;　<br />
} while ((!ok||m!=n)&amp;&amp;(m!=0))　<br />
if (m!=0) 输出解;　<br />
else 输出无解报告；　<br />
}　<br />
如果程序要找全部解，则在将找到的解输出后，应继续调整最后位置上填放的整数，试图去找下一个解。相应的算法如下：　<br />
回溯法找全部解的算法：　<br />
{ int m=0,ok=1;　<br />
int n=8;　<br />
do{　<br />
if (ok)　<br />
{ if (m==n)　<br />
{ 输出解；　<br />
调整；　<br />
}　<br />
else 扩展;　<br />
}　<br />
else 调整;　<br />
ok=检查前m个整数填放的合理性;　<br />
} while (m!=0);　<br />
}　<br />
为了确保程序能够终止，调整时必须保证曾被放弃过的填数序列不会再次实验，即要求按某种有许模型生成填数序列。给解的候选者设定一个被检验的顺序，按这个顺序逐一形成候选者并检验。从小到大或从大到小，都是可以采用的方法。如扩展时，先在新位置填入整数1，调整时，找当前候选解中下一个还未被使用过的整数。将上述扩展、调整、检验都编写成程序，细节见以下找全部解的程序。　<br />
【程序】　<br />
# include &lt;stdio.h&gt;　<br />
# define N 12　<br />
void write(int a[ ])　<br />
{ int i,j;　<br />
for (i=0;i&lt;3;i++)　<br />
{ for (j=0;j&lt;3;j++)　<br />
printf(&#8220;%3d&#8221;,a[3*i+j]);　<br />
printf(&#8220;\n&#8221;);　<br />
}　<br />
scanf(&#8220;%*c&#8221;);　<br />
}　<br />
<br />
int b[N+1];　<br />
int a[10];　<br />
int isprime(int m)　<br />
{ int i;　<br />
int primes[ ]={2,3,5,7,11,17,19,23,29,-1};　<br />
if (m==1||m%2=0) return 0;　<br />
for (i=0;primes[i]&gt;0;i++)　<br />
if (m==primes[i]) return 1;　<br />
for (i=3;i*i&lt;=m;)　<br />
{ if (m%i==0) return 0;　<br />
i+=2;　<br />
}　<br />
return 1;　<br />
}　<br />
<br />
int checkmatrix[ ][3]={ {-1},{0,-1},{1,-1},{0,-1},{1,3,-1},　<br />
{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};　<br />
int selectnum(int start)　<br />
{ int j;　<br />
for (j=start;j&lt;=N;j++)　<br />
if (b[j]) return j　<br />
return 0;　<br />
}　<br />
<br />
int check(int pos)　<br />
{ int i,j;　<br />
if (pos&lt;0) return 0;　<br />
for (i=0;(j=checkmatrix[pos][i])&gt;=0;i++)　<br />
if (!isprime(a[pos]+a[j])　<br />
return 0;　<br />
return 1;　<br />
}　<br />
<br />
int extend(int pos)　<br />
{ a[++pos]=selectnum(1);　<br />
b[a][pos]]=0;　<br />
　return pos;　<br />
}　<br />
<br />
int change(int pos)　<br />
{ int j;　<br />
while (pos&gt;=0&amp;&amp;(j=selectnum(a[pos]+1))==0)　<br />
b[a[pos--]]=1;　<br />
if (pos&lt;0) return &#8211;1　<br />
b[a[pos]]=1;　<br />
a[pos]=j;　<br />
b[j]=0;　<br />
return pos;　<br />
}　<br />
<br />
void find()　<br />
{ int ok=0,pos=0;　<br />
a[pos]=1;　<br />
b[a[pos]]=0;　<br />
do {　<br />
if (ok)　<br />
if (pos==8)　<br />
{ write(a);　<br />
pos=change(pos);　<br />
}　<br />
else pos=extend(pos);　<br />
else pos=change(pos);　<br />
ok=check(pos);　<br />
} while (pos&gt;=0)　<br />
}　<br />
<br />
void main()　<br />
{ int i;　<br />
for (i=1;i&lt;=N;i++)　<br />
b[i]=1;　<br />
find();　<br />
}　<br />
【问题】 n皇后问题　<br />
问题描述：求出在一个n&#215;n的棋盘上，放置n个不能互相捕捉的国际象棋&#8220;皇后&#8221;的所有布局。　<br />
这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向相互捕捉。如图所示，一个皇后放在棋盘的第4行第3列位置上，则棋盘上凡打&#8220;&#215;&#8221;的位置上的皇后就能与这个皇后相互捕捉。　<br />
　<br />
1 2 3 4 5 6 7 8　<br />
&#215; &#215;　<br />
&#215; &#215; &#215;　<br />
&#215; &#215; &#215;　<br />
&#215; &#215; Q &#215; &#215; &#215; &#215; &#215;　<br />
&#215; &#215; &#215;　<br />
&#215; &#215; &#215;　<br />
&#215; &#215;　<br />
&#215; &#215;　<br />
从图中可以得到以下启示：一个合适的解应是在每列、每行上只有一个皇后，且一条斜线上也只有一个皇后。　<br />
求解过程从空配置开始。在第1列至第m列为合理配置的基础上，再配置第m+1列，直至第n列配置也是合理时，就找到了一个解。接着改变第n列配置，希望获得下一个解。另外，在任一列上，可能有n种配置。开始时配置在第1行，以后改变时，顺次选择第2行、第3行、&#8230;、直到第n行。当第n行配置也找不到一个合理的配置时，就要回溯，去改变前一列的配置。得到求解皇后问题的算法如下：　<br />
{ 输入棋盘大小值n；　<br />
m=0;　<br />
good=1;　<br />
do {　<br />
if (good)　<br />
if (m==n)　<br />
{ 输出解；　<br />
改变之，形成下一个候选解;　<br />
}　<br />
else 扩展当前候选接至下一列；　<br />
else 改变之，形成下一个候选解；　<br />
good=检查当前候选解的合理性；　<br />
} while (m!=0);　<br />
}　<br />
在编写程序之前，先确定边式棋盘的数据结构。比较直观的方法是采用一个二维数组，但仔细观察就会发现，这种表示方法给调整候选解及检查其合理性带来困难。更好的方法乃是尽可能直接表示那些常用的信息。对于本题来说，&#8220;常用信息&#8221;并不是皇后的具体位置，而是&#8220;一个皇后是否已经在某行和某条斜线合理地安置好了&#8221;。因在某一列上恰好放一个皇后，引入一个一维数组（col[ ]），值col[i]表示在棋盘第i列、col[i]行有一个皇后。例如：col[3]=4，就表示在棋盘的第3列、第4行上有一个皇后。另外，为了使程序在找完了全部解后回溯到最初位置，设定col[0]的初值为0当回溯到第0列时，说明程序已求得全部解，结束程序运行。　<br />
为使程序在检查皇后配置的合理性方面简易方便，引入以下三个工作数组：　<br />
（1） 数组a[ ]，a[k]表示第k行上还没有皇后；　<br />
（2） 数组b[ ]，b[k]表示第k列右高左低斜线上没有皇后；　<br />
（3） 数组 c[ ]，c[k]表示第k列左高右低斜线上没有皇后；　<br />
棋盘中同一右高左低斜线上的方格，他们的行号与列号之和相同；同一左高右低斜线上的方格，他们的行号与列号之差均相同。　<br />
初始时，所有行和斜线上均没有皇后，从第1列的第1行配置第一个皇后开始，在第m列col[m]行放置了一个合理的皇后后，准备考察第m+1列时，在数组a[ ]、b[ ]和c[ ]中为第m列，col[m]行的位置设定有皇后标志；当从第m列回溯到第m-1列，并准备调整第m-1列的皇后配置时，清除在数组a[ ]、b[ ]和c[ ]中设置的关于第m-1列，col[m-1]行有皇后的标志。一个皇后在m列，col[m]行方格内配置是合理的，由数组a[ ]、b[ ]和c[ ]对应位置的值都为1来确定。细节见以下程序：　<br />
【程序】　<br />
# include &lt;stdio.h&gt;　<br />
# include &lt;stdlib.h&gt;　<br />
# define MAXN 20　<br />
int n,m,good;　<br />
int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];　<br />
<br />
void main()　<br />
{ int j;　<br />
char awn;　<br />
printf(&#8220;Enter n: &#8220;); scanf(&#8220;%d&#8221;,&amp;n);　<br />
for (j=0;j&lt;=n;j++) a[j]=1;　<br />
for (j=0;j&lt;=2*n;j++) cb[j]=c[j]=1;　<br />
m=1; col[1]=1; good=1; col[0]=0;　<br />
do {　<br />
if (good)　<br />
if (m==n)　<br />
{ printf(&#8220;列\t行&#8221;);　<br />
for (j=1;j&lt;=n;j++)　<br />
printf(&#8220;%3d\t%d\n&#8221;,j,col[j]);　<br />
printf(&#8220;Enter a character (Q/q for exit)!\n&#8221;);　<br />
scanf(&#8220;%c&#8221;,&amp;awn);　<br />
if (awn==&#8217;Q&#8217;||awn==&#8217;q&#8217;) exit(0);　<br />
while (col[m]==n)　<br />
{ m--;　<br />
a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;　<br />
}　<br />
col[m]++;　<br />
}　<br />
else　<br />
{ a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=0;　<br />
col[++m]=1;　<br />
}　<br />
else　<br />
{ while (col[m]==n)　<br />
{ m--;　<br />
a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;　<br />
}　<br />
col[m]++;　<br />
}　<br />
good=a[col[m]]&amp;&amp;b[m+col[m]]&amp;&amp;c[n+m-col[m]];　<br />
} while (m!=0);　<br />
}　<br />
<br />
试探法找解算法也常常被编写成递归函数，下面两程序中的函数queen_all()和函数queen_one()能分别用来解皇后问题的全部解和一个解。　<br />
【程序】　<br />
# include &lt;stdio.h&gt;　<br />
# include &lt;stdlib.h&gt;　<br />
# define MAXN 20　<br />
int n;　<br />
int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];　<br />
void main()　<br />
{ int j;　<br />
printf(&#8220;Enter n: &#8220;); scanf(&#8220;%d&#8221;,&amp;n);　<br />
for (j=0;j&lt;=n;j++) a[j]=1;　<br />
for (j=0;j&lt;=2*n;j++) cb[j]=c[j]=1;　<br />
queen_all(1,n);　<br />
}　 <br />
<br />
void queen_all(int k,int n)　<br />
{ int i,j;　<br />
char awn;　<br />
for (i=1;i&lt;=n;i++)　<br />
if (a[i]&amp;&amp;b[k+i]&amp;&amp;c[n+k-i])　<br />
{ col[k]=i;　<br />
a[i]=b[k+i]=c[n+k-i]=0;　<br />
if (k==n)　<br />
{ printf(&#8220;列\t行&#8221;);　<br />
for (j=1;j&lt;=n;j++)　<br />
printf(&#8220;%3d\t%d\n&#8221;,j,col[j]);　<br />
printf(&#8220;Enter a character (Q/q for exit)!\n&#8221;);　<br />
scanf(&#8220;%c&#8221;,&amp;awn);　<br />
if (awn==&#8217;Q&#8217;||awn==&#8217;q&#8217;) exit(0);　<br />
}　<br />
queen_all(k+1,n);　<br />
a[i]=b[k+i]=c[n+k-i];　<br />
}　<br />
}　<br />
采用递归方法找一个解与找全部解稍有不同，在找一个解的算法中，递归算法要对当前候选解最终是否能成为解要有回答。当它成为最终解时，递归函数就不再递归试探，立即返回；若不能成为解，就得继续试探。设函数queen_one()返回1表示找到解，返回0表示当前候选解不能成为解。细节见以下函数。　<br />
【程序】　<br />
# define MAXN 20　<br />
int n;　<br />
int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];　<br />
int queen_one(int k,int n)　<br />
{ int i,found;　<br />
i=found=0;　<br />
While (!found&amp;&amp;i&lt;n)　<br />
{ i++;　<br />
if (a[i]&amp;&amp;b[k+i]&amp;&amp;c[n+k-i])　<br />
{ col[k]=i;　<br />
a[i]=b[k+i]=c[n+k-i]=0;　<br />
if (k==n) return 1;　<br />
else　<br />
found=queen_one(k+1,n);　<br />
a[i]=b[k+i]=c[n+k-i]=1;　<br />
}　<br />
}　<br />
return found;　<br />
} <br />
六、贪婪法　<br />
贪婪法是一种不追求最优解，只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解，因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择，而不考虑各种可能的整体情况，所以贪婪法不要回溯。　<br />
例如平时购物找钱时，为使找回的零钱的硬币数最少，不考虑找零钱的所有各种发表方案，而是从最大面值的币种开始，按递减的顺序考虑各币种，先尽量用大面值的币种，当不足大面值币种的金额时才去考虑下一种较小面值的币种。这就是在使用贪婪法。这种方法在这里总是最优，是因为银行对其发行的硬币种类和硬币面值的巧妙安排。如只有面值分别为1、5和11单位的硬币，而希望找回总额为15单位的硬币。按贪婪算法，应找1个11单位面值的硬币和4个1单位面值的硬币，共找回5个硬币。但最优的解应是3个5单位面值的硬币。　<br />
【问题】 装箱问题　<br />
问题描述：装箱问题可简述如下：设有编号为0、1、&#8230;、n-1的n种物品，体积分别为v0、v1、&#8230;、vn-1。将这n种物品装到容量都为V的若干箱子里。约定这n种物品的体积均不超过V，即对于0&#8804;i＜n，有0＜vi&#8804;V。不同的装箱方案所需要的箱子数目可能不同。装箱问题要求使装尽这n种物品的箱子数要少。　<br />
<br />
　若考察将n种物品的集合分划成n个或小于n个物品的所有子集，最优解就可以找到。但所有可能划分的总数太大。对适当大的n，找出所有可能的划分要花费的时间是无法承受的。为此，对装箱问题采用非常简单的近似算法，即贪婪法。该算法依次将物品放到它第一个能放进去的箱子中，该算法虽不能保证找到最优解，但还是能找到非常好的解。不失一般性，设n件物品的体积是按从大到小排好序的，即有v0&#8805;v1&#8805;&#8230;&#8805;vn-1。如不满足上述要求，只要先对这n件物品按它们的体积从大到小排序，然后按排序结果对物品重新编号即可。装箱算法简单描述如下：　<br />
{ 输入箱子的容积；　<br />
输入物品种数n；　<br />
按体积从大到小顺序，输入各物品的体积；　<br />
预置已用箱子链为空；　<br />
预置已用箱子计数器box_count为0；　<br />
for (i=0;i&lt;n;i++)　<br />
{ 从已用的第一只箱子开始顺序寻找能放入物品i 的箱子j；　<br />
if （已用箱子都不能再放物品i）　<br />
{ 另用一个箱子，并将物品i放入该箱子；　<br />
box_count++；　<br />
}　<br />
else　<br />
将物品i放入箱子j；　<br />
}　<br />
}　<br />
上述算法能求出需要的箱子数box_count，并能求出各箱子所装物品。下面的例子说明该算法不一定能找到最优解，设有6种物品，它们的体积分别为：60、45、35、20、20和20单位体积，箱子的容积为100个单位体积。按上述算法计算，需三只箱子，各箱子所装物品分别为：第一只箱子装物品1、3；第二只箱子装物品2、4、5；第三只箱子装物品6。而最优解为两只箱子，分别装物品1、4、5和2、3、6。　<br />
若每只箱子所装物品用链表来表示，链表首结点指针存于一个结构中，结构记录尚剩余的空间量和该箱子所装物品链表的首指针。另将全部箱子的信息也构成链表。以下是按以上算法编写的程序。　<br />
【程序】　<br />
# include &lt;stdio.h&gt;　<br />
# include &lt;stdlib.h&gt;　<br />
typedef struct ele　<br />
{ int vno;　<br />
struct ele *link;　<br />
} ELE;　<br />
typedef struct hnode　<br />
{ int remainder;　<br />
ELE *head;　<br />
Struct hnode *next;　<br />
} HNODE;　<br />
<br />
void main()　<br />
{ int n, i, box_count, box_volume, *a;　<br />
HNODE *box_h, *box_t, *j;　<br />
ELE *p, *q;　<br />
Printf(&#8220;输入箱子容积\n&#8221;);　<br />
Scanf(&#8220;%d&#8221;,&amp;box_volume);　<br />
Printf(&#8220;输入物品种数\n&#8221;);　<br />
Scanf(&#8220;%d&#8221;,&amp;n);　<br />
A=(int *)malloc(sizeof(int)*n);　<br />
Printf(&#8220;请按体积从大到小顺序输入各物品的体积：&#8221;);　<br />
For (i=0;i&lt;n;i++) scanf(&#8220;%d&#8221;,a+i);　<br />
Box_h=box_t=NULL;　<br />
Box_count=0;　<br />
For (i=0;i&lt;n;i++)　<br />
{ p=(ELE *)malloc(sizeof(ELE));　<br />
p-&gt;vno=i;　<br />
for (j=box_h;j!=NULL;j=j-&gt;next)　<br />
if (j-&gt;remainder&gt;=a[i]) break;　<br />
if (j==NULL)　<br />
{ j=(HNODE *)malloc(sizeof(HNODE));　<br />
j-&gt;remainder=box_volume-a[i];　<br />
j-&gt;head=NULL;　<br />
if (box_h==NULL) box_h=box_t=j;　<br />
else box_t=boix_t-&gt;next=j;　<br />
j-&gt;next=NULL;　<br />
box_count++;　<br />
}　<br />
else j-&gt;remainder-=a[i];　<br />
for (q=j-&gt;next;q!=NULL&amp;&amp;q-&gt;link!=NULL;q=q-&gt;link);　<br />
if (q==NULL)　<br />
{ p-&gt;link=j-&gt;head;　<br />
j-&gt;head=p;　<br />
}　<br />
else　<br />
{ p-&gt;link=NULL;　<br />
q-&gt;link=p;　<br />
}　<br />
}　<br />
printf(&#8220;共使用了%d只箱子&#8221;，box_count);　<br />
printf(&#8220;各箱子装物品情况如下：&#8221;);　<br />
for (j=box_h,i=1;j!=NULL;j=j-&gt;next,i++)　<br />
{ printf(&#8220;第%2d只箱子，还剩余容积%4d，所装物品有；\n&#8221;,I,j-&gt;remainder);　<br />
for (p=j-&gt;head;p!=NULL;p=p-&gt;link)　<br />
printf(&#8220;%4d&#8221;,p-&gt;vno+1);　<br />
printf(&#8220;\n&#8221;);　<br />
}　<br />
}　<br />
【问题】 马的遍历　<br />
问题描述：在8&#215;8方格的棋盘上，从任意指定的方格出发，为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。　<br />
马在某个方格，可以在一步内到达的不同位置最多有8个，如图所示。如用二维数组board[ ][ ]表示棋盘，其元素记录马经过该位置时的步骤号。另对马的8种可能走法（称为着法）设定一个顺序，如当前位置在棋盘的（i，j）方格，下一个可能的位置依次为（i+2，j+1）、（i+1，j+2）、（i-1，j+2）、（i-2，j+1）、（i-2，j-1）、（i-1，j-2）、（i+1，j-2）、（i+2，j-1），实际可以走的位置尽限于还未走过的和不越出边界的那些位置。为便于程序的同意处理，可以引入两个数组，分别存储各种可能走法对当前位置的纵横增量。　<br />
<br />
　4 3　<br />
5 2　<br />
马　<br />
6 1　<br />
7 0　<br />
<br />
对于本题，一般可以采用回溯法，这里采用Warnsdoff策略求解，这也是一种贪婪法，其选择下一出口的贪婪标准是在那些允许走的位置中，选择出口最少的那个位置。如马的当前位置（i，j）只有三个出口，他们是位置（i+2，j+1）、（i-2，j+1）和（i-1，j-2），如分别走到这些位置，这三个位置又分别会有不同的出口，假定这三个位置的出口个数分别为4、2、3，则程序就选择让马走向（i-2，j+1）位置。　<br />
由于程序采用的是一种贪婪法，整个找解过程是一直向前，没有回溯，所以能非常快地找到解。但是，对于某些开始位置，实际上有解，而该算法不能找到解。对于找不到解的情况，程序只要改变8种可能出口的选择顺序，就能找到解。改变出口选择顺序，就是改变有相同出口时的选择标准。以下程序考虑到这种情况，引入变量start，用于控制8种可能着法的选择顺序。开始时为0，当不能找到解时，就让start增1，重新找解。细节以下程序。　<br />
【程序】　<br />
# include &lt;stdio.h&gt;　<br />
int delta_i[ ]={2,1,-1,-2,-2,-1,1,2};　<br />
int delta_j[ ]={1,2,2,1,-1,-2,-2,-1};　<br />
int board[8][8];　<br />
int exitn(int i,int j,int s,int a[ ])　<br />
{ int i1,j1,k,count;　<br />
for (count=k=0;k&lt;8;k++)　<br />
{ i1=i+delta_i[(s+k)%8];　<br />
j1=i+delta_j[(s+k)%8];　<br />
if (i1&gt;=0&amp;&amp;i1&lt;8&amp;&amp;j1&gt;=0&amp;&amp;j1&lt;8&amp;&amp;board[I1][j1]==0)　<br />
a[count++]=(s+k)%8;　<br />
}　<br />
return count;　<br />
}　<br />
<br />
int next(int i,int j,int s)　<br />
{ int m,k,mm,min,a[8],b[8],temp;　<br />
m=exitn(i,j,s,a);　<br />
if (m==0) return &#8211;1;　<br />
for (min=9,k=0;k&lt;m;k++)　<br />
{ temp=exitn(I+delta_i[a[k]],j+delta_j[a[k]],s,b);　<br />
if (temp&lt;min)　<br />
{ min=temp;　<br />
kk=a[k];　<br />
}　<br />
}　<br />
return kk;　<br />
}　<br />
<br />
void main()　<br />
{ int sx,sy,i,j,step,no,start;　<br />
for (sx=0;sx&lt;8;sx++)　<br />
for (sy=0;sy&lt;8;sy++)　<br />
{ start=0;　<br />
do {　<br />
for (i=0;i&lt;8;i++)　<br />
for (j=0;j&lt;8;j++)　<br />
board[i][j]=0;　<br />
board[sx][sy]=1;　<br />
I=sx; j=sy;　<br />
For (step=2;step&lt;64;step++)　<br />
{ if ((no=next(i,j,start))==-1) break;　<br />
I+=delta_i[no];　<br />
j+=delta_j[no];　<br />
board[i][j]=step;　<br />
}　<br />
if (step&gt;64) break;　<br />
start++;　<br />
} while(step&lt;=64)　<br />
for (i=0;i&lt;8;i++)　<br />
{ for (j=0;j&lt;8;j++)　<br />
printf(&#8220;%4d&#8221;,board[i][j]);　<br />
printf(&#8220;\n\n&#8221;);　<br />
}　<br />
scanf(&#8220;%*c&#8221;);　<br />
}　<br />
}　<br />
<br />
&nbsp;
<img src ="http://www.cnblogs.com/mz121star/aggbug/1206743.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41791/" target="_blank">[新闻]谷歌平台手机获准上市</a>]]></description></item><item><title>c++按位操作符</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/24/bit.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Sat, 24 May 2008 08:16:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/24/bit.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1206454.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/24/bit.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1206454.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1206454.html</trackback:ping><description><![CDATA[摘要: 顾名思义，按位运算符允许按照位来操作整型变量。可以把按位运算符应用于任意signed和unsigned整型，包括char类型。但是，它们通常应用于不带符号的整型。<br><br>这些运算符的一个常见应用是在整型变量中使用单个的位存储信息。例如标记，它用于描述二进制状态指示符。可以使用一个位来描述有两个状态的值：开或关、男或女，真或假。<br><br>也可以使用按位运算符处理存储在一个变量中的几个信息项。例如，颜色值常常记录为三个八位值，分别存储颜色中红、绿和蓝的强度。这些常常保存到四字节变量中的三个字节。第四个字节也不会浪费，包含表示颜色透明度的值。显然，要处理各个颜色成分，需要从变量中分离出各个字节，按位运算符就可以做到这一点。<br><br>再看另外一个例子，假定需要记录字体的信息，那么，只要存储每种字体的样式和字号，以及字体是黑体还是斜体，就可以把这些信息都存储在一个二字节的整型变量中，如图3-1所示。<br><br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/05/24/bit.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1206454.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41790/" target="_blank">[新闻]微软自称传媒公司 强调搜索引擎三大趋势</a>]]></description></item><item><title>F#: .NET中的函数编程语言</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/23/fsharp.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Fri, 23 May 2008 10:05:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/23/fsharp.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1205974.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/23/fsharp.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1205974.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1205974.html</trackback:ping><description><![CDATA[<div class="art"><img id="ctl00_managerContentPlaceHolder_webPartManager_portalView4207_ctl00_img" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: 80px; height: 80px; border-right-width: 0px" alt="" src="http://www.msuniversity.edu.cn/upload/FegoNet.Module.News/96.jpg" /><br />
近几年来，函数编程（Functional programming）越来越受到关注，诸如C#中的Lambda表达式、LINQ技术就是基于函数编程技术。通过LINQ和并行计算框架 （Parallel FX），函数编程的思想能够解决我们当今面临的许多计算挑战，从关系数据与对象的不统一到多核的并行计算。<br />
<br />
F#（F-Sharp）就是一种函数编程语言，它由微软研究院发起，它基于ML语言，同时也吸取了C#、LINQ以及Haskell中的部分特性。F#被 设计为.NET语言家族中的一等公民，也就是说，F#能在.NET CLR中运行，支持面向对象，同时它的许多特性也保证了与.NET框架的良好集成。<br />
<br />
F#有如下几个特点：<br />
<br />
<ul>
    <li>类似Python的脚本命令行
    <li>可以用于类似MATLAB的互动数据可视化环境
    <li>ML语言中的强类型推导和类型安全
    <li>与流行的OCaml语言共享的交叉编译兼容核心
    <li>和C#类似的性能评测技术
    <li>可以应用所有的.NET类库、数据库及其他技术
    <li>和Scheme语言类似的Lambda特性
    <li>完全的Visual Studio工具整合
    <li>一流的编程语言专家参与的高质量程序实现
    <li>在并发编程、以及可移植和分布式.NET框架中的原生执行速度 </li>
</ul>
<br />
使用Visual Studio结合F#，不仅有基本的代码着色、语法提示，甚至还能进行Windows Form与ASP.NET开发，强大的类型推导与模式匹配让你编写算法更加得心应手。而你依然可以在其他语言（如C#、VB.NET）编写的项目中应用 F#编译出的程序集。<br />
<br />
<strong>开始学习F#及函数编程技术</strong><br />
<br />
<a href="http://www.msuniversity.edu.cn/m_Repository/RepositoryDetail.aspx?RepositoryID=577">本地下载F# 安装包</a><br />
<a href="http://research.microsoft.com/fsharp/starting.aspx">初学者指南</a><br />
<a href="http://research.microsoft.com/fsharp/manual/default.aspx">F#语言手册</a><br />
<a href="http://cs.hubfs.net/">hubFS: F#交流区</a><br />
<a href="http://research.microsoft.com/fsharp/fsharp.aspx">F#微软研究院站点</a><br />
<a href="http://blogs.msdn.com/dsyme/">Don Syme的F# Blog</a> </div>
<img src ="http://www.cnblogs.com/mz121star/aggbug/1205974.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41789/" target="_blank">[新闻]亚洲社交网站Friendster将兼容竞争对手窗件</a>]]></description></item><item><title>【转】java多线程设计要点</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/18/1201754.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Sat, 17 May 2008 20:28:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/18/1201754.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1201754.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/18/1201754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1201754.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1201754.html</trackback:ping><description><![CDATA[<p><font size="4"><strong>1</strong></font><strong>.</strong>多线程中有主内存和工作内存之分， 在JVM中，有一个主内存，专门负责所有线程共享数据；而每个线程都有他自己私有的工作内存， 主内存和工作内存分贝在JVM的stack区和heap区。</p>
<p><strong><font size="4">2.</font></strong>线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态，<br />
'Ready' 表示线程正在等待CPU分配允许运行的时间。</p>
<p>&nbsp;</p>
<p><font size="4"><strong>3.</strong></font>线程运行次序并不是按照我们创建他们时的顺序来运行的，CPU处理线程的顺序是不确定的，如果需要确定，那么必须手工介入，使用setPriority()方法设置优先级。</p>
<p><strong><font size="4">4.</font></strong>我们无从知道一个线程什么时候运行，两个或多个线程在访问同一个资源时，需要synchronized</p>
<p><strong><font size="4">5.</font></strong> 每个线程会注册自己，实际某处存在着对它的引用，因此，垃圾回收机制对它就&#8220;束手无策&#8221;了。</p>
<p><strong><font size="4">6.</font></strong> Daemon线程区别一般线程之处是：主程序一旦结束，Daemon线程就会结束。</p>
<p><strong><font size="4">7.</font></strong> 一个对象中的所有synchronized方法都共享一把锁，这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。</p>
<p><strong><font size="4">8.</font></strong> 对于访问某个关键共享资源的所有方法，都必须把它们设为synchronized，否则就不能正常工作。</p>
<p><font size="4"><strong>9.</strong></font> 假设已知一个方法不会造成冲突，最明智的方法是不要使用synchronized，能提高些性能。</p>
<p><strong><font size="4">10</font></strong>. 如果一个"同步"方法修改了一个变量，而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。</p>
<p><strong><font size="4">11.</font></strong> synchronized不能继承，　父类的方法是synchronized，那么其子类重载方法中就不会继承&#8220;同步&#8221;。</p>
<p><strong><font size="4">12.</font></strong> 线程堵塞Blocked有几个原因造成：</p>
<p>(1)线程在等候一些IO操作 <br />
(2)线程试图调用另外一个对象的&#8220;同步&#8221;方法，但那个对象处于锁定状态，暂时无法使用。</p>
<p><strong><font size="4">13.</font></strong>原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的， 但是大部分情况下，我们并不能正确使用，来看看 i = i + 1 , i是int型，属于原始型变量：<br />
<br />
(1)从主内存中读取i值到本地内存. <br />
(2)将值从本地内存装载到线程工作拷贝中. <br />
(3)装载变量1. <br />
(4)将i 加 1. <br />
(5)将结果给变量i. <br />
(6)将i保存到线程本地工作拷贝中. <br />
(7)写回主内存. </p>
<p>注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。</p>
<p>double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。<br />
</p>
<p>&nbsp;</p>
<p><font size="4"><strong>14.</strong></font> 由于13条的原因，我们解决办法是：</p>
<p>class xxx extends Thread{</p>
<p>//i会被经常修改<br />
private int i;<br />
<br />
public synchronized int read(){ return i;}</p>
<p>public synchronized void update(){ i = i + 1;}</p>
<p>..........</p>
<p>}</p>
<p><strong><font size="4">15.</font></strong> Volatile变量， volatile变量表示保证它必须是与主内存保持一致，它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的，如用在long 或 double变量前。<br />
</p>
<p><strong><font size="4">16.</font></strong> 使用yield()会自动放弃CPU，有时比sleep更能提升性能。</p>
<p><strong><font size="4">17.</font></strong> sleep()和wait()的区别是：wait()方法被调用时会解除锁定，但是我们能使用它的地方只是在一个同步的方法或代码块内。</p>
<p><strong><font size="4">18.</font></strong> 通过制造缩小同步范围，尽可能的实现代码块同步，wait(毫秒数)可在指定的毫秒数可退出wait；对于wait()需要被notisfy()或notifyAll()踢醒。</p>
<p><strong><font size="4">19.</font></strong> 构造两个线程之间实时通信的方法分几步：<br />
(1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;<br />
PipedReader in = new PipedReader(new PipedWriter())<br />
(2). 在需要发送信息的线程开始之前，将外部的PipedWriter导向给其内部的Writer实例out<br />
(3). 在需要接受信息的线程开始之前，将外部的PipedReader导向给其内部的Reader实例in<br />
(4). 这样放入out的所有东西度可从in中提取出来。</p>
<p><strong><font size="4">20.</font></strong> synchronized带来的问题除性能有所下降外，最大的缺点是会带来死锁DeadLock，只有通过谨慎设计来防止死锁，其他毫无办法，这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法</p>
<p><strong><font size="4">21.</font></strong> 在大量线程被堵塞时，最高优先级的线程先运行。但是不表示低级别线程不会运行，运行概率小而已。</p>
<p><strong><font size="4">22.</font></strong> 线程组的主要优点是：使用单个命令可完成对整个线程组的操作。很少需要用到线程组。</p>
<p><strong><font size="4">23.</font></strong> 从以下几个方面提升多线程的性能：</p>
<p>检查所有可能Block的地方，尽可能的多的使用sleep或yield()以及wait();</p>
<p>尽可能延长sleep(毫秒数)的时间;</p>
<p>运行的线程不用超过100个，不能太多；</p>
<p>不同平台linux或windows以及不同JVM运行性能差别很大。</p>
<p><font size="4"><strong>24</strong>.</font> 推荐几篇相关英文文章:</p>
<p><a href="http://www.fawcette.com/javapro/2003_03/magazine/features/odoerderlein/default_pf.asp" target="_blank">Use Threading Tricks to Improve Programs</a></p>
<p><br />
</p>
<img src ="http://www.cnblogs.com/mz121star/aggbug/1201754.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41788/" target="_blank">[新闻]百度宣布服务器全面换装闪存 替代硬盘</a>]]></description></item><item><title>sniffer技术资料和实现方法</title><link>http://www.cnblogs.com/mz121star/archive/2008/05/02/1179161.html</link><dc:creator>Zhuang miao</dc:creator><author>Zhuang miao</author><pubDate>Thu, 01 May 2008 18:38:00 GMT</pubDate><guid>http://www.cnblogs.com/mz121star/archive/2008/05/02/1179161.html</guid><wfw:comment>http://www.cnblogs.com/mz121star/comments/1179161.html</wfw:comment><comments>http://www.cnblogs.com/mz121star/archive/2008/05/02/1179161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/mz121star/comments/commentRss/1179161.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/mz121star/services/trackbacks/1179161.html</trackback:ping><description><![CDATA[摘要: sniffer中文翻译过来就是嗅探器。是一中威胁性极大的被动攻击工具！使用在个攻击可以监视网络的状态。数据流动情况以及网络上传输的信息，便可以用网络监听到方式来进行攻击，截获网上的信息。所以黑客常常喜欢用他来截获用户口令！<br>sniffer可以分为两类一个是硬件的一个软件的，今天给大家讲的主要是软件的sniffer.sniffer只能抓取一个物理网段的包，就是说你和监听的目标中间不能有路由（交换）或其他屏蔽广播包的设备，这一点很重要。所以对一般拨号上网的用户来说，是不可能利用sniffer来窃听到其他人的通信内容的！<br>sniffer属于第二层次的攻击。就是说只有在攻击者已经进入了目标系统的情况下，才能使用sniffer这中攻击手段，以便得到更多的信息。sniffer除了能得到口令或用户名外，还能得到更多的其他的信息，比如一个其他重要的信息，在网上转送的金融信息等等。sniffer几乎能得到任何在以太网上转送的数据包。sniffer是一中比较复杂的攻击手段，一般只有黑客老手才有能力使用他（其实只要了解了也可以去试试我就是常常练习才知道！）而对于一个网络新手来说，即使在一台主&nbsp;&nbsp;<a href='http://www.cnblogs.com/mz121star/archive/2008/05/02/1179161.html'>阅读全文</a><img src ="http://www.cnblogs.com/mz121star/aggbug/1179161.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41787/" target="_blank">[新闻]诺基亚发布奢华碳纤维版8800 Arte</a>]]></description></item></channel></rss>