РСшаСм Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ Google Π½Π° JavaScript: 4 Ρ€Π°Π·Π½Ρ‹Ρ… способа

РСшаСм Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ Google Π½Π° JavaScript: 4 Ρ€Π°Π·Π½Ρ‹Ρ… способа

Когда я занимался ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΌΠ½Π΅ попалось Π²ΠΎΡ‚ это Π²ΠΈΠ΄Π΅ΠΎ с ΠΌΠΎΠΊ-ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ Google. Оно Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π΅Ρ‚ прСдставлСниС, ΠΊΠ°ΠΊ проходят собСсСдования Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… тСхнологичСских корпорациях, Π½ΠΎ ΠΈ позволяСт ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ алгоритмичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ максимально эффСктивно.

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ β€” своСобразноС сопровоТдСниС ΠΊ Π²ΠΈΠ΄Π΅ΠΎ. Π’ Π½Π΅ΠΉ я даю ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊΠΎ всСм ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌ плюс ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° JavaScript. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π½ΡŽΠ°Π½ΡΡ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

НапоминаСм: для всСх Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Β«Π₯Π°Π±Ρ€Π°Β» β€” скидка 10 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ записи Π½Π° любой курс Skillbox ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ Β«Π₯Π°Π±Ρ€Β».

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ курс Β«ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ PROΒ».

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Нам Π΄Π°ΡŽΡ‚ упорядочСнный массив ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π—Π°Ρ‚Π΅ΠΌ просят ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true ΠΈΠ»ΠΈ false, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ сумма Π»ΡŽΠ±Ρ‹Ρ… Π΄Π²ΡƒΡ… чисСл ΠΈΠ· массива Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² массивС Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа x ΠΈ y, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ слоТСнии Ρ€Π°Π²Π½Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ?

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ А

Если Π½Π°ΠΌ Π΄Π°Π»ΠΈ массив [1, 2, 4, 9] ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8, функция Π²Π΅Ρ€Π½Π΅Ρ‚ false, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π²Π° числа ΠΈΠ· массива Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Ρ‚ΡŒ 8 Π² суммС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π‘

Но Ссли это массив [1, 2, 4, 4] ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 8, функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ 4 + 4 = 8.

РСшСниС 1. Брутфорс

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(NΒ²).
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(1).

НаиболСС ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” использованиС ΠΏΠ°Ρ€Ρ‹ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ².

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (i !== j && arr[i] + arr[j] === val) {
        return true;
      };
    };
  };
  return false;
};

Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ нСльзя Π½Π°Π·Π²Π°Ρ‚ΡŒ эффСктивным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ провСряСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ сумму Π΄Π²ΡƒΡ… элСмСнтов Π² массивС, Π° Ρ‚Π°ΠΊΠΆΠ΅ сравниваСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ индСксов Π΄Π²Π°ΠΆΠ΄Ρ‹. (НапримСр, ΠΊΠΎΠ³Π΄Π° i = 1 ΠΈ j = 2 β€” это фактичСски Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ с i = 2 ΠΈ j = 1, Π½ΠΎ Π² этом Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Ρƒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² for, ΠΎΠ½ΠΎ являСтся ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O (NΒ²).


РСшСниС 2. Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ) поиск

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(Nlog(N)).
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(1)
.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ массивы упорядочСны, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с использованиСм Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для упорядочСнных массивов. Π‘Π°ΠΌ ΠΏΠΎ сСбС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск ΠΈΠΌΠ΅Π΅Ρ‚ врСмя выполнСния O (log (N)). Однако всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» for, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт ΠΏΠΎ всСм Π΄Ρ€ΡƒΠ³ΠΈΠΌ значСниям.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ понятно, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для контроля Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. А Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ removeIndex (), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ массива Π·Π° Π²Ρ‹Ρ‡Π΅Ρ‚ΠΎΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ индСкса.

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++){
    if (binarySearch(removeIndex(arr, i), val - arr[i])) {
      return true;
    }
  };
  return false;
};
 
const removeIndex = (arr, i) => {
  return arr.slice(0, i).concat(arr.slice(i + 1, arr.length));
};
 
const binarySearch = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  let pivot = Math.floor(arr.length / 2); 
  while (start < end) {
    if (val < arr[pivot]) {
      end = pivot - 1;
    } else if (val > arr[pivot]) {
      start = pivot + 1;
    };
    pivot = Math.floor((start + end) / 2);
    if (arr[pivot] === val) {
      return true;
    }
  };
  return false;
};

Алгоритм стартуСт с индСкса [0]. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ создаСт Π²Π΅Ρ€ΡΠΈΡŽ массива, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ индСкс, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ массиву ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для получСния ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ суммы. Π­Ρ‚ΠΎ дСйствиС выполняСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² массивС.

Π‘Π°ΠΌ ΠΏΠΎ сСбС Ρ†ΠΈΠΊΠ» for Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O (N), Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° for ΠΌΡ‹ выполняСм Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O (Nlog (N)). Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, Π½ΠΎ Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ΡŒ.


РСшСниС 3. Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(N).
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(1).

