1. 程式人生 > >蠻力、分治、動態規劃求解最大欄位和問題(aardio)

蠻力、分治、動態規劃求解最大欄位和問題(aardio)

最近的演算法課上要求做的一個實驗是分別用蠻力、分治、動態規劃求解最大欄位和問題。
以下是相關程式碼:

陣列求和程式段:

 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);