<?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>中文Flex例子 &#187; 算法</title>
	<atom:link href="http://blog.minidx.com/tag/%e7%ae%97%e6%b3%95/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.minidx.com</link>
	<description>中文Adobe Flex例子,Flex实例教程,RIA资源,全文检索技术,算法和数据结构</description>
	<lastBuildDate>Thu, 31 Mar 2011 03:22:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>经典算法集合帖&#8211;2008-02-16</title>
		<link>http://blog.minidx.com/2008/02/16/498.html</link>
		<comments>http://blog.minidx.com/2008/02/16/498.html#comments</comments>
		<pubDate>Sat, 16 Feb 2008 13:55:50 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[经典算法]]></category>
		<category><![CDATA[集合]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/2008/02/16/498.html</guid>
		<description><![CDATA[翻了翻自己的Blog，发现发的文章已经不少了，不过还真是应验了About页面上最初的说法，什么东西都往这上面扔……看到这里的订阅人数也已经超过120了，在这里表示一下感谢！感谢各位可以忍受我的杂乱无章……
之前发了一些关于算法的文章，虽然作了一个分类，不过翻起来还是不是很方便，所以做一个集合，希望可以给阅读的朋友们带来一些方便吧。








二分搜索算法(折半查找)原理以及递归（recuition），迭代（iteration）的两种实现源代码
蚁群算法ACO(ant colony optimization)的原理以及实现源代码
四种常用排序方法的基本思想和PHP实现源代码
汉诺塔算法的递归与非递归的C以及C++源代码
DES加密标准的说明以及加密/解密函数的实现源代码
Stein算法的简单描述以及C++/Java的三种实现源代码
欧几里德算法的简单描述以及C++与Java的各自实现(源代码)
约瑟夫环问题(Josephus)的两种解法（源代码）
几种经典的Hash算法的实现(源代码)
你可能还对下列文章感兴趣:Flex相关的一些开发例子与教程资源集合二分搜索算法(折半查找)原理以及递归（recuition），迭代（iteration）的两种实现源代码蚁群算法ACO(ant colony optimization)的原理以及实现源代码汉诺塔算法的递归与非递归的C以及C++源代码DES加密标准的说明以及加密/解密函数的实现源代码]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/02/16/498.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>二分搜索算法(折半查找)原理以及递归（recuition），迭代（iteration）的两种实现源代码</title>
		<link>http://blog.minidx.com/2008/02/03/468.html</link>
		<comments>http://blog.minidx.com/2008/02/03/468.html#comments</comments>
		<pubDate>Sun, 03 Feb 2008 11:59:05 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[iteration]]></category>
		<category><![CDATA[recuition]]></category>
		<category><![CDATA[二分搜索]]></category>
		<category><![CDATA[折半查找]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[迭代]]></category>
		<category><![CDATA[递归]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/2008/02/03/468.html</guid>
		<description><![CDATA[折半查找法也称为二分查找法，它充分利用了元素间的次序关系，采用分治策略，可在最坏的情况下用O(log n)完成搜索任务。
【基本思想】
将n个元素分成个数大致相同的两半，取a[n/2]与欲查找的x作比较，如果x=a[n/2]则找到x，算法终止。如果x&#60;a[n/2]，则我们只要在数组a的左半部继续搜索x（这里假设数组元素呈升序排列）。如果x&#62;a[n/2]，则我们只要在数组a的右半部继续搜索x。
二分搜索法的应用极其广泛，而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了，但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道，90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定，正确地归纳奇偶数的各种情况，其实整理后可以发现它的具体算法是很直观的。








C++描述
Download: BinarySearch.cpptemplate&#60;class Type&#62; 
int BinarySearch(Type a[],const Type&#38; x,int n)&#160;
{&#160;
int&#160;left=0; 
int right=n-1; 
while(left&#60;=right){&#160;
int&#160;middle=(left+right)/2; 
if&#160;(x==a[middle]) return middle; 
if&#160;(x&#62;a[middle]) left=middle+1; 
else&#160;right=middle-1; 
}&#160;
return -1; 
}
递归实现（recuition）
Download: binary_search_recuition.cpptemplate&#60;class Record, class Key&#62;
int binary_search( Record * r, const int &#38; low, const int &#38; high, const Key &#38; k )
{
int&#160;mid = (low + high)/2;
if(&#160;low &#60; high )
{
&#160; if(&#160;k &#60;= [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/02/03/468.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>蚁群算法ACO(ant colony optimization)的原理以及实现源代码</title>
		<link>http://blog.minidx.com/2008/02/01/462.html</link>
		<comments>http://blog.minidx.com/2008/02/01/462.html#comments</comments>
		<pubDate>Thu, 31 Jan 2008 16:26:22 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[ACO]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[colony]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[原理]]></category>
		<category><![CDATA[源代码]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[蚁群算法]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/2008/02/01/462.html</guid>
		<description><![CDATA[ 之前说的算法基本上都比较枯燥的（废话，算法都很枯燥……），这次要介绍的蚁群算法(Ant Colony Algorithm)却是一种源于自然现象的算法，也是一种 meta heuristic，即与具体问题关系不大的优化算法，也就是它是一种用来在图中寻找优化路径的机率型技术。Marco Dorigo于1992年在他的博士论文中引入，其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。








小小的蚂蚁总是能够找到食物，他们具有什么样的智能呢？设想，如果我们要为蚂蚁设计一个人工智能的程序，那么这个程序要多么复杂呢？首先，你要让蚂蚁能够避开障碍物，就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物，其次，要让蚂蚁找到食物，就需要让他们遍历空间上的所有点；再次，如果要让蚂蚁找到最短的路径，那么需要计算所有可能的路径并且比较它们的大小，而且更重要的是，你要小心翼翼的编程，因为程序的错误也许会让你前功尽弃。这是多么不可思议的程序！太复杂了，恐怕没人能够完成这样繁琐冗余的程序。 
为什么这么简单的程序会让蚂蚁干这样复杂的事情？答案是：简单规则的涌现。事实上，每只蚂蚁并不是像我们想象的需要知道整个世界的信息，他们其实只关心很小范围内的眼前信息，而且根据这些局部信息利用几条简单的规则进行决策，这样，在蚁群这个集体里，复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律！
下面就是实现如此复杂性的七条简单规则：
1、范围：蚂蚁观察到的范围是一个方格世界，蚂蚁有一个参数为速度半径（一般是3），那么它能观察到的范围就是3*3个方格世界，并且能移动的距离也在这个范围之内。2、环境：蚂蚁所在的环境是一个虚拟的世界，其中有障碍物，有别的蚂蚁，还有信息素，信息素有两种，一种是找到食物的蚂蚁洒下的食物信息素，一种是找到窝的蚂蚁洒下的窝的信息素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。3、觅食规则：在每只蚂蚁能感知的范围内寻找是否有食物，如果有就直接过去。否则看是否有信息素，并且比较在能感知的范围内哪一点的信息素最多，这样，它就朝信息素多的地方走，并且每只蚂蚁多会以小概率犯错误，从而并不是往信息素最多的点移动。蚂蚁找窝的规则和上面一样，只不过它对窝的信息素做出反应，而对食物信息素没反应。4、移动规则： 每只蚂蚁都朝向信息素最多的方向移，并且，当周围没有信息素指引的时候，蚂蚁会按照自己原来运动的方向惯性的运动下去，并且，在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈，它会记住最近刚走过了哪些点，如果发现要走的下一点已经在最近走过了，它就会尽量避开。5、避障规则：如果蚂蚁要移动的方向有障碍物挡住，它会随机的选择另一个方向，并且有信息素指引的话，它会按照觅食的规则行为。 7、播撒信息素规则：每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多，并随着它走远的距离，播撒的信息素越来越少。
下面的程序开始运行之后，蚂蚁们开始从窝里出动了，寻找食物；他们会顺着屏幕爬满整个画面，直到找到食物再返回窝。
其中，‘F’点表示食物，‘H’表示窝，白色块表示障碍物，‘+’就是蚂蚁了。
参数说明：最大信息素：蚂蚁在一开始拥有的信息素总量，越大表示程序在较长一段时间能够存在信息素。信息素消减的速度：随着时间的流逝，已经存在于世界上的信息素会消减，这个数值越大，那么消减的越快。错误概率表示这个蚂蚁不往信息素最大的区域走的概率，越大则表示这个蚂蚁越有创新性。速度半径表示蚂蚁一次能走的最大长度，也表示这个蚂蚁的感知范围。记忆能力表示蚂蚁能记住多少个刚刚走过点的坐标，这个值避免了蚂蚁在本地打转，停滞不前。而这个值越大那么整个系统运行速度就慢，越小则蚂蚁越容易原地转圈。
源代码如下(不同编译器可能需做一定修改)：

/*ant.c*/

#define SPACE 0x20
#define ESC 0x1b
#define ANT_CHAR_EMPTY '+'
#define ANT_CHAR_FOOD 153
#define HOME_CHAR 'H'
#define FOOD_CHAR 'F'
#define FOOD_CHAR2 'f'
#define FOOD_HOME_COLOR 12
#define BLOCK_CHAR 177

#define MAX_ANT 50
#define INI_SPEED 3
#define MAXX 80
#define MAXY 23
#define MAX_FOOD 10000
#define TARGET_FOOD 200
#define MAX_SMELL 5000
#define SMELL_DROP_RATE 0.05
#define ANT_ERROR_RATE 0.02
#define ANT_EYESHOT 3
#define SMELL_GONE_SPEED 50
#define SMELL_GONE_RATE 0.05
#define TRACE_REMEMBER 50
#define MAX_BLOCK [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/02/01/462.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>汉诺塔算法的递归与非递归的C以及C++源代码</title>
		<link>http://blog.minidx.com/2008/01/30/457.html</link>
		<comments>http://blog.minidx.com/2008/01/30/457.html#comments</comments>
		<pubDate>Tue, 29 Jan 2008 23:50:05 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[勃拉玛]]></category>
		<category><![CDATA[汉诺塔]]></category>
		<category><![CDATA[河内塔]]></category>
		<category><![CDATA[源代码]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[递归]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/2008/01/30/457.html</guid>
		<description><![CDATA[ 汉诺塔（又称河内塔）问题其实是印度的一个古老的传说。
开天辟地的神勃拉玛（和中国的盘古差不多的神吧）在一个庙里留下了三根金刚石的棒，第一根上面套着64个圆的金片，最大的一个在底下，其余一个比一个小，依次叠上去，庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上，规定可利用中间的一根棒作为帮助，但每次只能搬一个，而且大的不能放在小的上面。计算结果非常恐怖(移动圆片的次数)18446744073709551615，众僧们即便是耗尽毕生精力也不可能完成金片的移动了。








 
算法介绍：其实算法非常简单，当盘子的个数为n时，移动的次数应等于2^n &#8211; 1（有兴趣的可以自己证明试试看）。后来一位美国学者发现一种出人意料的简单方法，只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型，把所有的圆盘按从大到小的顺序放在柱子A上，根据圆盘的数量确定柱子的排放顺序：若n为偶数，按顺时针方向依次摆放 A B C；若n为奇数，按顺时针方向依次摆放 A C B。（1）按顺时针方向把圆盘1从现在的柱子移动到下一根柱子，即当n为偶数时，若圆盘1在柱子A，则把它移动到B；若圆盘1在柱子B，则把它移动到C；若圆盘1在柱子C，则把它移动到A。（2）接着，把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上，当两根柱子都非空时，移动较小的圆盘。这一步没有明确规定移动哪个圆盘，你可能以为会有多种可能性，其实不然，可实施的行动是唯一的。（3）反复进行（1）（2）操作，最后就能按规定完成汉诺塔的移动。
所以结果非常简单，就是按照移动规则向一个方向移动金片：如3阶汉诺塔的移动：A→C,A→B,C→B,A→C,B→A,B→C,A→C
汉诺塔问题也是程序设计中的经典递归问题，下面我们将给出递归和非递归的不同实现源代码。
●汉诺塔算法的递归实现C++源代码
#include &#60;fstream&#62;
#include &#60;iostream&#62;
using namespace std;
ofstream fout("out.txt");
void Move(int n,char x,char y)
{
  fout&#60;&#60;"把"&#60;&#60;n&#60;&#60;"号从"&#60;&#60;x&#60;&#60;"挪动到"&#60;&#60;y&#60;&#60;endl;
}
void Hannoi(int n,char a,char b,char c)
{
      if(n==1)
              Move(1,a,c);
    else
    {
 [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/01/30/457.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DES加密标准的说明以及加密/解密函数的实现源代码</title>
		<link>http://blog.minidx.com/2008/01/29/454.html</link>
		<comments>http://blog.minidx.com/2008/01/29/454.html#comments</comments>
		<pubDate>Tue, 29 Jan 2008 13:36:32 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[]]></category>
		<category><![CDATA[DES]]></category>
		<category><![CDATA[FIPS]]></category>
		<category><![CDATA[NSA]]></category>
		<category><![CDATA[分组密码]]></category>
		<category><![CDATA[加密]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[解密]]></category>

		<guid isPermaLink="false">http://blog.minidx.com/2008/01/29/454.html</guid>
		<description><![CDATA[下面是来自维基的关于DES的说明： 数据加密标准( DES )是一种加密演算法(一种加密信息的方法), 1976年被美国联邦政府的联邦信息处理标准(FIPS)所选中,随后既在国际上广泛流传开来。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。 








DES现在已经不被视为一种安全的加密演算法，因为它使用的56位秘钥过短，以现代计算能力，24小时内极可能被破解。 也有一些分析报告提出了该演算法的理论上的弱点，虽然实际情况未必出现。该标准在最近已经被高级加密标准（AES）所取代。
虽然是一种被取代了的算法，不过通过理解和研究这种算法的实现，还是可以带给我们不少启示的。下面是实现的C#代码：
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Text;
using System.IO;
using System.Security.Cryptography; 

private void menuItem13_Click(
    object sender,
    System.EventArgs e)
{
    //对应加密函数DSACrypData(string  strcrypto)
    string strcrypto=richTextBox1.Text;
    DSACrypData(strcrypto);
}

public static void DSACrypData(string  strcrypto)
{
    //先要将字符串转换为字节数组，这与编码有关。
   [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2008/01/29/454.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching 2/23 queries in 0.079 seconds using disk
Object Caching 444/850 objects using disk

Served from: blog.minidx.com @ 2012-02-10 00:55:34 -->
