РСшаванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ Π² Google Π² JavaScript: 4 Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°

РСшаванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ Π² Google Π² JavaScript: 4 Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΡƒΡ‡Π°Π²Π°Ρ… производитСлността Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΡ‚Π΅, ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ… Π½Π° Ρ‚ΠΎΠ²Π° Π’ΠΎΠ²Π° Π΅ Π²ΠΈΠ΄Π΅ΠΎ Π½Π° Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ Π² Google.. Π’ΠΎΠΉ Π½Π΅ само Π΄Π°Π²Π° прСдстава ΠΊΠ°ΠΊ сС ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽΡ‚Π°Ρ‚Π° Π² Π³ΠΎΠ»Π΅ΠΌΠΈΡ‚Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π½ΠΈ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π²ΠΈ позволява Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ сС Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚ възмоТно Π½Π°ΠΉ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ.

Π’Π°Π·ΠΈ статия Π΅ Π²ΠΈΠ΄ ΡΡŠΠΏΡ€ΠΎΠ²ΠΎΠ΄ към Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ. Π’ Π½Π΅Π³ΠΎ прСдоставям ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π·Π° всички ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, плюс моя собствСна вСрсия Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² JavaScript. ΠžΠ±ΡΡŠΠΆΠ΄Π°Ρ‚ сС ΠΈ Π½ΡŽΠ°Π½ΡΠΈΡ‚Π΅ Π½Π° всСки Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ.

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

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;
};


Π‘Π΅Π³Π° всичко Π΅ Π½Π°Ρ€Π΅Π΄, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎ. Но ΠΊΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ ΠΌΠ°ΡΠΈΠ²ΡŠΡ‚ Π΅ ΠΏΠΎΡ€ΡŠΡ‡Π°Π½?

Какво Ρ‚ΠΎΠ³Π°Π²Π°?

На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄ Π±ΠΈΡ…ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ просто Π΄Π° ΠΏΠΎΠ΄Ρ€Π΅Π΄ΠΈΠΌ ΠΏΡŠΡ€Π²ΠΎ масива ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π³ΠΎΡ€Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Но ΠΊΠ°ΠΊ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ сС ΠΎΡ‚Ρ€Π°Π·ΠΈ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС?

Най-добрият Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π΅ Π±ΡŠΡ€Π·ΠΎ сортиранС с Π²Ρ€Π΅ΠΌΠ΅Π²Π° слоТност 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 нотация, Π½ΠΈΠ΅ Π³ΠΎ опростявамС Π΄ΠΎ O(N) - Π·Π°Ρ‰ΠΎΡ‚ΠΎ N ΠΈΠΌΠ° Π½Π°ΠΉ-голямо Π²ΡŠΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° входния Ρ€Π°Π·ΠΌΠ΅Ρ€.

По ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° пространствСната слоТност Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ масив, чиято дълТина отразява оригиналния масив (минус Π΅Π΄Π½ΠΎ, Π΄Π°, Π½ΠΎ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°), ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ O(N) пространствСна слоТност. Π•, ΠΏΠΎΠ²ΠΈΡˆΠ΅Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° максимална СфСктивност Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ°.


Надявам сС Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ статията Π·Π° ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΊΠ°Ρ‚ΠΎ допълнСниС към Π²Π°ΡˆΠ΅Ρ‚ΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ. Π’ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ Π΅Π΄ΠΈΠ½ прост ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π΅ΡˆΠ΅Π½ ΠΏΠΎ няколко Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ количСства ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ рСсурси (Π²Ρ€Π΅ΠΌΠ΅, ΠΏΠ°ΠΌΠ΅Ρ‚).

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€