经典算法分享

greatverve 2008-11-15 11:46:07
今天突然对算法起了兴趣,研究了两个最简单的,感觉很不错.分享一下.
同时抛砖引玉,希望朋友们能提供更多短小精悍的,并且加上注释,
和你自己的理解.哪怕你只提供了一个很简单的,只要是正确的,自己试过了.
教教我,就给分.不要在网上查一大堆贴上去.
另外,关于数据结构方向的也可以.
using System;
using System.Collections.Generic;
using System.Text;

namespace UnionCompany
{
class Program
{
static void Main(string[] args)
{
//算法总结
Sort sort = new Sort();
//递归算法
Console.WriteLine(sort.Factorial(6));
//
int[] arr ={ 1, 9, 3, 6 };
sort.SortProduce(ref arr);
foreach (int i in arr)
{
Console.WriteLine(i);
}

Console.ReadLine();
}
}

public class Sort
{
/*******递归调用的原理*********
* 首先,设置一个递归头,即当问题足够简化时,直接获得答案.
* 其次,自己调用自己,即逐步缩小问题范围,比如把求n!转化为求(n-1)!
*****************************/
/// <summary>
/// 递归调用
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public int Factorial(int n)
{
if (n == 1)
return 1;//递归头
else
return n * Factorial(n - 1);//递归调用自身
}
/*******冒泡算法的原理*********
* 根本原理:两两比较
* 比如1,9,3,6按升序排列,
* 先比较1,9是升序,则转向比较9,3 ---1936
* 非升序则交换成3,9 ---1396
* 然后再比较9,6非升序则交换 --- 1369
* 这样子每扫描一轮,就从中挑出最大的,放在最后位置.
*****************************/
/// <summary>
/// 排序---冒泡排序
/// </summary>
/// <param name="dataArray"></param>
public void SortProduce(ref int[] dataArray)
{
int pass;//记录扫描次数
int i;
int temp;
int exchangeCnt;//记录交换次数
for (pass = 0; pass < dataArray.Length; pass++)
{
exchangeCnt = 0;
for (i = 0; i < dataArray.Length - pass - 1; i++)//这里减1是因为最后一个不必再考虑.
{
if (dataArray[i] > dataArray[i + 1])
{
temp = dataArray[i];
dataArray[i] = dataArray[i + 1];
dataArray[i + 1] = temp;
exchangeCnt++;
}
}
if (exchangeCnt == 0)//如果没有交换,说明已经排好序,返回.
return;
}
}
}
}
...全文
1127 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgy0816 2011-03-16
  • 打赏
  • 举报
回复
mark,好贴!
liubuweiright 2008-11-17
  • 打赏
  • 举报
回复
学习
雾人紫帝 2008-11-17
  • 打赏
  • 举报
回复
看懂了再说
zhangxuyu1118 2008-11-17
  • 打赏
  • 举报
回复
mark and jf
qqhahazxxqq 2008-11-17
  • 打赏
  • 举报
回复
收藏 JF
greatverve 2008-11-17
  • 打赏
  • 举报
回复
你不管学什么,比如学C#,总得先从Hello World开始吧。
我就是想找些Hello World类型的算法,大家怎么不明白我的意思呢?
greatverve 2008-11-17
  • 打赏
  • 举报
回复
你不管学什么,比如学C#,总得先从Hello World开始吧。
我就是想找些Hello World类型的算法,大家怎么不明白我的意思呢?
amanizty 2008-11-17
  • 打赏
  • 举报
回复
up ~~~ marking
ndsc_cherry 2008-11-17
  • 打赏
  • 举报
回复
我讨厌算法,直接给分就行了,呵呵。
ndsc_cherry 2008-11-17
  • 打赏
  • 举报
回复
我讨厌算法,直接给分就行了,呵呵。
conan19771130 2008-11-17
  • 打赏
  • 举报
回复
收藏
wangzhenyue 2008-11-17
  • 打赏
  • 举报
回复
来晚了学习
jiangnan_010203 2008-11-17
  • 打赏
  • 举报
