从高斯数列谈代码效率

原创 2002年04月30日 09:10:00
  很多有关编程的书上说过,算法的高速与代码的短小往往是不可兼得的;特别是在当前的硬件环境(高速的CPU与大容量的硬盘)下,不必计较算法是否既是最快的又是最短的,一般来说,能达到二者之一就行了。然而我认为,在某些情况下,鱼与熊掌是可以兼得的——只需在算法中做一点人为的“手脚”。以下我将用一个简单的例子来谈这个问题,但我的前提是我决不使用那种spaghetti式的算法,即使能够获得高效的代码。
  例:求1+2+3+……+100。
  解1:用for循环来求(用C++来实现算法,下同)。
  #include<iostream.h>
  void main()
  {
   int i,sum=0;
   for(i=1;i<=100;i++)sum+=i;
   cout<<"sum="<<sum<<endl;
   return;
  }
  解2:用递归来求。
  #include<iostream.h>
  int getsum(int);
  void main()
  {
   int sum=getsum(100);
   cout<<"sum="<<sum<<endl;
   return;
  }
  int getsum(int x);
  {
   if(x==1)return(1);
   else return(x+getsum(x-1));
  }
  很明显,以上两种算法中解2的效率较低,因为在递归中消耗了太多的系统资源。解1的效率确实很高,然而我要告诉你,它并不是效率最高的算法!现在请看我的代码,是我从一本入门级的教材上得到的灵感:
  #include<iostream.h>
  void main()
  {
   int sum=(1+100)*100/2;
   cout<<"sum="<<sum<<endl;
   return;
  }
  是的,这是高斯求和公式。但你看了这样的“算法”,也许会很不舒服,并告诉我:这不能算做一个好的算法,因为它没有体现出计算机的优越性。没错,你说得很对,那本教材举的这个例子也正是反例,并且不提倡这样编程,理由正如你所说的一样。
  但是,不管你乐意不乐意,你都必须承认:这段代码是合法的,并且它不是spaghetti,可读性也很强;最重要的一点是它的效率非常高——它没有做100次循环,只做了三步运算,而且还节省出了一个变量(i)的存储单元。
  教材是教材,编程是编程。教材的目的是让你设计出如何让计算机做更多工作的算法,而你甚至可以连高斯求和公式都不必知道,只让计算机不厌其烦地循环100次;编程的目的是以尽可能高效的算法得到正确答案,而不必计较应该采用循环还是高斯求和公式。然而两者又不能完全分离:如果一个程序员只注重前者,那么他的代码难免冗长或低速;如果他一味追求后者,那么他难免写出没几人看懂的高效spaghetti。
  我想谈的东西到此为止。总之在程序的设计中,在特定的情况下,完全可以采用类似的方法来提高效率,这没有什么不好——毕竟,程序是用来求解的,而不是用来体现计算机的优越性的。从这里说开去,如果让你设计一个程序,打印1~100的素数,你如何处理“2”呢?
  当然,如果针对本例(高斯数列)而言,最高效的代码应该如下:
  #include<iostream.h>
  void main()
  {
   cout<<"sum="<<5050<<endl;
   return;
  }
  本文纯属个人意见,仅供参考。:)

【算法】斐波那契数列的效率问题

点击这个链接:(斐波那契数列)是在数学中非常有名的一个数列形式,无论是数学界还是编程圈无不在拿它讲解递归调用的思想,数学公式如下:                                  ...
  • u013047584
  • u013047584
  • 2017年03月14日 15:08
  • 690

裴波那契数列的递归实现与非递归实现

斐波那契数列是数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1]  )以兔子繁殖为例子而引入,也称为“兔子数列”。 指的是这样一个数列:0、1、1、2、3、5、8、13、21、3...
  • wangshuang1631
  • wangshuang1631
  • 2016年08月12日 10:22
  • 2758

matlab中fspecial中生成高斯模板的解释以及c语言实现

下面这个函数是模拟fspecial中的生成高斯模板的函数。 function h=makefilter(size,sigma)   %size为模板大小   %sigma为标...
  • yansmile1
  • yansmile1
  • 2015年05月30日 20:42
  • 843

再谈 内存对齐补齐--提高cpu检索周期效率

首先我们先看看下面的C语言的结构体: [cpp] view plain copy   typedef struct MemAlign   {   ...
  • vevenlcf
  • vevenlcf
  • 2016年06月30日 15:13
  • 554

高斯滤波及canny边缘检测代码实现

最近这两天在看canny边缘检测,看到opencv的源码就头大,最后参考诸位大神原理解析,自己实现了一个canny边缘检测。现在写下来和大家分享,自己顺便做个笔记。 首先列举一下大神的帖子: Cann...
  • chengkun183
  • chengkun183
  • 2015年03月19日 21:15
  • 2522

【递归算法】 斐波那契数列的备忘录优化

递归算法之斐波那契数列的优化闲来无事尝试了一下斐波那契的递归算法
  • hsgwpj
  • hsgwpj
  • 2016年04月09日 00:22
  • 1130

单高斯背景建模原理及代码实现

高斯分布与背景建模的关系:图像中每一个像素点的颜色值作为一个随机过程X,并假设该点的像素值出现的概率服从高斯分布。令I(x,y,t)表示像素点(x,y,t)在t时刻的像素值,则有: 其中和分别...
  • zhengtu009
  • zhengtu009
  • 2014年06月08日 15:33
  • 1299

高斯混合模型之代码实现

高斯混合模型的代码s
  • u014019842
  • u014019842
  • 2014年09月06日 09:23
  • 2780

实现斐波那契数列的三种方法

斐波那契数列又称黄金分割数列。它的特点是从第3个数开始,每一个数都等于前面两个数相加。 例:0   1   1   2   3   5   8   13   21.。。。。。 从上我们可以总结出以下规...
  • LLZK_
  • LLZK_
  • 2016年09月06日 16:53
  • 1793

c++版本的高斯混合模型的源代码完全注释

之前看到过C版本的,感觉写的很长,没有仔细看,但是C++版本的写的还是很不错的。我仔细看了一下,并对内容进行了仔细的注释,如果有人没有看懂,欢迎留言讨论。先看一眼头文件,在background_seg...
  • Armily
  • Armily
  • 2013年05月09日 22:26
  • 1941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从高斯数列谈代码效率
举报原因:
原因补充:

(最多只允许输入30个字)