JavaScript рдордзреАрд▓ Google рдореБрд▓рд╛рдЦрддреАрдордзреВрди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреЗ: 4 рднрд┐рдиреНрди рдорд╛рд░реНрдЧ

JavaScript рдордзреАрд▓ Google рдореБрд▓рд╛рдЦрддреАрдордзреВрди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреЗ: 4 рднрд┐рдиреНрди рдорд╛рд░реНрдЧ

рдЬреЗрд╡реНрд╣рд╛ рдореА рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдХрд╛рдордЧрд┐рд░реАрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдд рд╣реЛрддреЛ, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рд╣реЗ рдХрд│рд▓реЗ рдЧреБрдЧрд▓ рдореЙрдХ рдЗрдВрдЯрд░рд╡реНрд╣реНрдпреВрдЪрд╛ рд╣рд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрд╣реЗ.. рд╣реЗ рдХреЗрд╡рд│ рдореЛрдареНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдХреЙрд░реНрдкреЛрд░реЗрд╢рдирдордзреНрдпреЗ рдореБрд▓рд╛рдЦрддреА рдХрд╢рд╛ рдШреЗрддрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рджреЗрдд рдирд╛рд╣реА рддрд░ рдЕрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдХрд╢рд╛ рд╕реЛрдбрд╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рд╣реЗ рджреЗрдЦреАрд▓ рд╕рдордЬрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рд╣рд╛ рд▓реЗрдЦ рд╡реНрд╣рд┐рдбрд┐рдУрд▓рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░рдЪреА рд╕рд╛рде рдЖрд╣реЗ. рддреНрдпрд╛рдордзреНрдпреЗ рдореА рджрд╛рдЦрд╡рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЙрдкрд╛рдпрд╛рдВрд╡рд░ рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рджреЗрддреЛ, рддрд╕реЗрдЪ JavaScript рдордзреАрд▓ рдорд╛рдЭреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╕реЛрд▓реНрдпреВрд╢рдирдЪреА рдЖрд╡реГрддреНрддреА. рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреНрдпрд╛ рдмрд╛рд░рдХрд╛рд╡реЗ рджреЗрдЦреАрд▓ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛ".

рд╕рдорд╕реНрдпреЗрдЪреА рдирд┐рд░реНрдорд┐рддреА

рдЖрдореНрд╣рд╛рд▓рд╛ рдСрд░реНрдбрд░ рдХреЗрд▓реЗрд▓рд╛ рдЕреЕрд░реЗ рдЖрдгрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рджрд┐рд▓реЗ рдЬрд╛рддреЗ. рддреНрдпрд╛рдирдВрддрд░ рдЕтАНреЕрд░реЗрдордзреАрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рджреЛрди рд╕рдВрдЦреНрдпрд╛рдВрдЪреА рдмреЗрд░реАрдЬ рджрд┐рд▓реЗрд▓реНрдпрд╛ рдореВрд▓реНрдпрд╛рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдиреЗ рдЕрд╕реВ рд╢рдХрддреЗ рдХреА рдирд╛рд╣реА рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЦрд░реЗ рдХрд┐рдВрд╡рд╛ рдЦреЛрдЯреЗ рджреЗрдгрд╛рд░реЗ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЬрд╛рддреЗ.

рджреБрд╕-рдпрд╛ рд╢рдмреНрджрд╛рдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рдЕреЕрд░реЗрдордзреНрдпреЗ x рдЖрдгрд┐ y рдЕрд╕реЗ рджреЛрди рдкреВрд░реНрдгрд╛рдВрдХ рдЖрд╣реЗрдд рдХрд╛, рдЬреЗ рдПрдХрддреНрд░ рдЬреЛрдбрд▓реНрдпрд╛рд╡рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдпрд╛рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреЗ рдЕрд╕рддрд╛рдд?

рдЙрджрд╛рд╣рд░рдг рдП

рдЬрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕреЕрд░реЗ [1, 2, 4, 9] рджрд┐рд▓рд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдореВрд▓реНрдп 8 рдЕрд╕реЗрд▓, рддрд░ рдлрдВрдХреНрд╢рди рдЪреБрдХреАрдЪреЗ рджреЗрдИрд▓ рдХрд╛рд░рдг рдЕреЕрд░реЗрдордзреАрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рджреЛрди рд╕рдВрдЦреНрдпрд╛ 8 рдкрд░реНрдпрдВрдд рдЬреЛрдбреВ рд╢рдХрдд рдирд╛рд╣реАрдд.