回复
学习
stonec 2008-11-17
  • 打赏
  • 举报
回复
mark
qq2013 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 xztslsz 的回复:]
学习了
[/Quote]
我也是
xztslsz 2008-11-17
  • 打赏
  • 举报
回复
学习了
terrywolf 2008-11-16
  • 打赏
  • 举报
回复
不错,收藏!
haifeng39 2008-11-16
  • 打赏
  • 举报
回复
mark!
up!
binbingao 2008-11-16
  • 打赏
  • 举报
回复
我学人工智能的,最熟悉的就是免疫算法了(好像长了点。。。^_^)
%这是免疫算法。这个算法几乎与遗传算法一样,只是多用了一个免疫函数
%免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。
%疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中
%注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解
%这是免疫算法的主程序,它需要调用的函数如下。
%接种疫苗函数:
%function inoculate Chromosome=immunity (chromosomeGroup, bacterinChromosome, parameter)
%parameter:1,随机制取染色体接种。2,每个染色体都接种。3,每个染色体都接种,但接种的位置是随机的
%这个函数实现对染色体的疫苗接种
%由染色体(可能解的2进制)顺序号找到可能解:
%x=chromosome (fatherChromosomeGroup, oneDimensionSet, solutionSum);
%把解代入非线性方程组计算误差函数:functionError=nonLinearSumError1(x);
%判定程是否得解函数:[solution,isTrue]=isSolution(x,funtionError,solutionSumError);
%选择最优染色体函数:
%[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError);
%误差比较函数:从两个染色体中,选出误差较小的染色体
%[holdBestChromosome,holdLeastFunctionError]...
% =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,...
% bestChromosome,leastFuntionError)
%为染色体定义概率函数,好的染色体概率高,坏染色体概率低
%p=chromosomeProbability(functionError);
%按概率选择染色体函数:
%slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
%父代染色体杂交产生子代染色体函数
%sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
%防止染色体超出解空间的函数
%chromosomeGroup=checkSequence(chromosomeGroup,solutionSum)
%变异函数
%fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN);
%通过实验有如下结果:
%1。染色体应当多一些
%2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低,
%但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同,
%这就减少了物种的多样性,反而难以逼近解
%3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解
%4。单纯免疫效果不好,杂交+免疫效果比较好

%%%%%%%%%%%%%%%%%%%%%%%%程序开始运行

clear,clc;%清理内存,清屏
circleN=200;%迭代次数
format long

%%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度
solutionSum=4;leftBoundary=-10;rightBoundary=10;
distance=1;chromosomeSum=500;solutionSumError=0.1;
%solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界;
%rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度
%chromosomeSum:染色体的个数;solveSumError:解的误差
oneDimensionSet=leftBoundary:distance:rightBoundary;
%oneDimensionSet:可能解在一个数轴(维)上的集合
oneDimensionSetN=size(oneDimensionSet,2);%返回oneDimensionSet中的元素个数
solutionN=oneDimensionSetN^solutionSum;%解空间(解集合)中可能解的总数
binSolutionN=dec2bin(solutionN);%把可能解的总数转换成二进制数
chromosomeLength=size(binSolutionN,2);%由解空间中可能解的总数(二进制数)计算染色体的长度

%%%%%%%%%%%%%%%%程序初始化
%随机生成初始可能解的顺序号,+1是为了防止出现0顺序号
solutionSequence=fix(rand(chromosomeSum,1)*solutionN)+1;
for i=1:chromosomeSum%防止解的顺序号超出解的个数
if solutionSequence(i)>solutionN;
solutionSequence(i)=solutionN;
end
end
%染色体是解集合中的序号,它对应一个可能解
%把解的十进制序号转成二进制序号
fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength);
holdLeastFunctionError=Inf;%可能解的最小误差的初值
holdBestChromosome=0;%对应最小误差的染色体的初值

