Foia se fa'afitauli mai se fa'atalanoaga a Google ile JavaScript: 4 auala 'ese'ese

Foia se fa'afitauli mai se fa'atalanoaga a Google ile JavaScript: 4 auala 'ese'ese

A o ou suʻesuʻeina le faʻatinoga o algorithms, na ou mauaina lenei mea Ole vitio lea ole fa'atalanoaga tauemuga a Google.. E le gata ina maua ai se manatu pe faʻafefea ona faia faʻatalanoaga i kamupani tekonolosi tetele, ae faʻatagaina foi oe e malamalama pe faʻafefea ona foia faʻafitauli algorithmic i se tulaga lelei e mafai ai.

O lenei tusiga o se ituaiga o faʻasalalauga i le vitio. I totonu ou te tuʻuina atu faʻamatalaga i fofo uma o loʻo faʻaalia, faʻatasi ai ma laʻu lava faʻamatalaga o le fofo ile JavaScript. O nuances o algorithm taitasi o loʻo talanoaina foi.

Matou te faʻamanatu atu ia te oe: mo tagata faitau uma o le "Habr" - o se faʻaitiitiga o 10 rubles pe a lesitala i soʻo se vasega Skillbox e faʻaaoga ai le code promotional "Habr".

Ua fautuaina e Skillbox: Kosi fa'ata'ita'i "Mobile Developer PRO".

Fausiaina o le faʻafitauli

Ua tuuina mai ia i matou se faasologa oka ma se tau faapitoa. Ona fa'atonuina lea e fai se galuega e toe fa'afo'i sa'o pe sese e fa'atatau i le aofa'i o so'o se numera lua i le fa'asologa e mafai ona tutusa ma se tau ua tu'uina atu.

I se isi faaupuga, e lua numera i totonu o le laina, x ma y, pe a faʻaopoopo faʻatasi e tutusa ma le tau faʻamaonia?

Faataitaiga A

Afai e tuʻuina mai ia i matou se laina [1, 2, 4, 9] ma o le tau o le 8, o le galuega o le a toe foʻi sese ona e leai ni numera se lua i le laina e mafai ona faʻaopoopo i le 8.

Faataitaiga B

Ae afai o se laina [1, 2, 4, 4] ma o le tau o le 8, o le galuega e tatau ona toe foi moni aua 4 + 4 = 8.

Fofo 1: Malosi saua

Taimi lavelave: O(N²).
Avanoa lavelave: O(1).

O le uiga sili ona manino o le faʻaaogaina o se pea faʻamaufaʻailoga.

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

O lenei fofo e le lelei aua e siaki uma le aofaʻi o elemene e lua i le faʻasologa ma faʻatusatusaina taʻilua o faʻailoga faʻalua. (Mo se faʻataʻitaʻiga, pe a i = 1 ma le j = 2 e tutusa lava ma le faʻatusatusa i le i = 2 ma le j = 1, ae i lenei fofo matou te taumafai ai i filifiliga uma e lua).

Ona o la matou fofo e fa'aogaina ai se pea ofaga mo matasele, e fa'afa'afa ma O(N²) taimi lavelave.


Fofo 2: Su'esu'e Binary

Taimi lavelave: O(Nlog(N)).
Avanoa lavelave: O(1)
.

Talu ai ua faʻatonuina faʻasologa, e mafai ona tatou suʻeina se fofo e faʻaaoga ai suʻesuʻega binary. Ole algorithm sili lea ona lelei mo fa'asologa fa'atonu. O su'esu'ega binary lava ia o lo'o iai le taimi ole O(log(N)). Ae ui i lea, e manaʻomia pea lou faʻaogaina o le mo le matasele e siaki ai elemene taʻitasi e faʻatatau i isi mea taua uma.

O foliga ia o se fofo. Ina ia faʻamalamalama mea, matou te faʻaogaina se galuega e ese mai e pulea ai suʻesuʻega binary. Fa'apea fo'i le galuega removeIndex(), lea e toe fa'afo'i mai ai le fa'asologa o le fa'asologa e to'ese le fa'asino igoa.

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

O le algorithm e amata mai i le faasino igoa [0]. Ona faia lea o se faʻasologa o le faʻasologa e le aofia ai le faʻasino muamua ma faʻaogaina suʻesuʻega binary e iloa ai pe mafai ona faʻaopoopoina nisi o tau o totoe i le faʻasologa e maua ai le aofaʻi manaʻomia. O lenei gaioiga e faia tasi mo elemene taʻitasi i le array.

O le matasele mo ia lava o le ai ai se lavelave taimi laina ole O(N), ae i totonu ole matasele mo le matasele tatou te faia ai se su'esu'ega binary, lea e maua ai le lavelave atoa ole taimi ole O(Nlog(N)). O lenei fofo e sili atu nai lo le muamua, ae o loʻo i ai pea le avanoa e faʻaleleia atili ai.


