﻿<?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>C++博客-Beyond Anything!-文章分类-Arithmetic</title><link>http://www.cppblog.com/msopengl/category/15595.html</link><description>细微决定成败</description><language>zh-cn</language><lastBuildDate>Fri, 09 Sep 2011 14:22:17 GMT</lastBuildDate><pubDate>Fri, 09 Sep 2011 14:22:17 GMT</pubDate><ttl>60</ttl><item><title>程序员须知的二十世纪最伟大10大算法</title><link>http://www.cppblog.com/msopengl/articles/141393.html</link><dc:creator>Skill</dc:creator><author>Skill</author><pubDate>Wed, 09 Mar 2011 01:07:00 GMT</pubDate><guid>http://www.cppblog.com/msopengl/articles/141393.html</guid><wfw:comment>http://www.cppblog.com/msopengl/comments/141393.html</wfw:comment><comments>http://www.cppblog.com/msopengl/articles/141393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/msopengl/comments/commentRss/141393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/msopengl/services/trackbacks/141393.html</trackback:ping><description><![CDATA[
		<div class="con">
				<ul>
						<li>
								<h1>程序员须知的二十世纪最伟大10大算法</h1>
						</li>
						<li class="msg">
								<span>
										<a href="http://developer.51cto.com/">http://developer.51cto.com</a>   2011-01-13 09:40   v_JULY_v   CSDN博客   <a href="http://www.51cto.com/php/feedbackt.php?id=242902">我要评论(<span id="pinglun_1">1</span>)</a></span>
						</li>
				</ul>
		</div>
		<div class="sum">
				<ul class="summary">算法是程序员的根本，虽然下面介绍的十大算法有数学的成分，但确实是程序员须知的10大算法。</ul>
		</div>
		<p>发明十大算法的其中几位算法大师</p>
		<p style="padding-left: 30px;">
				<img class="fit-image" alt="" src="http://images.51cto.com/files/uploadimg/20110113/0942360.jpg" width="498" height="242" />
		</p>
		<p>
				<strong>一、1946 蒙特卡洛方法</strong>
		</p>
		<p>[1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the 
Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also
 known as the Monte Carlo method.]</p>
		<p>1946年，美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis</p>
		<p>共同发明，被称为蒙特卡洛方法。</p>
		<p>它的具体定义是：</p>
		<p>在广场上画一个边长一米的正方形，在正方形内部随意用粉笔画一个不规则的形状，</p>
		<p>现在要计算这个不规则图形的面积，怎么计算列?</p>
		<p>蒙特卡洛(Monte Carlo)方法告诉我们，均匀的向该正方形内撒N（N 是一个很大的自然数）个黄豆，随后数数有多少个黄豆在这个不规则几何形状内部，比如说有M个，<br />
那么，这个奇怪形状的面积便近似于M/N，N越大，算出来的值便越精确。在这里我们要假定豆子都在一个平面上，相互之间没有重叠。</p>
		<p>蒙特卡洛方法可用于近似计算圆周率：让计算机每次随机生成两个0到1之间的数，看这两个实数是否在单位圆内。生成一系列随机点，统计单位圆内的点数
与总点数，（圆面积和正方形面积之比为PI:1，PI为圆周率），当随机点取得越多（但即使取10的9次方个随机点时，其结果也仅在前4位与圆周率吻合）
时，其结果越接近于圆周率。</p>
		<p>
				<strong>二、1947 单纯形法</strong>
		</p>
		<p>[1947: George Dantzig, at the RAND Corporation, creates the simplex method for linear programming.]</p>
		<p>1947年，兰德公司的，Grorge 
Dantzig，发明了单纯形方法。单纯形法，此后成为了线性规划学科的重要基石。所谓线性规划，简单的说，就是给定一组线性（所有变量都是一次幂）约束
条件（例如a1*x1+b1*x2+c1*x3&gt;0)，求一个给定的目标函数的极值。</p>
		<p>这么说似乎也太太太抽象了，但在现实中能派上用场的例子可不罕见——比如对于一个公司而言，其能够投入生产的人力物力有限（“线性约束条件”），而