%%%%%%%%%%%%%%%%%%开始计算
compute=1;
circle=0;
while compute%开始迭代求解
%%%%%%%%%%%%%1:由可能解的序号寻找解本身(关键步骤)
x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum);
%%%%%%%%%%%%%2:把解代入非线性方程计算误差
functionError=nonLinearSumError1(x);%把解代入方程计算误差
[solution,minError,isTrue]=isSolution(x,functionError,solutionSumError);
%isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。solution是方程的解
if isTrue==1
'方程得解'
solution
minError
return%结束程序
end
%%%%%%%%%%%%%3:选择最好解对应的最优染色体
[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError);
%%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体
%本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解;
%反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中
[holdBestChromosome,holdLeastFunctionError]...
=compareBestChromosome(holdBestChromosome,holdLeastFunctionError,...
bestChromosome,leastFunctionError);
circle=circle+1
%minError
%solution
holdLeastFunctionError
if circle>circleN
return
end
%%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群中
order=round(rand(1)*chromosomeSum);
if order==0
order=1;
end
fatherChromosomeGroup(order,:)=holdBestChromosome;
functionError(order)=holdLeastFunctionError;

%%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)
%%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计算概率
[p,trueP]=chromosomeProbability(functionError);
if trueP =='Fail'
'可能解严重不适应方程,请重新开始'
return%结束程序
end
%%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
%fa=bin2dec(fatherChromosomeGroup)%显示父染色体
%从父染体中选择优秀染色体
%selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);
%%%%%%%%%%%%%%%8:染色体杂交(关键步骤)
%sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)
%用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体
%sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);
%不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的
sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);
%sonChromosomeGroup=immunity(fatherChromosomeGroup,holdBestChromosome,3);
%把疫苗接种到其它染色体中
sonChromosomeGroup=immunity(sonChromosomeGroup,holdBestChromosome,3);
%cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体
sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界
%%%%%%%%%%%%%%%9:变异
%不杂交直接变异
%fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);
%杂交后变异
fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.5,solutionN);
fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);%检查变异后的染色体是否越界
end

 

接种疫苗函数,这是和遗传算法唯一不同的函数,可以用它代替染色体的交叉操作。

%chromosomeGroup:染色体组
%bachterinChromosome:疫苗染色体,即最好的染色体。从这个染色体上取疫苗
%parameter:接种疫苗的参数,即用什么方法接种
%inoculateChromosome:接种疫苗后的染色体
function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter)
[chromosomeGroupSum,chromosomeLength]=size(chromosomeGroup);
[row,bacterinChromosomeLength]=size(bacterinChromosome);
%chromosomeGroupSum:染色体的条数;chromosomeLength:染色体的长度
switch parameter
case 1%随机选择染色体进行接种
for i=1:chromosomeGroupSum
%%%%%%%%%%%%从疫苗染色体上定位疫苗
headDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上左边的点位
if headDot==0%防止出现0点位
headDot=1;
end
tailDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上右边的点位
if tailDot==0%防止出现0点位
tailDot=1;
end
if tailDot>headDot%防止右边的点位大于左边的点位
dot=headDot;
headDot=tailDot;
tailDot=dot;
end
%%%%%%%%%%%%%接种
randChromosomeSequence=round(rand(1)*chromosomeGroupSum);
%随机产生1条染色体的序号,对这条染色体进行接种
if randChromosomeSequence==0%防止产生0序号
randChromosomeSequence=1;
end
inoculateChromosome(i,:)...%先把输入染色体传给输出
=chromosomeGroup(randChromosomeSequence,:);
%执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
inoculateChromosome(i,headDot:tailDot)...
=bacterinChromosome(1,headDot:tailDot);
end
case 2 %所有染色体挨个接种
for i=1:chromosomeGroupSum
%%%%%%%%%%%%从疫苗染色体上定位疫苗
headDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上左边的点位
if headDot==0%防止出现0点位
headDot=1;
end
tailDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上右边的点位
if tailDot==0%防止出现0点位
tailDot=1;
end
if tailDot>headDot%防止右边的点位大于左边的点位
dot=headDot;
headDot=tailDot;
tailDot=dot;
end
%%%%%%%%%%%%%接种
inoculateChromosome(i,:)=chromosomeGroup(i,:);%先把输入染色体传给输出
%执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
inoculateChromosome(i,headDot:tailDot)...
=bacterinChromosome(1,headDot:tailDot);
end
case 3 %接种位置是随机的
for i=1:chromosomeGroupSum
%%%%%%%%%%%%从疫苗染色体上定位疫苗
headDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上左边的点位
if headDot==0%防止出现0点位
headDot=1;
end
tailDot=fix(rand(1)*bacterinChromosomeLength);
%疫苗在染色体上右边的点位
if tailDot==0%防止出现0点位
tailDot=1;
end
if tailDot>headDot%防止右边的点位大于左边的点位
dot=headDot;
headDot=tailDot;
tailDot=dot;
end
%%%%%%%%%%%%%在染色体上随机定位接种位置
inoculateDot=fix(rand(1)*chromosomeLength);%随机选择染色体的接种点位
if inoculateDot==0
inoculateDot=1;
inoculateChromosome(i,:)=chromosomeGroup(i,:);
inoculateChromosome(i,inoculateDot:tailDot-headDot+1)...
=bacterinChromosome(1,headDot:tailDot);
elseif inoculateDot<=headDot
inoculateChromosome(i,:)=chromosomeGroup(i,:);
inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
=bacterinChromosome(1,headDot:tailDot);
elseif (chromosomeLength-inoculateDot)>=(tailDot-headDot)
inoculateChromosome(i,:)=chromosomeGroup(i,:);
inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
=bacterinChromosome(1,headDot:tailDot);
else
inoculateChromosome(i,:)=chromosomeGroup(i,:);
inoculateChromosome(i,headDot:tailDot)...
=bacterinChromosome(1,headDot:tailDot);
end
end
end
iwalk 2008-11-16
  • 打赏
  • 举报
