Ịdozi nsogbu site na ajụjụ ọnụ Google na Javascript: 4 ụzọ dị iche iche

Ịdozi nsogbu site na ajụjụ ọnụ Google na Javascript: 4 ụzọ dị iche iche

Mgbe m na-amụ arụmọrụ nke algọridim, ahụrụ m nke a Nke a bụ vidiyo nke ajụjụ ọnụ Google mock.. Ọ bụghị naanị na-enye echiche nke otu esi eme ajụjụ ọnụ na nnukwu ụlọ ọrụ teknụzụ, kamakwa na-enye gị ohere ịghọta otú edozi nsogbu algọridim dị ka o kwere mee.

Akụkọ a bụ ụdị nkwado na vidiyo. N'ime ya, m na-enye nkọwa na ngwọta niile egosiri, gbakwunyere ụdị ngwọta nke m na Javascript. A na-atụlekwa nuances nke algọridim ọ bụla.

Anyị na -echetara: maka ndị na-agụ Habr niile - ego 10 ruble mgbe ị na-edebanye aha na nkuzi Skillbox ọ bụla site na iji koodu mgbasa ozi Habr.

Skillbox na-atụ aro: Usoro bara uru "Mobile Developer PRO".

Ulationkpụzi nsogbu a

A na-enye anyị usoro iwu kwadoro yana uru akọwapụtara. A na-arịọ ya ka ịmepụta ọrụ na-alaghachi eziokwu ma ọ bụ ụgha dabere na nchikota ọnụọgụ abụọ ọ bụla n'usoro nwere ike ha nhata uru enyere.

N'ikwu ya n'ụzọ ọzọ, enwere ọnụọgụ abụọ dị n'usoro, x na y, na mgbe agbakwunyere ọnụ ha ruru uru akọwapụtara?

Ọmụmaatụ A

Ọ bụrụ na e nyere anyị nhazi [1, 2, 4, 9] na uru ya bụ 8, ọrụ ahụ ga-alaghachi ụgha n'ihi na ọ dịghị ọnụọgụ abụọ dị n'usoro nwere ike ịgbakwunye ruo 8.

Ọmụmaatụ B

Ma ọ bụrụ na ọ bụ nhazi [1, 2, 4, 4] na uru ya bụ 8, ọrụ ahụ kwesịrị ịlaghachi n'eziokwu n'ihi na 4 + 4 = 8.

Ngwọta 1: ike ike

Oge mgbagwoju anya: O(N²).
Mgbagwoju anya oghere: O(1).

Ihe kacha pụta ìhè bụ iji otu ụzọ loops akwụ akwụ.

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

