Ù Ø¬Ù ÙØ¹Ø© ÙØ±Ø¹ÙØ© ÙØµÙÙ
Ø§ÙØ¥Ø¯Ø®Ø§Ù ÙÙ Ù
صÙÙÙØ© Ù
Ù Ø§ÙØ£Ø±ÙاÙ
Ø Ø¹Ù٠سبÙ٠اÙÙ
ثا٠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) إذا استطعت.
Ø§ÙØÙ Ø§ÙØ£Ø¨Ø·Ø¦
ÙÙ ÙÙÙØ§ ØØ³Ø§Ø¨ Ø¬Ù ÙØ¹ اÙÙØ¦Ø§Øª اÙÙØ±Ø¹ÙØ© اÙÙ Ù ÙÙØ©.
إ٠أبسط طرÙÙØ© Ù٠أخذ ÙÙ Ø¹ÙØµØ± ÙØØ³Ø§Ø¨ Ø¬Ù ÙØ¹ اÙ٠صÙÙÙØ§Øª اÙÙØ±Ø¹ÙØ© Ø¨Ø¯Ø¡ÙØ§ Ù ÙÙØ§.
عÙ٠سبÙ٠اÙÙ
ثاÙ, for [-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
The solution has a time complexity of O(n2). In other words, if we increase the array size 2 times, the algorithm will work 4 times longer.
Ø§ÙØÙ Ø§ÙØ£Ø³Ø±Ø¹
Ø¯Ø¹ÙØ§ ÙØ³Ùر Ù٠اÙÙ
صÙÙÙØ© ÙÙØØªÙØ¸ باÙÙ
جÙ
ÙØ¹ Ø§ÙØ¬Ø²Ø¦Ù Ø§ÙØØ§ÙÙ ÙÙØ¹Ùاصر Ù٠اÙÙ
ØªØºÙØ± s. إذا Ø£ØµØ¨ØØª s Ø³Ø§ÙØ¨Ø© ÙÙ ÙÙØª Ù
ا Ø ÙÙ
بتعÙÙÙs = 0. سÙÙÙÙ Ø§ÙØØ¯ Ø§ÙØ£Ùص٠ÙÙÙ ÙØ°Ù Ø§ÙØ¥Ø¬Ø§Ø¨Ø§Øª ÙÙ Ø§ÙØ¥Ø¬Ø§Ø¨Ø©.
إذا ÙØ§Ù اÙÙØµÙ ØºØ§Ù Ø¶ÙØ§ Ø¬Ø¯ÙØ§ Ø ÙÙØ±Ø¬Ù Ø§ÙØ§Ø·Ùاع عÙ٠اÙÙÙØ¯ Ø ÙÙÙ ÙØµÙر ب٠ا ÙÙÙÙ:
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;
}
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
ØªØªØ·ÙØ¨ Ø§ÙØ®ÙØ§Ø±Ø²Ù ÙØ© ØªÙ Ø±ÙØ±Ø§Ù ٠صÙÙÙÙ ÙØ§ØØ¯Ù Ø ÙØ°Ø§ ÙØ¥Ù تعÙÙØ¯ اÙÙÙØª ÙÙ O (n).
ÙÙ ÙÙÙ Ø§ÙØ¹Ø«Ùر عÙÙ Ù Ø²ÙØ¯ ٠٠اÙ٠عÙÙ٠ات Ø§ÙØªÙصÙÙÙØ© ØÙÙ Ø§ÙØ®ÙØ§Ø±Ø²Ù ÙØ© ÙÙØ§: Maximum subarray problem. إذا ÙØ§Ù ÙØ§ ÙØ²Ø§Ù Ù Ù ØºÙØ± اÙÙØ§Ø¶Ø سبب ÙØ¬Ø§Ø ذÙÙ Ø ÙØ§Ùرجاء تتبع Ø§ÙØ®ÙØ§Ø±Ø²Ù ÙØ© ÙÙ Ø§ÙØ£Ù Ø«ÙØ© Ø£Ø¹ÙØ§Ù Ø ÙÙ Ø¹Ø±ÙØ© ÙÙÙÙØ© ع٠ÙÙØ§ Ø ÙÙØ°Ø§ Ø£ÙØ¶Ù ٠٠أ٠ÙÙ٠ات.