回复
学习
加载更多回复(50)
作者:July、阿财。 时间:二零一一年十月十三日。 ------------------------------ 无私分享造就开源的辉煌。 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一周年之际,特此分享出微软面试 全部100题答案的完整版,以作为对本博客所有读者的回馈。 一年之前的10月14日,一个名叫July 的人在一个叫csdn 的论坛上开帖分享微软等公司数据结构+算法 面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法 算法之道的编程面试与算法研究并重的博客,如今,此博客影响力逐步渗透到海外,及至到整个互联网。 在此之前,由于本人笨拙,这微软面试100题的答案只整理到了前60题(第1-60题答案可到本人资源下 载处下载:http://v_july_v.download.csdn.net/),故此,常有朋友留言或来信询问后面40题的答案。只是 因个人认为:一、答案只是作为一个参考,不可太过依赖;二、常常因一些事情耽搁(如在整理最新的今年 九月、十月份的面试题:九月腾讯,创新工场,淘宝等公司最新面试十三题、十月百度,阿里巴巴,迅雷搜狗 最新面试十一题);三、个人正在针对那100题一题一题的写文章,多种思路,不断优化,即成程序员编程 艺术系列。自此,后面40题的答案迟迟未得整理。且个人已经整理的前60题的答案,在我看来,是有诸多问 题与弊端的,甚至很多答案都是错误的。 互联网总是能给人带来惊喜。前几日,一位现居美国加州的名叫阿财的朋友发来一封邮件,并把他自己 做的全部100题的答案一并发予给我,自此,便似遇见了知己。十分感谢。 任何东西只有分享出来才更显其价值。本只需贴出后面40题的答案,因为前60题的答案本人早已整理上 传至网上,但多一种思路多一种参考亦未尝不可。特此,把阿财的答案再稍加整理番,然后把全部100题的答 案现今都贴出来。若有任何问题,欢迎不吝指正。谢谢。 上千上万的人都关注过此100题,且大都都各自贡献了自己的思路,或回复于微软100题维护地址上,或 回复于本博客内,人数众多,无法一一标明,特此向他们诸位表示敬意和感谢。谢谢大家,诸君的努力足以影 响整个互联网,咱们已经迎来一个分享互利的新时代。 感谢诸君,请享用.....

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