Ø¨Ø²Ø±Ú¯âØªØ±ÛÙ Ø²ÛØ±Ø¢Ø±Ø§ÛÙ
ÙØ±ÙØ¯Û ÛÚ© آراÛ٠از اعداد Ø§Ø³ØªØ Ø¨Ø±Ø§Û Ù
ثا٠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) اگر Ù ÛâØªÙØ§ÙÛØ¯.
را٠ØÙ Ú©ÙÙØ¯
٠ا Ù ÛâØªÙØ§ÙÛ٠ت٠ا٠ج٠عâÙØ§Û ٠٠ک٠را ØØ³Ø§Ø¨ Ú©ÙÛÙ .
سادÙâØªØ±Û٠را٠ØÙ اÛ٠است ک٠ت٠ا٠اÙ٠اÙâÙØ§ را Ø¯Ø±ÛØ§Ùت Ú©ÙÛ٠٠از آ٠اÙÙ Ø§Ù Ø¨Ù Ø¨Ø¹Ø¯Ø ØØ§ØµÙ ج٠ع ØªÙ Ø§Ù Û Ø²ÛØ±Ø¢Ø±Ø§ÛÙâÙØ§ را ØØ³Ø§Ø¨ Ú©ÙÛÙ .
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ø¨Ø±Ø§Û [11 ,9- ,3 ,2 ,1-]:
// -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) Ø¯Ø§Ø±Ø¯Ø Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø Ø§Ú¯Ø± ٠ا Ø§ÙØ¯Ø§Ø²Ù آراÛ٠را د٠برابر Ú©ÙÛÙ Ø Ø§ÙÚ¯ÙØ±Ûت٠4 برابر Ø¨ÛØ´ØªØ± ز٠ا٠٠ÛâØ¨Ø±Ø¯.
Ø¨Ø±Ø§Û Ø¢Ø±Ø§ÛÙâÙØ§Û بزرگ (1000Ø 10000 ÛØ§ اÙ٠اÙâÙØ§Û Ø¨ÛØ´ØªØ±) ÚÙÛ٠اÙÚ¯ÙØ±ÛØªÙ Û Ù ÛâØªÙØ§Ùد باعث Ø³Ø³ØªÛ Ø¬Ø¯Û Ø´ÙØ¯.
را٠ØÙ Ø³Ø±ÛØ¹
Ø¨ÛØ§ÛÛØ¯ در آراÛÙ Ù¾ÛØ´ برÙÛÙ
Ù ØØ§ØµÙ جÙ
ع Ú©ÙÙÙÛ Ø§ÙÙ
اÙâÙØ§ را در Ù
ØªØºÛØ± s Ùگ٠دارÛÙ
. اگر s در جاÛÛ Ù
ÙÙÛ Ø´ÙØ¯Ø سپس s=0 را Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ù
ÛâÚ©ÙÛÙ
. Ø¨ÛØ´ØªØ±ÛÙ Ù
ÙØ¯Ø§Ø± ÚÙÛÙ sÙØ§ÛÛ Ø¬ÙØ§Ø¨ Ø®ÙØ§Ùد Ø¨ÙØ¯.
اگر ØªÙØ¶ÛØØ§Øª Ø®ÛÙÛ Ù Ø¨ÙÙ Ø§Ø³ØªØ ÙØ·Ùا ب٠کد Ùگا٠کÙÛØ¯Ø Ø¨Ù Ø§ÙØ¯Ø§Ø²Ù کاÙÛ Ú©ÙØªØ§Ù است:
function getMaxSubSum(arr) {
let maxSum = 0;
let partialSum = 0;
for (let item of arr) { // Ø¨Ø±Ø§Û ÙØ± اÙÙ
ا٠آراÛÙ
partialSum += item; // اضاÙÙ Ú©Ù partialSum آ٠را بÙ
maxSum = Math.max(maxSum, partialSum); // Ø¨ÛØ´ØªØ±ÛÙ Ù
ÙØ¯Ø§Ø± را ÛÙ ÛØ§Ø¯ بسپر
if (partialSum < 0) partialSum = 0; // اگر Ù
ÙÙÛ Ø¨ÙØ¯ برابر با Ù
ÙÙÛ Ø´ÙØ¯
}
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) است.
ش٠ا Ù ÛâØªÙØ§ÙÛØ¯ Ø§Ø·ÙØ§Ø¹Ø§Øª Ø¨ÛØ´ØªØ±Û دربار٠اÙÚ¯ÙØ±Ûت٠را اÛÙØ¬Ø§ Ù¾ÛØ¯Ø§ Ú©ÙÛØ¯: ٠سئÙÙ Ø²ÛØ±Ø¢Ø±Ø§ÛÙ Ø¨ÛØ´ÛÙÙ. اگر ÙÙÙØ² ÙÙ Ø¨Ø±Ø§Û Ø´Ù Ø§ ٠شخص ÙÛØ³Øª Ú©Ù ÚØ±Ø§ کار Ù ÛâÚ©ÙØ¯Ø ÙØ·Ùا اÙÚ¯ÙØ±Ûت٠را در Ù Ø«Ø§Ù Ø¨Ø§ÙØ§ Ø¯ÙØ¨Ø§Ù Ú©ÙÛØ¯Ø ببÛÙÛØ¯ ÚÚ¯ÙÙ٠کار Ù ÛâÚ©ÙØ¯Ø اÛ٠کار Ø¨ÙØªØ± از ØØ±ÙÛ Ø§Ø³Øª.
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;
}
باز کرد٠راÙâØÙ Ù٠را٠با تستâÙØ§ درÙÙ ÛÚ© sandbox.