蠻力、分治、動態規劃求解最大欄位和問題(aardio)
阿新 • • 發佈:2019-02-12
最近的演算法課上要求做的一個實驗是分別用蠻力、分治、動態規劃求解最大欄位和問題。
以下是相關程式碼:
陣列求和程式段:
var getsum = function(tab,frist,last){
var sum = 0;
if(type(tab) == type.table){
if(frist == null){
frist = 1;
}
if(last == null){
last = table.len(tab);
}
for(i = frist;last ;1){
sum += tab[i];
}
}
return sum;
}
蠻力法求解程式碼段:
var getByBF = function(tab){
var count = 0;
console.log("蠻力法");
var length = table.len(tab);
var i = 1;
var sum = 0;
var temp;
var index1,index2;
console.log("i","j","sum");
for(i= 1;length-1;1){
for(j=i;length;1){
temp = getsum(tab,i,j);
if(sum < temp){
sum = temp;
index1 = i;
index2 = j;
}
count++;
console.log(i,j,sum);
}
}
console.log("count" ,count);
return sum,index1,index2;
}
分治法求解程式碼段:
var getByDC = function(tab){
var count = 0;
console.log("動態規劃");
var maxSum;
console.log("frist","last","sum");
maxSum = function(tab,frist,last){
if(frist == last){
count++;
return tab[frist];
}
else {
var center = math.floor((frist+last)/2);//之前這裡是math.ceil導致了棧溢位,是因為當frist為1,last為2時,將導致center也為2從而無窮迴圈下去
var leftsum = maxSum(tab,frist,center);
var rightsum = maxSum(tab,center+1,last);
var s1 = 0;
var lefts = 0;
for(i=center;frist;-1){
lefts+=tab[i];
if(lefts >s1){
s1 = lefts;
}
}
var s2 = 0;
var rights = 0;
for(i=center+1;last;1){
rights+= tab[i];
if(rights>s2){
s2 = rights;
}
}
var sum = s1 + s2;
if(sum < leftsum){
sum = leftsum;
}
if(sum < rightsum){
sum = rightsum;
}
count++;
console.log(frist,last,sum);
return sum;
}
}
var result = maxSum(tab,1,table.len(tab));
console.log("count",count);
return result;
}
動態規劃程式碼段:
var getByDP = function(tab){
var count = 0;
console.log("動態規劃:");
var sum = 0;
var temp = tab[1];
console.log("i","j","sum");
for(i=2;table.len(tab);1){
if(temp > 0){
temp += tab[i];
}
else {
temp = tab[i];
}
console.log(i,temp,sum);
if(temp > sum){
sum = temp;
}
count++;
}
console.log("count",count);
return sum;
}
隨機陣列程式碼段:
var getRandomTab = function(num,min,max){
var tab = {};
for(i=1;num;1){
table.push(tab,math.random(min,max));
}
return tab;
}
主程式碼段:
import console;
var taba = getRandomTab(10,-5,10);
console.dump(taba);
console.log("蠻力法:",getByBF(taba));
console.log("分治法:",getByDC(taba));
console.log("動態規劃法:",getByDP(taba));
console.pause(true);