æå¤§ã®ãµãé å
å
¥åã¯æ°å¤ã®é
åã§ããe.g. arr = [1, -2, 3, 4, -9, 6].
ã¿ã¹ã¯ã¯æ¬¡ã®éãã§ã: ã¢ã¤ãã ã®æå¤§åè¨ã§ arr ã®é£ç¶ããé¨åé
åãæ¢ãã¾ãã
ãã®ãããªè¿å´ããã颿° getMaxSubSum(arr) ãæ¸ãã¦ãã ããã
ä¾ãã°:
getMaxSubSum([-1, 2, 3, -9]) = 5 (ãã¤ã©ã¤ããããã¢ã¤ãã ã®åè¨)
getMaxSubSum([2, -1, 2, 3, -9]) = 6
getMaxSubSum([-1, 2, 3, -9, 11]) = 11
getMaxSubSum([-2, -1, 1, 2]) = 3
getMaxSubSum([100, -9, 2, -3, 5]) = 100
getMaxSubSum([1, 2, 3]) = 6 (ãã¹ã¦)
ãããã¹ã¦ã®ã¢ã¤ãã ãè² å¤ã®å ´åãä½ãåããªããã¨ãæå³ãã¾ã(ãµãé åã¯ç©º)ããªã®ã§åè¨ã¯ã¼ãã§ã:
getMaxSubSum([-1, -2, -3]) = 0
æ©ãè§£æ³ãèãã¦ã¿ã¦ãã ããã: å¯è½ãªã O(n2) ããã㯠O(n) ã§ãã
é ãè§£æ³
ãã¹ã¦ã®å¯è½æ§ã®ãããµãåè¨ãè¨ç®ãããã¨ãã§ãã¾ãã
æãã·ã³ãã«ãªæ¹æ³ã¯ãã¹ã¦ã®è¦ç´ ãåããããããå§ã¾ããã¹ã¦ã®ãµãé åã®åè¨ãè¨ç®ãããã¨ã§ãã
ä¾ãã°ã [-1, 2, 3, -9, 11] ã«å¯¾ãã¦ã¯:
// -1 ããéå§:
-1
-1 + 2
-1 + 2 + 3
-1 + 2 + 3 + (-9)
-1 + 2 + 3 + (-9) + 11
// 2 ããéå§:
2
2 + 3
2 + 3 + (-9)
2 + 3 + (-9) + 11
// 3 ããéå§:
3
3 + (-9)
3 + (-9) + 11
// -9 ããéå§
-9
-9 + 11
// -11 ããéå§
-11
ã³ã¼ãã¯å®éã«ã¯å ¥ãåã®ã«ã¼ãã§ã: é åè¦ç´ ã«å¯¾ããå¤é¨ã«ã¼ããããã³ç¾å¨ã®è¦ç´ ã§å§ã¾ãå é¨ã«ã¦ã³ãã®ãµãåè¨ã§ãã
function getMaxSubSum(arr) {
let maxSum = 0; // ããè¦ç´ ãåããªãå ´åãã¼ããè¿å´ããã¾ã
for (let i = 0; i < arr.length; i++) {
let sumFixedStart = 0;
for (let j = i; j < arr.length; j++) {
sumFixedStart += arr[j];
maxSum = Math.max(maxSum, sumFixedStart);
}
}
return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
ãã®è§£æ³ã¯ O(n2) ã®æéã®è¤éããæã£ã¦ãã¾ããè¨ãæããã¨ãããé åã®ãµã¤ãºã2åã«å¢å ããã¨ãã¢ã«ã´ãªãºã ã¯4åé·ããªãã¾ãã
大ããªé å(1000, 10000 ã¾ãã¯ããå¤ãã®ã¢ã¤ãã )ã«å¯¾ãã¦ã¯ããã®ãããªã¢ã«ã´ãªãºã ã¯æ·±å»ãªã¬ãã«ã§ä½éã«ãªãå¯è½æ§ãããã¾ãã
æ©ãè§£æ³
é
åãæ©ãã¦å¤æ° s ã«ç¾å¨ã®è¦ç´ ã®é¨ååè¨ãæã¡ã¾ããããs ãããç¹ã§è² ã«ãªãå ´å㯠s=0 ã代å
¥ãã¾ãããã®ãã㪠s ã®æå¤§å¤ãçãã«ãªãã¾ãã
説æã«ãã¾ããã³ã¨ããªãå ´åã¯ãã³ã¼ããåç §ãã¦ãã ãããããã¯ååçãã§ã:
function getMaxSubSum(arr) {
let maxSum = 0;
let partialSum = 0;
for (let item of arr) { // for each item of arr
partialSum += item; // add it to partialSum
maxSum = Math.max(maxSum, partialSum); // remember the maximum
if (partialSum < 0) partialSum = 0; // zero if negative
}
return maxSum;
}
alert( getMaxSubSum([-1, 2, 3, -9]) ); // 5
alert( getMaxSubSum([-1, 2, 3, -9, 11]) ); // 11
alert( getMaxSubSum([-2, -1, 1, 2]) ); // 3
alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100
alert( getMaxSubSum([1, 2, 3]) ); // 6
alert( getMaxSubSum([-1, -2, -3]) ); // 0
ãã®ã¢ã«ã´ãªãºã ã¯1åã®é åã«ã¼ããå¿ è¦ã¨ããã®ã§ãæéè¤é度㯠O(n) ã§ãã
ããªãã¯ããã§ããã®ã¢ã«ã´ãªãºã ã«ã¤ãã¦ã®ããè©³ç´°ãªæ å ±ãè¦ã¤ãããã¨ãã§ãã¾ã: Maximum subarray problem. ãããããªããããåä½ããã®ããã¾ã ã¯ã£ãããã¦ããªãå ´åã¯ãä¸ã®ä¾ã®ã¢ã«ã´ãªãºã ããã¬ã¼ã¹ãã¦ãã©ã®ããã«åä½ããããè¦ã¦ãã ãããããã¯ã©ããªè¨èãããåªãã¦ãã¾ãã
function getMaxSubSum(arr) {
let maxSum = 0;
let partialSum = 0;
for (let item of arr) {
partialSum += item;
maxSum = Math.max(maxSum, partialSum);
if (partialSum < 0) partialSum = 0;
}
return maxSum;
}
ãµã³ãããã¯ã¹ã§ãã¹ãã¨ä¸ç·ã«è§£çãéã