使用Lua解決最大子陣列問題

2021-08-21 06:47:10 字數 1815 閱讀 8827

使用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 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...