рдЙрджрд╛рд╣рд░рдг рдмреА

рдкрдг рдЬрд░ рддреЗ рдЕтАНреЕрд░реЗ [1, 2, 4, 4] рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдореВрд▓реНрдп 8 рдЕрд╕реЗрд▓, рддрд░ рдлрдВрдХреНрд╢рди рдЦрд░реЗ рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХрд╛рд░рдг 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 рд╢реА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗрдЪ рдЕрд╕рддреЗ, рдкрд░рдВрддреБ рдпрд╛ рд╕реЛрд▓реНрдпреВрд╢рдирдордзреНрдпреЗ рдЖрдкрдг рджреЛрдиреНрд╣реА рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░реВрди рдкрд╣рд╛).

рдЖрдордЪреЗ рд╕реЛрд▓реНрдпреВрд╢рди рд▓реВрдкрд╕рд╛рдареА рдиреЗрд╕реНрдЯреЗрдбрдЪреА рдЬреЛрдбреА рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рддреЗ O(N┬▓) рд╡реЗрд│реЗрдЪреНрдпрд╛ рдЬрдЯрд┐рд▓рддреЗрд╕рд╣ рдЪрддреБрд░реНрднреБрдЬ рдЖрд╣реЗ.


рдЙрдкрд╛рдп 2: рдмрд╛рдпрдирд░реА рд╢реЛрдз

рд╡реЗрд│реЗрдЪреА рдЬрдЯрд┐рд▓рддрд╛: O(Nlog(N)).
рдЕрдВрддрд░рд╛рд│ рдЬрдЯрд┐рд▓рддрд╛: O(1)
.

рдЕтАНреЕрд░реЗ рдХреНрд░рдордмрджреНрдз рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдкрдг рдмрд╛рдпрдирд░реА рд╢реЛрдз рд╡рд╛рдкрд░реВрди рдЙрдкрд╛рдп рд╢реЛрдзреВ рд╢рдХрддреЛ. рдСрд░реНрдбрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕреЕрд░реЗрд╕рд╛рдареА рд╣реЗ рд╕рд░реНрд╡рд╛рдд рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рдЖрд╣реЗ. рдмрд╛рдпрдирд░реА рд╢реЛрдзрд╛рдд O(log(N)) рдЪрд╛ рдЪрд╛рд▓реВ рд╡реЗрд│ рдЕрд╕рддреЛ. рддрдерд╛рдкрд┐, рдЗрддрд░ рд╕рд░реНрд╡ рдореВрд▓реНрдпрд╛рдВрд╡рд┐рд░реБрджреНрдз рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрджреНрдпрд╛рдк рдПрдХ рдлреЙрд░ рд▓реВрдк рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

рдПрдХ рдЙрдкрд╛рдп рдХрд╕рд╛ рджрд┐рд╕рддреЛ рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ. рдЧреЛрд╖реНрдЯреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдмрд╛рдпрдирд░реА рд╢реЛрдз рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдЧрд│реЗ рдХрд╛рд░реНрдп рд╡рд╛рдкрд░рддреЛ. рддрд╕реЗрдЪ 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] рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрддреЗ. рддреЗ рдирдВрддрд░ рдкреНрд░рдердо рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╡рдЧрд│реВрди рдЕреЕрд░реЗрдЪреА рдЖрд╡реГрддреНрддреА рддрдпрд╛рд░ рдХрд░рддреЗ рдЖрдгрд┐ рдЗрдЪреНрдЫрд┐рдд рдмреЗрд░реАрдЬ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрд░реНрд╡рд░рд┐рдд рдореВрд▓реНрдпрд╛рдВрдкреИрдХреА рдХреЛрдгрддреАрд╣реА рдореВрд▓реНрдпреЗ рдЕреЕрд░реЗрдордзреНрдпреЗ рдЬреЛрдбрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд рдХрд╛ рд╣реЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рдпрдирд░реА рд╢реЛрдз рд╡рд╛рдкрд░рддреЗ. рд╣реА рдХреНрд░рд┐рдпрд╛ рдЕреЕрд░реЗрдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХрд╛рд╕рд╛рдареА рдПрдХрджрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ.