公司的目标是利润最大化（“目标函数取最大值”），看，线性规划并不抽象吧！线性规划作为运筹学(operation 
research)的一部分，成为管理科学领域的一种重要工具。而Dantzig提出的单纯形法便是求解类似线性规划问题的一个极其有效的方法。</p>
		<p>
				<strong>三、1950 Krylov子空间迭代法</strong>
		</p>
		<p>[1950: Magnus Hestenes, Eduard Stiefel, and Cornelius Lanczos, all 
from the Institute for Numerical Analysis at the National Bureau of 
Standards, initiate the development of Krylov subspace iteration 
methods.]</p>
		<p>1950年：美国国家标准局数值分析研究所的，马格努斯Hestenes，爱德华施蒂费尔和科尼利厄斯的Lanczos，发明了Krylov子空间
迭代法。Krylov子空间迭代法是用来求解形如Ax=b 的方程，A是一个n*n 
的矩阵，当n充分大时，直接计算变得非常困难，而Krylov方法则巧妙地将其变为Kxi+1=Kxi+b-Axi的迭代形式来求解。这里的K(来源于作
者俄国人Nikolai 
Krylov姓氏的首字母)是一个构造出来的接近于A的矩阵，而迭代形式的算法的妙处在于，它将复杂问题化简为阶段性的易于计算的子步骤。</p>
		<p>
				<strong>四、1951 矩阵计算的分解方法</strong>
		</p>
		<p>[1951: Alston Householder of Oak Ridge National Laboratory formalizes the decompositional approach to matrix computations.]</p>
		<p>1951年，阿尔斯通橡树岭国家实验室的Alston Householder提出，矩阵计算的分解方法。这个算法证明了任何矩阵都可以分解为三角、对角、正交和其他特殊形式的矩阵，该算法的意义使得开发灵活的矩阵计算软件包成为可能。</p>
		<p>
				<strong>五、1957 优化的Fortran编译器</strong>
		</p>
		<p>[1957: John Backus leads a team at IBM in developing the Fortran optimizing compiler.]</p>
		<p>1957年：约翰巴库斯领导开发的IBM的团队，创造了Fortran优化编译器。Fortran，亦译为福传，是由Formula 
Translation两个字所组合而成，意思是“公式翻译”。它是世界上第一个被正式采用并流传至今的高级编程语言。这个语言现在，已经发展到
了，Fortran 2008，并为人们所熟知。</p>
		<p>
				<strong>六、1959-61 计算矩阵特征值的QR算法</strong>
		</p>
		<p>[1959–61: J.G.F. Francis of Ferranti Ltd, London, finds a stable method for computing eigenvalues, known as the QR algorithm.]</p>
		<p>1959-61：伦敦费伦蒂有限公司的J.G.F. 
Francis，找到了一种稳定的特征值的计算方法，这就是著名的QR算法。这也是一个和线性代数有关的算法，学过线性代数的应该记得“矩阵的特征值”，
计算特征值是矩阵计算的最核心内容之一，传统的求解方案涉及到高次方程求根，当问题规模大的时候十分困难。QR算法把矩阵分解成一个正交矩阵(希望读此文
的你，知道什么是正交矩阵。:D。)与一个上三角矩阵的积，和前面提到的Krylov 
方法类似，这又是一个迭代算法，它把复杂的高次方程求根问题化简为阶段性的易于计算的子步骤，使得用计算机求解大规模矩阵特征值成为可能。这个算法的作者
是来自英国伦敦的J.G.F. Francis。</p>
		<p>
				<strong>七、1962 快速排序算法</strong>
		</p>
		<p>[1962: Tony Hoare of Elliott Brothers, Ltd., London, presents Quicksort.]</p>
		<p>1962年：伦敦的，托尼埃利奥特兄弟有限公司，霍尔提出了快速排序。哈哈，恭喜你，终于看到了可能是你第一个比较熟悉的算法~。快速排序算法作为