Ngwọta a adịghị arụ ọrụ nke ọma n'ihi na ọ na-enyocha nchikota ihe abụọ ọ bụla nwere ike ime n'usoro ma na-atụnyere indices ọ bụla ugboro abụọ. (Dịka ọmụmaatụ, mgbe i = 1 na j = 2 bụ n'ezie otu ihe atụnyere i = 2 na j = 1, ma na nke a ngwọta anyị na-agbalị abụọ nhọrọ).

N'ihi na ngwọta anyị na-eji ụzọ akwụ ụgwọ maka loops, ọ bụ quadratic na oge mgbagwoju anya O(N²).


Ngwọta 2: Ọchụchọ ọnụọgụ abụọ

Oge mgbagwoju anya: O(Nlog(N)).
Mgbagwoju anya oghere: O (1)
.

Ebe ọ bụ na a na-enye iwu nhazi, anyị nwere ike ịchọ ngwọta site na iji ọnụọgụ ọnụọgụ abụọ. Nke a bụ algọridim kacha arụ ọrụ maka nhazi usoro iwu. Ọchịchọ ọnụọgụ abụọ n'onwe ya nwere oge ịgba ọsọ nke O(log(N)). Otú ọ dị, ị ka kwesịrị iji loop maka ịlele ihe ọ bụla megide ụkpụrụ ndị ọzọ niile.

Nke a bụ ihe ngwọta nwere ike ịdị ka. Iji mee ka ihe doo anya, anyị na-eji ọrụ dị iche iji jikwaa ọchụchọ ọnụọgụ abụọ. Nakwa ọrụ wepụIndex() nke na-eweghachi ụdị nke n'usoro na-ewepu ndeksi enyere.

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

Algọridim na-amalite site na ndeksi [0]. Ọ na-emepụta ụdị nke array na-ewepu nke mbụ ma jiri ọnụọgụ ọnụọgụ abụọ chọpụta ma enwere ike ịgbakwunye ụkpụrụ ndị fọdụrụ na nhazi ahụ iji mepụta nchikota achọrọ. A na-eme ihe a otu ugboro maka mmewere ọ bụla n'usoro.

Maka loop n'onwe ya ga-enwe mgbagwoju anya oge nke O(N), mana n'ime maka loop anyị na-eme ọchụchọ ọnụọgụ abụọ, nke na-enye mgbagwoju anya oge O(Nlog(N)). Ngwọta a dị mma karịa nke gara aga, mana a ka nwere ohere maka mmelite.


Ngwọta 3: Ogologo oge

Oge mgbagwoju anya: O(N).
Mgbagwoju anya oghere: O(1).

Ugbu a, anyị ga-edozi nsogbu ahụ, na-echeta na a na-ahazi nhazi ahụ. Ihe ngwọta bụ iji nọmba abụọ: otu na mmalite na otu na njedebe. Ọ bụrụ na nsonaazụ ya dị iche na nke achọrọ, gbanwee ebe mmalite na njedebe.

N'ikpeazụ, anyị ga-ezute uru achọrọ wee laghachi n'eziokwu, ma ọ bụ mmalite na njedebe ga-agbakọta ma laghachi azụ ụgha.

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


Ugbu a ihe niile dị mma, ihe ngwọta yiri ka ọ kacha mma. Ma onye ga-ekwe nkwa na e nyere iwu n'usoro?

Gịnịzi?

N'ileba anya na mbụ, anyị nwere ike ibu ụzọ nye nhazi usoro wee jiri ihe ngwọta dị n'elu mee ihe. Ma olee otú nke a ga-esi metụta oge igbu mmadụ?

Algọridim kacha mma bụ ngwa ngwa yana mgbagwoju oge O (Nlog (N)). Ọ bụrụ na anyị ejiri ya na ngwọta kachasị mma anyị, ọ ga-agbanwe arụmọrụ ya site na O(N) gaa O (Nlog(N)). Ọ ga-ekwe omume ịchọta ngwọta ahịrị n'usoro na-enweghị usoro?

Ngwọta 4

Oge mgbagwoju anya: O(N).
Oghere mgbagwoju anya: O(N).

Ee, enwere ngwọta ahịrị; iji mee nke a, anyị kwesịrị ịmepụta usoro ọhụrụ nwere ndepụta nke egwuregwu anyị na-achọ. Azụmahịa ebe a bụ iji ebe nchekwa karịa: ọ bụ naanị ngwọta dị na mpempe akwụkwọ nwere mgbagwoju anya oghere karịa O (1).

Ọ bụrụ na uru nke mbụ nke usoro enyere bụ 1 na uru nchọta bụ 8, anyị nwere ike itinye uru 7 na nhazi "ụkpụrụ nyocha".

Mgbe ahụ, ka anyị na-ahazi akụkụ nke ọ bụla nke nhazi ahụ, anyị nwere ike ịlele n'usoro nke "ụkpụrụ ọchụchọ" wee hụ ma otu n'ime ha hà nhata uru anyị bara. Ọ bụrụ ee, laghachi na eziokwu.

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

Ndabere nke ngwọta bụ maka loop, nke, dịka anyị hụrụ n'elu, nwere mgbagwoju anya oge nke O (N).

Akụkụ nke abụọ nke ọrụ anyị bụ Array.prototype.include(), usoro Javascript nke ga-alaghachi n'eziokwu ma ọ bụ ụgha dabere ma n'usoro ahụ nwere uru enyere.

Iji chọpụta oge mgbagwoju anya nke Array.prototype.includes(), anyị nwere ike ilele polyfill nke MDN nyere (ma dee ya na Javascript) ma ọ bụ jiri usoro dị na koodu isi iyi nke engine Javascript dị ka 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;
    }
  });
}

Ebe a iterative akụkụ nke Array.prototype.include() bụ mgbe loop na nzọụkwụ 7 na (fọrọ nke nta) traverses dum ogologo nke nyere n'usoro. Nke a pụtara na oge mgbagwoju anya ya dịkwa ahịrị. Ọfọn, ebe ọ bụ na ọ bụ mgbe niile otu nzọụkwụ n'azụ anyị isi n'usoro, oge mgbagwoju anya bụ O (N + (N - 1)). Iji Big O notation, anyị na-eme ka ọ dị mfe na O(N) - n'ihi na ọ bụ N na-enwe mmetụta kachasị mgbe ọ na-abawanye nha ntinye.

Banyere mgbagwoju anya gbasara oghere, a chọrọ mgbakwunye mgbakwunye nke ogologo ya gosipụtara nhazi mbụ (mwepu otu, ee, mana nke ahụ nwere ike ileghara ya anya), na-ebute O(N) mgbagwoju anya oghere. Ọfọn, ịba ụba ojiji ebe nchekwa na-eme ka arụmọrụ kachasị nke algọridim rụọ ọrụ.


Enwere m olileanya na ị ga-ahụ akụkọ ahụ bara uru dị ka mgbakwunye na ajụjụ ọnụ vidiyo gị. Ọ na-egosi na enwere ike idozi nsogbu dị mfe n'ụzọ dị iche iche site na iji ego dị iche iche ejiri (oge, ebe nchekwa).

Skillbox na-atụ aro:

isi: www.habr.com

Tinye a comment