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"<br />a=[31,-41,59,26,-53,58,97,-93,-23,84]<br />b=a[2..6]<br />sum=0<br />puts a.join(" ")<br />puts b.join(" ")<br />b.each do |i|<br />sum +=i<br />end<br />puts sum<br />n=1000<br />#產生數組數值<br />for i in 0..n<br />if i%3==0 && i%2==0<br />a[i]=-rand(100)<br />elsif i%4==0 && i%5==0<br />a[i]=-rand(100)<br />a[i-1]=-a[i-1]<br />else<br />a[i]=rand(100)<br />end</p><p>end<br />puts a.join(" ")<br />#第一種演算法,其效能為O(n*n*n)<br />maxsofar=0<br />puts "First:"<br />start=Time.now<br />puts "Start...#{start}"<br />for i in 0..n-1<br />#puts a[i]<br />for j in i..n-1<br />sum=0<br />#puts a[j]<br />for k in i..j<br />sum +=a[k]<br />end</p><p>if sum>maxsofar<br />maxsofar=sum<br />#puts "a[#{i}..#{j}]=#{maxsofar}"<br />end<br />end<br />end<br />puts maxsofar<br />ed= Time.now<br />cs=ed-start<br />puts "End...#{ed}"<br />puts "Consnum..#{cs}s /n/n"</p><p>#第二種演算法,其效能為O(n*n)<br />puts "Second:"<br />maxsofar=0<br />start=Time.now<br />puts "Start...#{start}"<br />for i in 0..n-1<br />#puts a[i]<br />sum=0<br />for j in i..n-1<br />sum +=a[j]<br />if sum>maxsofar<br />maxsofar=sum<br />#puts "a[#{i}..#{j}]=#{maxsofar}"<br />end<br />end<br />end<br />puts maxsofar<br />ed= Time.now<br />cs=ed-start<br />puts "End...#{ed}"<br />puts "Consnum..#{cs}s /n/n"</p><p>#第三種演算法,其效能為O(n)<br />maxsofar=0<br />maxendinghere=0<br />puts "Third:"<br />start=Time.now<br />puts "Start...#{start}"<br />for i in 0..n-1<br />if (maxendinghere+a[i])>0<br />maxendinghere= (maxendinghere+a[i])<br />else<br />maxendinghere=0<br />end</p><p>if maxendinghere>maxsofar<br />maxsofar=maxendinghere<br />#puts "a[#{i}..#{j}]=#{maxsofar}"<br />end<br />end<br />puts maxsofar<br />ed= Time.now<br />cs=ed-start<br />puts "End...#{ed}"<br />puts "Consnum..#{cs}s"
註:如需轉載,請註明出處,謝謝!
http://blog.csdn.net/savechina