πŸ”Ά Алгоритмы! Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²!



Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ? Π‘Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся быстрСС всСго πŸ€·β€β™‚οΈ



Рассмотрим Π·Π°Π΄Π°Ρ‡Ρƒ: Π’ массивe ΠΈΠ· size элСмСнтов. НуТно Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму ΠΈΠ· m подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… элeΠΌΠ΅Π½Ρ‚ΠΎΠ².



ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: size = 10, m = 3,

array = { 4 5 0 [7 4 4] 6 2 6 3 }

max_sum = 15



ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: size = 20, m = 5,

array = { 7 8 4 8 3 4 3 1 [7 7 8 9 9] 0 7 9 8 8 1 5 }

max_sum = 40



Как ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ?



ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ способ β€” Π½Π° ΠΌΠΎΠΉ взгляд, самый нСэффСктивный



Найти всС трёхэлСмСнтныС суммы, Π·Π°Ρ‚Π΅ΠΌ срСди Π½ΠΈΡ… Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт. Π’ΠΎ Π΅ΡΡ‚ΡŒ



int m = ...

int[] array = ...



int[] sums = new int[size - m + 1];



for (int i = 0; i <= size - m; i++)

{

int t = 0;

for (int j = i; j < i + m;j++) t += array[j];

sums[i] = t;

}



int max = sums[0];

for (int i = 0; i < sums1.Length; i++)

{

if (sums[i] > max) max = sums[i];

}



Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ β€” Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ (ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ), Π½ΠΎ Π½Π° Π΄Π΅Π»Π΅ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ рСсурсам:

Π˜ΡΠΊΠ°Ρ‚ΡŒ суммы ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹Ρ… m элСмСнтов ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π½Π΅Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ суммой





int max = 0;

for (int i = 0; i <= size - m; i++)

{

int t = 0;

for (int j = i; j < i + m; j++)

{

t += array[j];

}

if (t > max) max = t;

}





Π’Ρ€Π΅Ρ‚ΠΈΠΉ β€” Π½Π° ΠΌΠΎΠΉ взгляд, самый Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ:

Найти сумму ΠΏΠ΅Ρ€Π²Ρ‹Ρ… m элСмСнтов



int max = 0;

for (int i = 0; i < m; i++) max += array[i];



Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ суммы ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, входящий Π² сумму ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎ порядку, сравнивая Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму с Ρ€Π°Π½Π΅Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ:



int temp = max;

for (int i = 1; i <= size - m; i++)

{

temp = temp - array[i - 1] + array[i + (m - 1)];

if (temp > max) max = temp;

}



НапримСр, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска максимальной суммы ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:



для size = 1 000 000 и m = 3

Бпособ 1: 14 ms

Бпособ 2: 5 ms

Бпособ 3: 2 ms



для size = 1 000 000 и m = 5 000

Бпособ 1: 5 679 ms

Бпособ 2: 5 696 ms

Бпособ 3: 2 ms



для size = 1 000 000 и m = 10 000

Бпособ 1: 11 339 ms

Бпособ 2: 11 240 ms

Бпособ 3: 2 ms



для size = 1 000 000 и m = 100 000

Бпособ 1: 103 155 ms

Бпособ 2: 103 239 ms

Бпособ 3: 2 ms



для size = 1 000 000 и m = 250 000

Бпособ 1: 215 566 ms

Бпособ 2: 214 921 ms

Бпособ 3: 2 ms



PS ΠΏΡ€ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ понятно, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ способу всСгда Π½ΡƒΠΆΠ½ΠΎ большС всСго.



πŸ€” Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ?



Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊ Π½Π° github



#Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ #csharp