БСйчас ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, помня, Ρ‡Ρ‚ΠΎ массив отсортирован. РСшСниС состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ Π΄Π²Π° числа: ΠΎΠ΄Π½ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΎΠ΄Π½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ отличаСтся ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ, Ρ‚ΠΎ мСняСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΌΡ‹ Π»ΠΈΠ±ΠΎ встрСтим ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Π΅Ρ€Π½Π΅ΠΌ true, Π»ΠΈΠ±ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΈ конСчная Ρ‚ΠΎΡ‡ΠΊΠΈ сойдутся ΠΈ вСрнСтся false.

const findSum = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  while (start < end) {
    let sum = arr[start] + arr[end];
    if (sum > val) {
      end -= 1;
    } else if (sum < val) {
      start += 1;
    } else {
      return true;
    };
  };
  return false;
};


Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅. Но ΠΊΡ‚ΠΎ даст Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ, Ρ‡Ρ‚ΠΎ массив Π±Ρ‹Π» упорядочСнным?

Π§Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π°?

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ сначала просто ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ массив, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅. Но ΠΊΠ°ΠΊ это повлияСт Π½Π° врСмя выполнСния?

Π›ΡƒΡ‡ΡˆΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ β€” быстрая сортировка c Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O (Nlog (N)). Если Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠΌ Π² нашСм ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ, ΠΎΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ свою ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с O (N) Π½Π° O (Nlog (N)). МоТно Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с нСупорядочСнным массивом?

РСшСниС 4

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(N).
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π΅Π½Π½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: O(N).

Π”Π°, Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сущСствуСт, для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ массив, содСрТащий список совпадСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ. ΠšΠΎΠΌΠΏΡ€ΠΎΠΌΠΈΡΡ здСсь Π² Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ использовании памяти: это СдинствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ с пространствСнной ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅ΠΉ O (1).

Если ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива Ρ€Π°Π²Π½ΠΎ 1, Π° искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 8, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7 Π² массив Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ поиска».

Π—Π°Ρ‚Π΅ΠΌ, обрабатывая ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ массив Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ поиска» ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ€Π°Π²Π½ΠΎ Π»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Π½Π°ΡˆΠ΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Если Π΄Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true.

const findSum = (arr, val) => {
  let searchValues = [val - arr[0]];
  for (let i = 1; i < arr.length; i++) {
    let searchVal = val - arr[i];
    if (searchValues.includes(arr[i])) {
      return true;
    } else {
      searchValues.push(searchVal);
    }
  };
  return false;
};

Основа Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ β€” Ρ†ΠΈΠΊΠ» for, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π²Ρ‹ΡˆΠ΅, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O (N).

Вторая итСрационная Ρ‡Π°ΡΡ‚ΡŒ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Array.prototype.include (), ΠΌΠ΅Ρ‚ΠΎΠ΄ JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ true ΠΈΠ»ΠΈ false Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, содСрТит Π»ΠΈ массив Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Array.prototype.includes (), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ polyfill, прСдоставляСмый MDN (ΠΈ написанный Π½Π° JavaScript), ΠΈΠ»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π² исходном ΠΊΠΎΠ΄Π΅ Π΄Π²ΠΈΠΆΠΊΠ° JavaScript, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Google V8 (C ++).

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(valueToFind, fromIndex) {
 
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }
 
      // 1. Let O be ? ToObject(this value).
      var o = Object(this);
 
      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;
 
      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }
 
      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;
 
      // 5. If n β‰₯ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 
      function sameValueZero(x, y) {
        return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
      }
 
      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(valueToFind, elementK) is true, return true.
        if (sameValueZero(o[k], valueToFind)) {
          return true;
        }
        // c. Increase k by 1.
        k++;
      }
 
      // 8. Return false
      return false;
    }
  });
}

Π—Π΄Π΅ΡΡŒ итСрационная Ρ‡Π°ΡΡ‚ΡŒ Array.prototype.include () являСтся Ρ†ΠΈΠΊΠ»ΠΎΠΌ while Π½Π° шагС 7, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (ΠΏΠΎΡ‡Ρ‚ΠΈ) пСрСсСкаСт всю Π΄Π»ΠΈΠ½Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½Π°. Ну Π° ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° всСгда находится Π½Π° ΠΎΠ΄ΠΈΠ½ шаг ΠΏΠΎΠ·Π°Π΄ΠΈ нашСго основного массива, Ρ‚ΠΎ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° O (N + (N β€” 1)). Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Big O Notation, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅ΠΌ Π΅Π΅ Π΄ΠΎ O (N) β€” ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ N ΠΈΠΌΠ΅Π΅Ρ‚ наибольшСС влияниС ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π§Ρ‚ΠΎ касаСтся пространствСнной слоТности, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ исходный массив (минус ΠΎΠ΄ΠΈΠ½, Π΄Π°, Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ), Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ пространствСнной слоТности O (N). Ну Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ использованиС памяти обСспСчиваСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.


НадСюсь, ΡΡ‚Π°Ρ‚ΡŒΡ окаТСтся для вас ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π² качСствС прилоТСния ΠΊ Π²ΠΈΠ΄Π΅ΠΎΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ. Она ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ простая Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° нСсколькими Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ количСством ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… рСсурсов (врСмя, ΠΏΠ°ΠΌΡΡ‚ΡŒ).

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com