排序算法中的经典算法，它被应用的影子随处可见。快速排序算法最早由Tony 
Hoare爵士设计，它的基本思想是将待排序列分为两半，左边的一半总是“小的”，右边的一半总是“大的”，这一过程不断递归持续下去，直到整个序列有
序。说起这位Tony Hoare爵士，快速排序算法其实只是他不经意间的小小发现而已，他对于计算机贡献主要包括形式化方法理论，以及ALGOL60 
编程语言的发明等，他也因这些成就获得1980 年图灵奖。</p>
		<p>========</p>
		<p>关于快速排序算法的具体认识与应用，可参考我写的一篇文章，</p>
		<p>精通八大排序算法系列、一、快速排序算法：</p>
		<p>http://blog.csdn.net/v_JULY_v/archive/2011/01/04/6116297.aspx</p>
		<p>------------------------------------------------------------</p>
		<p>快速排序的平均时间复杂度仅仅为O(Nlog(N))，相比于普通选择排序和冒泡排序等而言，</p>
		<p>实在是历史性的创举。</p>
		<p>
				<strong>八、1965 快速傅立叶变换</strong>
		</p>
		<p>[1965: James Cooley of the IBM T.J. Watson Research Center and John 
Tukey of Princeton University and AT&amp;T Bell Laboratories unveil the 
fast Fourier transform.]</p>
		<p>1965年：IBM 华生研究院的James Cooley，和普林斯顿大学的John 
Tukey，AT＆T贝尔实验室共同推出了快速傅立叶变换。快速傅立叶算法是离散傅立叶算法（这可是数字信号处理的基石）的一种快速算法，其时间复杂度仅
为O(Nlog(N))；比时间效率更为重要的是，快速傅立叶算法非常容易用硬件实现，因此它在电子技术领域得到极其广泛的应用。日后，我会在我的经典算
法研究系列，着重阐述此算法。</p>
		<p>
				<strong>九、1977 整数关系探测算法</strong>
		</p>
		<p>[1977: Helaman Ferguson and Rodney Forcade of Brigham Young University advance an integerrelation detection algorithm.]</p>
		<p>1977年：Helaman Ferguson和 伯明翰大学的Rodney 
Forcade，提出了Forcade检测算法的整数关系。整数关系探测是个古老的问题，其历史甚至可以追溯到欧几里德的时代。具体的说:给定—组实数
X1,X2,...,Xn，是否存在不全为零的整数a1,a2,...an，使得:a1 x 1 +a2 x2 + . . . + an x n 
＝0?</p>
		<p>这一年BrighamYoung大学的Helaman Ferguson 和Rodney Forcade解决了这一问题。该算法应用于“简化量子场论中的Feynman图的计算”。ok，它并不要你懂，了解即可。</p>
		<p>
				<strong>十、1987 快速多极算法</strong>
		</p>
		<p>[1987: Leslie Greengard and Vladimir Rokhlin of Yale University invent the fast multipolealgorithm.]</p>
		<p>1987年：莱斯利的Greengard，和耶鲁大学的Rokhlin发明了快速多极算法。</p>
		<p>此快速多极算法用来计算“经由引力或静电力相互作用的N 个粒子运动的精确计算——例如银河系中的星体，或者蛋白质中的原子间的相互作用”。ok，了解即可。 </p>
		<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6127953.aspx</p>