рдлреЙрд░ рд▓реВрдкрдордзреНрдпреЗрдЪ O(N) рдЪреА рд░реЗрдЦреАрдп рд╡реЗрд│ рдЬрдЯрд┐рд▓рддрд╛ рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рдлреЙрд░ рд▓реВрдкрдордзреНрдпреЗ рдЖрдореНрд╣реА рдмрд╛рдпрдирд░реА рд╢реЛрдз рдХрд░рддреЛ, рдЬреЗ O(Nlog(N)) рдЪреА рдПрдХреВрдг рд╡реЗрд│ рдЬрдЯрд┐рд▓рддрд╛ рджреЗрддреЗ. рд╣рд╛ рдЙрдкрд╛рдп рдорд╛рдЧреАрд▓ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЪрд╛рдВрдЧрд▓рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЕрджреНрдпрд╛рдк рд╕реБрдзрд╛рд░рдгреЗрд╕рд╛рдареА рдЬрд╛рдЧрд╛ рдЖрд╣реЗ.


рдЙрдкрд╛рдп 3: рд░реЗрдЦреАрдп рд╡реЗрд│

рд╡реЗрд│реЗрдЪреА рдЬрдЯрд┐рд▓рддрд╛: O(N).
рдЕрдВрддрд░рд╛рд│ рдЬрдЯрд┐рд▓рддрд╛: O(1).

рдЖрддрд╛ рдЖрдкрдг рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡реВ, рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡реВрди рдЕреЕрд░реЗрдЪреА рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рд▓реА рдЖрд╣реЗ. рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рджреЛрди рд╕рдВрдЦреНрдпрд╛ рдШреЗрдгреЗ: рдПрдХ рд╕реБрд░рд╡рд╛рддреАрд▓рд╛ рдЖрдгрд┐ рдПрдХ рд╢реЗрд╡рдЯреА. рдЬрд░ рдкрд░рд┐рдгрд╛рдо рдЖрд╡рд╢реНрдпрдХрддреЗрдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│рд╛ рдЕрд╕реЗрд▓ рддрд░ рд╕реБрд░реБрд╡рд╛рддреАрдЪреЗ рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪреЗ рдмрд┐рдВрджреВ рдмрджрд▓рд╛.

рдЕрдЦреЗрд░реАрд╕ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХрддрд░ рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдп рдЖрдврд│реВрди рдпреЗрдИрд▓ рдЖрдгрд┐ рд╕рддреНрдп рдкрд░рдд рдпреЗрдИрд▓, рдХрд┐рдВрд╡рд╛ рдкреНрд░рд╛рд░рдВрдн рдЖрдгрд┐ рд╕рдорд╛рдкреНрддреА рдмрд┐рдВрджреВ рдПрдХрддреНрд░ рд╣реЛрддреАрд▓ рдЖрдгрд┐ рдЦреЛрдЯреЗ рдкрд░рдд рдпреЗрддреАрд▓.

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 рдЬреЛрдбреВ рд╢рдХрддреЛ.

рдордЧ, рдЕреЕрд░реЗрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдд рдЕрд╕рддрд╛рдирд╛, рдЖрдореНрд╣реА "рд╢реЛрдз рдореВрд▓реНрдп" рдЪрд╛ рдЕреЕрд░реЗ рддрдкрд╛рд╕реВ рд╢рдХрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдкреИрдХреА рдПрдХ рдЖрдордЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ рдХрд╛ рддреЗ рдкрд╛рд╣реВ рд╢рдХрддреЛ. рд╣реЛрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рд╕рддреНрдп рдкрд░рдд рдХрд░рд╛.

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

рд╕реЛрд▓реНрдпреВрд╢рдирдЪрд╛ рдЖрдзрд╛рд░ рдлреЙрд░ рд▓реВрдк рдЖрд╣реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдкрдг рд╡рд░ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, O(N) рдЪреА рд░реЗрдЦреАрдп рд╡реЗрд│ рдЬрдЯрд┐рд▓рддрд╛ рдЖрд╣реЗ.

