使用lua解決最大子陣列的問題,資料是演算法導論裡面第四章第一節的資料
t=
function
findmaxcrosssubarray(array,low,mid,high)
local leftsum=0
local leftmax=0
local leftindex=mid
for i=mid,low,-1
do leftsum=leftsum+array[i]
if(leftsum> leftmax) then
leftmax=leftsum
leftindex=i
endend
local rightsum=0
local rightmax=0
local rightindex=mid
for i=mid+1,high,1
do rightsum=rightsum+array[i]
if(rightsum> rightmax) then
rightmax=rightsum
rightindex=i
endend
return rightmax+leftmax,leftindex,rightindex
endfunction
findmaxsubarray(array,low,high)
if(low==high) then
return array[low],low,high
endmid=math.floor((low+high)/2)
local leftsum,leftmin,leftmax=findmaxsubarray(array,low,mid)
local rightsum,rightmin,rightmax=findmaxsubarray(array,mid+1,high)
local crosssum,crossmin,crossmax=findmaxcrosssubarray(array,low,mid,high)
if(leftsum>=rightsum and leftsum>=crosssum) then
return leftsum,leftmin,leftmax
elseif(rightsum>=leftsum and rightsum>=crosssum) then
return rightsum,rightmin,rightmax
else
return crosssum,crossmin,crossmax
endendsum,left1,right1=findmaxsubarray(t,1,#t)
print('最大子陣列總和'..sum..' 左起'..left1..'右至'..right1)
注意:本來第一次一直結果不成功,下面是結果:
正確結果應是:sum:43,leftindex: 8,rightindex: 11。
顯示結果34,leftindex: 8, rightindex: 16
分析: 最初在findmaxsubarray()函式裡,如下,都沒有宣告是本地變數,導致了結果一直被覆蓋,出現了錯誤的結果
leftsum,leftmin,leftmax=findmaxsubarray(array,low,mid)
rightsum,rightmin,rightmax=findmaxsubarray(array,mid+1,high)
crosssum,crossmin,crossmax=findmaxcrosssubarray(array,low,mid,high)
分治法解決最大子陣列問題
利用分治法解決最大子陣列問題 對給定的陣列得到該陣列中具有最大和的子陣列 對於給定的整數陣列a,求出陣列中具有最大和的子陣列,最大和以及左右下標 思路 採用分治的方法,將陣列分為兩部分,則有最大和的子陣列共有三種情況 在陣列左邊,在陣列右邊,跨越陣列中點 include using namespac...
分治法解決最大子陣列問題
演算法導論中一道很有趣的演算法入門題目,問題是解決最大子陣列的問題,給你乙個陣列,要求你求出其中和最大的連續子陣列,最簡單的思考方式就是暴力求解,對所有的情況都進行組合然後得出最大值,但是這個複雜度是n 為了減少複雜度,演算法導論提供了一種思路,就是用分治法解決最大子陣列的問題 我們首先將要求的陣列...
分治法解決最大子陣列問題
問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...