<img src ="http://www.cppblog.com/msopengl/aggbug/141393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/msopengl/" target="_blank">Skill</a> 2011-03-09 09:07 <a href="http://www.cppblog.com/msopengl/articles/141393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树的实现</title><link>http://www.cppblog.com/msopengl/articles/135563.html</link><dc:creator>Skill</dc:creator><author>Skill</author><pubDate>Mon, 06 Dec 2010 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/msopengl/articles/135563.html</guid><wfw:comment>http://www.cppblog.com/msopengl/comments/135563.html</wfw:comment><comments>http://www.cppblog.com/msopengl/articles/135563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/msopengl/comments/commentRss/135563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/msopengl/services/trackbacks/135563.html</trackback:ping><description><![CDATA[<pre>//二叉树的建立、存储与遍历<br>#include &lt;iostream.h&gt;<br>struct BintrNode<br>{<br>    char value;<br>    BintrNode* lf;<br>    BintrNode* rt;<br>};<br><br> void init(BintrNode* &amp;p)<br>{<br>    char ch;<br>    cin&gt;&gt;ch;<br>    if(ch!='!')<br>    {<br>    p=new BintrNode;<br>    p-&gt;value=ch;<br>    init(p-&gt;lf);<br>    init(p-&gt;rt);<br>    }<br>    else <br>    {<br>        p=NULL;<br>    }<br>}<br> void pre(BintrNode* p)<br> {<br>     if(p)<br>     {<br>            cout&lt;&lt;p-&gt;value;<br>            pre(p-&gt;lf);<br>            pre(p-&gt;rt);<br>     }<br> }<br> void ino(BintrNode* p)<br> {<br>    if(p)<br>    {<br>     ino(p-&gt;lf);<br>     cout&lt;&lt;p-&gt;value;<br>     ino(p-&gt;rt);<br>    }<br> }<br>  void pro(BintrNode* p)<br> {<br>     if(p)<br>     {<br>     pro(p-&gt;lf);<br>     pro(p-&gt;rt);<br>     cout&lt;&lt;p-&gt;value;<br>     }<br> }<br> void main()<br> {<br>BintrNode* bt;<br>init(bt);<br>pre(bt);<br>cout&lt;&lt;endl;<br>ino(bt);<br>cout&lt;&lt;endl;<br>pro(bt);<br>cout&lt;&lt;endl;<br><br> }<br><br>
<pre>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>struct node<br>{<br>	int data;<br>	struct node *lh,*rh;<br>	int ltag,rtag;<br>}*pr,*t,*s[30];<br><br>struct node* creat()<br>{<br>	struct node *t,*q;<br>	int i,x,j;<br>	printf("i,x=");<br>	scanf("%d%d",&amp;i,&amp;x);<br>	while((i!=0)&amp;&amp;(x!=0))<br>	{<br>		q=(struct node *)malloc(sizeof(struct node));<br>		q-&gt;data=x;<br>		q-&gt;lh=NULL;<br>		q-&gt;rh=NULL;<br>		s[i ]=q;<br>		if(i==1)<br>			t=q;<br>		else<br>		{<br>			j=i/2;<br>			if((i%2)==0)<br>				s[j]-&gt;lh=q;<br>			else<br>				s[j]-&gt;rh=q;<br>		}<br>		printf("i,x=");<br>		scanf("%d%d",&amp;i,&amp;x);<br>	}<br>	return(t);<br>}<br><br>/*void inthread(struct node *p) //递归算法<br>{<br>	if(p!=NULL)<br>	{<br>		inthread(p-&gt;lh);<br>		printf("%6d\t",p-&gt;data);<br>		if(p-&gt;lh!=NULL)<br>			p-&gt;ltag=0;<br>		else<br>		{<br>			p-&gt;ltag=1;<br>			p-&gt;lh=pr;<br>		} //建立P节点的左线索，指向前趋节点PR<br>		if(pr!=NULL)<br>		{<br>			if(pr-&gt;rh!=NULL)<br>				pr-&gt;rtag=0;<br>			else<br>			{<br>				pr-&gt;rtag=1;<br>				pr-&gt;rh=p;<br>			}//前趋节点PR建立左线索，指向节点P<br>		}<br>		pr=p;//pr跟上p,以便p向后移动<br>		inthread(p-&gt;rh);<br>	}<br>}*/<br><br>void inthread(struct node *t)//非递归算法<br>{<br>	int top,bools;<br>	struct node *p;<br>	pr=NULL;p=t;top=0;bools=1;<br>	do{<br>		while(p!=NULL)<br>		{<br>			top++;<br>			s[top]=p;<br>			p=p-&gt;lh;<br>		}<br>		if(top==0)bools=0;<br>		else<br>		{<br>			p=s[top];<br>			top--;<br>			printf("%6d",p-&gt;data);<br>			if(p-&gt;lh!=NULL)<br>				p-&gt;ltag=0;<br>			else<br>			{<br>				p-&gt;ltag=1;<br>				p-&gt;lh=pr;<br>			} //建立P节点的左线索，指向前趋节点PR<br>			if(pr!=NULL)<br>			{<br>				if(pr-&gt;rh!=NULL)<br>					pr-&gt;rtag=0;<br>				else<br>				{<br>					pr-&gt;rtag=1;<br>					pr-&gt;rh=p;<br>				}//前趋节点PR建立左线索，指向节点P<br>			}<br>			pr=p;//pr跟上p,以便p向后移动<br>			p=p-&gt;rh;<br>		}//END else<br>	}while(bools);<br>	pr-&gt;rh=NULL;<br>}<br><br>main()<br>{<br>	pr=NULL;<br>	t=creat();<br>	inthread(t);<br>	pr-&gt;rh=NULL;<br>}<br><br>
<pre>#include&lt;stdio.h&gt;<br>#include&lt;malloc.h&gt;<br>#include&lt;iostream&gt;<br><br>//定义节点 <br>typedef struct BiNode{<br>        char data;<br>        struct BiNode *lch;<br>        struct BiNode *rch;<br>}BiNode,*BiTree;<br><br>//先序拓展序列建立二叉树 <br>void Create(BiTree &amp;T)<br>{<br>        T =(BiNode*) malloc (sizeof(BiNode));<br>        <br>        printf("Enter the data \n");<br>        scanf(" %c",&amp;T-&gt;data);<br>        if(T-&gt;data=='#') T = NULL;<br>        if(T){<br>                printf("");<br>                Create(T-&gt;lch);<br>                Create(T-&gt;rch);<br>        }<br>}<br><br>//先序遍历 (递归)<br>void Preorder (BiTree T)<br>{                    <br>   if (T) {<br>      printf(" %c",T-&gt;data);             // 访问根结点<br>      <br>      Preorder(T-&gt;lch); // 遍历左子树<br>      Preorder(T-&gt;rch);// 遍历右子树<br>   }<br>}<br><br>//中序遍历 （递归）<br>void Inorder (BiTree T)<br>{<br>     if(T) {<br>       Inorder(T-&gt;lch);<br>       <br>       printf(" %c",T-&gt;data);<br>       <br>       Inorder(T-&gt;rch);    <br>       }<br>} <br><br>//后序遍历 （递归）<br>void Postorder (BiTree T)<br>{<br>     if(T) {<br>       Postorder(T-&gt;lch);<br>       Postorder(T-&gt;rch);<br>       <br>       printf(" %c",T-&gt;data); <br>     }<br>} <br><br>int main()<br>{<br>    //建树 <br>    printf("The fuction Create() is called.\n");<br>    BiTree T;<br>    Create(T);<br>    <br>    //三种遍历递归算法 <br>    printf("\n");    <br>    printf("The fuction Preorder() is called.\n");<br>    Preorder(T);<br>    <br>    printf("\n");<br>    printf("The fuction Inorder() is called.\n");<br>    Inorder(T);<br>    <br>    printf("\n");<br>    printf("The fuction Postorder() is called.\n");<br>    Postorder(T);<br>    <br>    <br>    printf("\n");<br>    system("pause");<br>    <br>}<br></pre>
<br></pre>
<br><br></pre>
<br><img src ="http://www.cppblog.com/msopengl/aggbug/135563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/msopengl/" target="_blank">Skill</a> 2010-12-06 11:03 <a href="http://www.cppblog.com/msopengl/articles/135563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>