Ruby實現求數組內相鄰元素的最大和-《編程珠璣》問題求解

來源:互聯網
上載者:User
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

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.