Ruby实现求数组内相邻元素的最大和-《编程珠玑》问题求解

Ruby实现求数组内相邻元素的最大和

魏仁言 2010.8.21

最近在学习《编程珠玑》,对书里提出的问题很感兴趣,所以按照书中的描述,用Ruby实现其中相关问题的解决方法,今天学习的问题如下:

该问题为《编程珠玑》第8章的问题,问题描述:输入一个具有n个浮点数字的向量x,请输出在输入的任何相邻子向量中找出的最大和。当所有的输入都是负数时,最大总和子向量是空向量,空向量的总和为0;如果所有输入为正数时,最大子向量是整个输入向量。简单地说,就是给定一个元素个数为n的数组a,求数组内相邻元素的最大和?

例子:

   数组:int a[10] =[31,-41,59,26,-53,58,97,-93,-23,84]

   结果:相邻元素最大和是 a[2..6]=187

 

下面给出三种算法,来实现求解,每种算法的性能有很大区别,请参考学习每种算法的优劣。

 

require "time" a=[31,-41,59,26,-53,58,97,-93,-23,84] b=a[2..6] sum=0 puts a.join(" ") puts b.join(" ") b.each do |i| sum +=i end puts sum n=1000 #生成数组数值 for i in 0..n if i%3==0 && i%2==0 a[i]=-rand(100) elsif i%4==0 && i%5==0 a[i]=-rand(100) a[i-1]=-a[i-1] else a[i]=rand(100) end end puts a.join(" ") #第一种算法,其性能为O(n*n*n) maxsofar=0 puts "First:" start=Time.now puts "Start...#{start}" for i in 0..n-1 #puts a[i] for j in i..n-1 sum=0 #puts a[j] for k in i..j sum +=a[k] end if sum>maxsofar maxsofar=sum #puts "a[#{i}..#{j}]=#{maxsofar}" end end end puts maxsofar ed= Time.now cs=ed-start puts "End...#{ed}" puts "Consnum..#{cs}s /n/n" #第二种算法,其性能为O(n*n) puts "Second:" maxsofar=0 start=Time.now puts "Start...#{start}" for i in 0..n-1 #puts a[i] sum=0 for j in i..n-1 sum +=a[j] if sum>maxsofar maxsofar=sum #puts "a[#{i}..#{j}]=#{maxsofar}" end end end puts maxsofar ed= Time.now cs=ed-start puts "End...#{ed}" puts "Consnum..#{cs}s /n/n" #第三种算法,其性能为O(n) maxsofar=0 maxendinghere=0 puts "Third:" start=Time.now puts "Start...#{start}" for i in 0..n-1 if (maxendinghere+a[i])>0 maxendinghere= (maxendinghere+a[i]) else maxendinghere=0 end if maxendinghere>maxsofar maxsofar=maxendinghere #puts "a[#{i}..#{j}]=#{maxsofar}" end end puts maxsofar ed= Time.now cs=ed-start puts "End...#{ed}" puts "Consnum..#{cs}s"

 

注:如需转载,请注明出处,谢谢!

http://blog.csdn.net/savechina

 

 

你可能感兴趣的:(Ruby实现求数组内相邻元素的最大和-《编程珠玑》问题求解)