Fofo 3: Taimi laina

Taimi lavelave: O(N).
Avanoa lavelave: O(1).

O lenei o le a tatou foia le faafitauli, manatua o le array ua faavasegaina. O le fofo o le ave lea o numera e lua: tasi i le amataga ma le tasi i le faaiuga. Afai e ese le taunuuga mai le mea e manaʻomia, ona sui lea o le amataga ma le faʻaiʻuga.

Mulimuli ane o le a tatou fetaiaʻi ma le tau manaʻomia ma toe foʻi saʻo, pe o le amataga ma le faʻaiʻuga o le a faʻafeiloaʻi ma toe foʻi sese.

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 lea ua lelei mea uma, o le fofo e foliga mai e sili ona lelei. Ae o ai e mafai ona faʻamautinoa na faʻatonuina le laina?

Ae faapefea la?

I le tepa muamua, semanu matou te faʻatonuina le faʻasologa muamua ona faʻaaoga ai lea o le fofo o loʻo i luga. Ae faʻafefea ona aʻafia ai le taimi o le faʻataunuʻuina?

O le algorithm sili ona vave fa'atasi ma le lavelave taimi O (Nlog (N)). Afai tatou te faʻaaogaina i la tatou fofo sili ona lelei, o le a suia lona faʻatinoga mai le O (N) i le O (Nlog (N)). E mafai ona maua se fofo laina ma se laina e le faʻatonuina?

Fofo 4

Taimi lavelave: O(N).
Avanoa lavelave: O(N).

Ioe, o loʻo i ai se fofo laina; ina ia faia lenei mea, e manaʻomia ona tatou fatuina se laina fou e iai le lisi o afitusi o loʻo tatou sailia. O le fefa'ataua'iga iinei e sili atu le fa'aoga manatua: na'o le pau lea o le vaifofo i le pepa e iai le lavelave avanoa e sili atu nai lo le O(1).

Afai o le tau muamua o se laina tu'uina atu o le 1 ma le tau su'esu'e o le 8, e mafai ona tatou fa'aopoopo le tau 7 i le fa'asologa o "taua su'esu'e".

Ma, a'o tatou fa'agasolo elemene ta'itasi o le fa'asologa, e mafai ona tatou siakiina le fa'asologa o "taua su'esu'e" ma va'ai pe tutusa se tasi ma lo tatou tau. Afai e ioe, ia toe faafoi moni.

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 le faʻavae o le fofo o le mo le matasele, lea, e pei ona tatou vaʻaia i luga, o loʻo i ai se lavelave taimi laina ole O (N).

O le vaega lona lua o la matou galuega o le Array.prototype.include(), o se auala JavaScript e toe faʻafoʻi saʻo pe sese e faʻatatau pe o loʻo i ai i le laina le tau ua tuʻuina atu.

Ina ia iloa le lavelave taimi o Array.prototype.includes(), e mafai ona tatou vaʻavaʻai i le polyfill saunia e MDN (ma tusia i le JavaScript) poʻo le faʻaogaina o se metotia i le faʻailoga autu o se masini JavaScript e pei ole 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;
    }
  });
}

O le vaega faifaipea o Array.prototype.include() o le a'o fa'agasolo i le Laasaga 7 lea (toetoe lava) fealua'i i le umi atoa o le laina ua tu'uina atu. O lona uiga o lona lavelave taimi e laina laina foi. Ia, talu ai e tasi lava le laasaga i tua atu o la tatou faʻasologa autu, o le lavelave o le taimi o le O (N + (N - 1)). I le fa'aogaina o le Big O Notation, matou te fa'afaigofieina i le O(N) - aua o le N e sili ona a'afia pe a fa'atuputeleina le tele o fa'aoga.

E tusa ai ma le lavelave o le fa'afanua, e mana'omia se fa'aopoopoga fa'aopoopo e fa'aata le umi o le laina muamua (to'ese le tasi, ioe, ae e mafai ona le amana'ia), e mafua ai le fa'alavelave fa'apitoa ole O(N). Ia, faʻateleina le faʻaogaina o mafaufauga e faʻamautinoa ai le maualuga o le faʻaogaina o le algorithm.


Ou te faʻamoemoe e te mauaina le tusiga aoga e fai ma faʻaopoopoga i lau faʻatalanoaga vitio. E faʻaalia ai o se faʻafitauli faigofie e mafai ona foia i le tele o auala eseese ma le tele o punaoa faʻaaogaina (taimi, manatua).

Ua fautuaina e Skillbox:

puna: www.habr.com

Faaopoopo i ai se faamatalaga