从高斯数列谈代码效率

  很多有关编程的书上说过,算法的高速与代码的短小往往是不可兼得的;特别是在当前的硬件环境(高速的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;
  }
  本文纯属个人意见,仅供参考。:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是从高斯噪声采样的 Python 代码: import numpy as np def gaussian_noise(mu, sigma, size): return np.random.normal(mu, sigma, size) 其中,mu 表示高斯分布的均值,sigma 表示高斯分布的标准差,size 表示采样的样本数。 ### 回答2: 下面是一个使用Python生成高斯噪声采样的示例代码: ```python import numpy as np def generate_gaussian_noise(mean, std, size): noise = np.random.normal(mean, std, size) return noise mean = 0 # 噪声的均值 std = 1 # 噪声的标准差 size = 100 # 生成噪声样本的数量 noise_samples = generate_gaussian_noise(mean, std, size) print(noise_samples) ``` 这个代码通过使用numpy库中的`np.random.normal()`函数来生成指定数量的高斯噪声样本。`mean`参数表示噪声的均值,`std`参数表示噪声的标准差,`size`参数表示要生成的噪声样本的数量。 代码首先定义了`generate_gaussian_noise()`函数,该函数接受三个参数:均值、标准差和样本数量。在函数内部,使用`np.random.normal()`函数生成具有给定均值和标准差的噪声样本,然后将噪声样本返回。 在主程序中,我们定义了噪声的均值为0,标准差为1,生成100个噪声样本。然后调用`generate_gaussian_noise()`函数,将生成的噪声样本保存在`noise_samples`中,并打印输出结果。 运行以上代码,将会得到一个包含100个高斯噪声样本的数组。输出结果类似于`[ 0.13459221, -0.87654321, 1.23456789, ...]`。具体的数值可能会略有差异,因为每次运行代码时生成的噪声样本是随机的。 ### 回答3: 高斯噪声是指服从高斯分布的随机噪声,也称为正态分布或钟形曲线。在Python中,我们可以使用NumPy库中的random模块来生成服从高斯分布的随机样本。 下面是一个简单的Python代码示例,用于从高斯噪声中采样: ```python import numpy as np # 设置随机种子,以确保生成的随机数是可复现的 np.random.seed(0) # 定义均值和标准差 mean = 0 # 均值 std = 1 # 标准差 # 生成高斯噪声样本 samples = np.random.normal(mean, std, 300) print(samples) ``` 这段代码中,首先导入了NumPy库,并设置了随机种子为0。然后定义了均值和标准差,这里的均值为0,标准差为1,表示生成的噪声样本在均值为0、标准差为1的正态分布中。最后使用`np.random.normal()`函数生成300个服从高斯分布的随机样本,并将结果打印输出。 运行以上代码,你将得到一个包含300个随机样本的NumPy数组。这些样本将服从均值为0、标准差为1的高斯分布。 你也可以根据需要,调整均值和标准差的值,以生成符合特定要求的高斯噪声样本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值