рдЖрдордЪреНрдпрд╛ рдлрдВрдХреНрд╢рдирдЪрд╛ рджреБрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рднрд╛рдЧ рдЖрд╣реЗ Array.prototype.include(), рдПрдХ JavaScript рдкрджреНрдзрдд рдЬреА рдЕтАНреЕрд░реЗрдордзреНрдпреЗ рджрд┐рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЦрд░реЗ рдХрд┐рдВрд╡рд╛ рдЦреЛрдЯреЗ рдкрд░рдд рдпреЗрдИрд▓.

Array.prototype.includes() рдЪреНрдпрд╛ рд╡реЗрд│реЗрдЪреА рдЬрдЯрд┐рд▓рддрд╛ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА MDN (рдЖрдгрд┐ JavaScript рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ) рджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реЗ рдкреЙрд▓реАрдлрд┐рд▓ рдкрд╛рд╣реВ рд╢рдХрддреЛ рдХрд┐рдВрд╡рд╛ Google V8 (C++) рд╕рд╛рд░рдЦреНрдпрд╛ JavaScript рдЗрдВрдЬрд┐рдирдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреАрд▓ рдкрджреНрдзрдд рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ.

// 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() рдЪрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддреАрдЪрд╛ рднрд╛рдЧ рд╕реНрдЯреЗрдк 7 рдордзреАрд▓ while рд▓реВрдк рдЖрд╣реЗ рдЬреЛ (рдЬрд╡рд│рдЬрд╡рд│) рджрд┐рд▓реЗрд▓реНрдпрд╛ рдЕреЕрд░реЗрдЪреА рд╕рдВрдкреВрд░реНрдг рд▓рд╛рдВрдмреА рдкрд╛рд░ рдХрд░рддреЛ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреНрдпрд╛рдЪреА рд╡реЗрд│ рдЬрдЯрд┐рд▓рддрд╛ рджреЗрдЦреАрд▓ рд░реЗрд╖реАрдп рдЖрд╣реЗ. рдмрд░рдВ, рддреЗ рдиреЗрд╣рдореА рдЖрдкрд▓реНрдпрд╛ рдореБрдЦреНрдп рдЕреЕрд░реЗрдЪреНрдпрд╛ рдПрдХ рдкрд╛рдКрд▓ рдорд╛рдЧреЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рд╡реЗрд│реЗрдЪреА рдЬрдЯрд┐рд▓рддрд╛ O (N + (N - 1)) рдЖрд╣реЗ. рдмрд┐рдЧ рдУ рдиреЛрдЯреЗрд╢рди рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рддреЗ O(N) рд╡рд░ рд╕реЛрдкреЗ рдХрд░рддреЛ - рдХрд╛рд░рдг рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ рд╡рд╛рдврд╡рддрд╛рдирд╛ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдкрд░рд┐рдгрд╛рдо N рдЪрд╛ рд╣реЛрддреЛ.

рдЕрд╡рдХрд╛рд╢реАрдп рдЬрдЯрд┐рд▓рддреЗрдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд, рдЕрддрд┐рд░рд┐рдХреНрдд рдЕреЕрд░реЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рдЪреА рд▓рд╛рдВрдмреА рдореВрд│ рдЕреЕрд░реЗрд▓рд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ (рд╡рдЬрд╛ рдПрдХ, рд╣реЛрдп, рдкрд░рдВрддреБ рддреНрдпрд╛рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ), рдкрд░рд┐рдгрд╛рдореА O(N) рдЕрд╡рдХрд╛рд╢реАрдп рдЬрдЯрд┐рд▓рддрд╛ рдпреЗрддреЗ. рдмрд░рдВ, рд╡рд╛рдвреАрд╡ рдореЗрдорд░реА рд╡рд╛рдкрд░ рдЕрд▓реНрдЧреЛрд░рд┐рджрдордЪреА рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ.


рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдореБрд▓рд╛рдЦрддреАрд▓рд╛ рдкреВрд░рдХ рдореНрд╣рдгреВрди рд▓реЗрдЦ рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯреЗрд▓. рд╣реЗ рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА рдПрдХ рд╕рд╛рдзреА рд╕рдорд╕реНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╕рд╣ (рд╡реЗрд│, рд╕реНрдореГрддреА) рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд░реЗ рд╕реЛрдбрд╡рддрд╛ рдпреЗрддреЗ.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