
Markii aan baranayay waxqabadka algorithms, waxaan la kulmay tan Ma aha oo kaliya inay bixiso aragti ku saabsan sida wareysiyada loo qabto shirkadaha waaweyn ee teknoolajiyada, laakiin sidoo kale waxay u ogolaataa qofka inuu fahmo sida dhibaatooyinka algorithmic loo xalliyo, iyo sida ugu waxtarka leh loo xalliyo.
Maqaalkani waxa uu u adeegaa sidii qayb wehel fiidyaha. Dhexdeeda, waxaan ku bixiyaa faallooyin ku saabsan dhammaan xalalka la muujiyey, iyo nooca JavaScript ee ii gaar ah ee xalka. Nuances kasta algorithm ayaa sidoo kale laga hadlay.
Waxaan xusuusineynaa: dhammaan akhristayaasha "Habr" - qiimo dhimis ah 10 rubles marka la qorayo koorso kasta oo Skillbox ah iyadoo la adeegsanayo koodhka xayeysiinta "Habr".
Skillbox waxay ku talinaysaa: Koorso wax ku ool ah .
Abuurista dhibaatada
Waxa nala siiyay hab la dalbaday iyo qiimo gaar ah. Waxa nala waydiistay inaanu abuurno hawl ku soo noqota run ama been iyadoo ku xidhan in wadarta labada lambar ee shaxda ay la mid noqon karaan qiimaha la bixiyay.
Si kale haddii loo dhigo, ma jiraan laba mitir oo x iyo y ah oo ku jira shaxanka kuwaas oo, marka la isku daro, siman qiimaha la cayimay?
Tusaale A
Haddii nala siiyo shaxanka [1, 2, 4, 9] iyo qiimaha 8, shaqadu waxay soo noqon doontaa been sababtoo ah laba lambar oo ku jira ma jiraan wax isku dari kara ilaa 8.
Tusaale B
Laakiin haddii ay tahay array [1, 2, 4, 4] oo qiimihiisu yahay 8, shaqadu waa inay run ku noqotaa sababtoo ah 4 + 4 = 8.
Xalka 1: Xoog cad
Kakanaanta wakhtiga: O(N²).
Kakanaanta booska: O (1).
Macnaha ugu cad cad waa isticmaalka lammaane siddo buul leh.
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;
};Xalkani ma aha mid wax ku ool ah, maadaama uu hubinayo wadar kasta oo suurtogal ah oo ah laba walxood oo ku jira soo diyaarinta iyo sidoo kale isbarbardhigga lammaane kasta oo ka mid ah laba jeer. (Tusaale ahaan, marka i = 1 iyo j = 2, waxay si wax ku ool ah ula mid tahay isbarbardhigga i = 2 iyo j = 1, laakiin xalkan, waxaan isku daynaa labada doorasho.)
Maadaama xalkeenu uu isticmaalo labo buul ah oo loops ah, waa afar geesle leh kakanaanta wakhtiga O(N²).
Xalka 2. Raadinta binary
Kakanaanta wakhtiga: O(Nlog(N)).
Kakanaanta booska: O (1).
Maadaama arraysyada la dalbado, waxaan raadin karnaa xalka anagoo adeegsanayna raadinta binary. Kani waa algoorithm-ka ugu waxtarka badan ee habaynta la dalbaday. Raadinta binary lafteedu waxay leedahay O(log(N)) wakhti soconaysa. Si kastaba ha ahaatee, waxaan weli u baahanahay inaan isticmaalno loop-ka si aan u hubinno shay kasta oo ka soo horjeeda dhammaan qiyamka kale.
Waa kan sida uu xalku u ekaan karo. Si aan wax u caddeyno, waxaan isticmaalnaa shaqo gooni ah si aan u xakameyno raadinta binary. Waxaan sidoo kale isticmaalnaa shaqada removeIndex() oo soo celisa nooca diyaarinta oo laga jaray tusmada la cayimay.
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;
};Algorithm wuxuu ka bilaabmaa index [0]. Kadib waxay abuurtaa nooc ka mid ah shaxanka oo ay ka reeban tahay tusaha koowaad waxayna isticmaashaa raadinta binary si ay u hubiso in mid ka mid ah qiyamka soo haray lagu dari karo array si loo helo wadarta la rabo. Qalliinkan waxa lagu sameeyaa hal mar shay kasta oo ku jira shaxda.
Loop-ka laftiisa ayaa yeelan doona kakanaanta wakhtiga toosan ee O(N), laakiin gudaha loop-ka waxaanu ku samaynaa raadinta binary, taasoo siinaysa kakanaanta wakhtiga O(Nlog(N)). Xalkani wuu ka fiican yahay kii hore, laakiin weli waxaa jira meel lagu hagaajin karo.
Xalka 3. Waqtiga tooska ah
Kakanaanta wakhtiga: O(N).
Kakanaanta booska: O (1).
Hadda waxaan xallin doonaa dhibaatada, innagoo maskaxda ku hayna in shaxdu la soocay. Xalku waa in la qaato laba tiro: mid bilawga iyo mid dhamaadka. Haddii natiijadu ka duwan tahay midda la rabo, waxaan beddeleynaa dhibcaha bilowga iyo dhammaadka.
Aakhirka ama qiimaha la rabo ayaynu la kulmi doonnaa oo run baynu ku noqonaynaa, ama bilawga iyo dhammaadka ayaa isu iman doona oo been bay ku noqonayaan.
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;
};Hadda wax walba waa hagaagsan yihiin, xalku wuxuu u muuqdaa mid wanaagsan. Laakiin yaa dammaanad qaadi kara in shaxanka la kala saaray?
Maxaa haddaba?
Jaleecada hore, waxaan si fudud u kala saari karnaa marka hore ka dibna isticmaalno xalka sare. Laakiin sidee ayay tani u saamaynaysaa wakhtiga fulinta?
Algorithm-ka ugu fiican waa kala-soocida degdega ah, oo leh kakanaanta wakhtiga O(Nlog(N)). Haddii aan u isticmaalno xalkeena ugu fiican, waxqabadkeedu wuxuu ka beddeli doonaa O(N) ilaa O (Nlog(N)). Suurtagal ma tahay in la helo xal toosan oo aan la amrin?
Xalka 4
Kakanaanta wakhtiga: O(N).
Kakanaanta booska: O(N).
Haa, xal toosan ayaa jira; waxay u baahan tahay abuurista hannaan cusub oo ka kooban liiska tartammada aanu raadinayno. Ganacsiga halkan waa kordhinta isticmaalka xusuusta: tani waa xalka kaliya ee warqadda leh kakanaanta meel bannaan oo ka weyn O(1).
Haddii qiimaha ugu horreeya ee shaxda la bixiyay uu yahay 1, qiimaha aan raadinayna uu yahay 8, waxaan ku dari karnaa qiimaha 7 ee "qiyamka raadinta".
Ka dib, marka aan farsameyno qayb kasta oo ka mid ah shaxanka, waxaan hubin karnaa "qiimaha raadinta" oo arag haddii mid iyaga ka mid ah uu le'eg yahay qiimahayaga. Hadday sidaas tahay, run baynu ku noqonaynaa.
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;
};Xuddunta xalku waa loop, kaas oo, sidaan kor ku soo aragnay, leh kakanaanta wakhtiga tooska ah O(N).
Qaybta labaad ee habaynta shaqadeena waa Array.prototype.include(), hab JavaScript ah oo soo celin doona run ama been iyadoo ku xidhan in shaxdu ka kooban tahay qiimaha la bixiyay.
Si aad u ogaato kakanaanta wakhtiga Array.prototype.includes(), waxaan tixgelin karnaa buuxinta polyfill ee ay bixiso MDN (oo ku qoran JavaScript), ama isticmaal habka koodhka isha ee mashiinka JavaScript sida 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;
}
});
}Halkan, qaybta soo noqnoqota ee Array.prototype.include() waa in yar oo wareeg ah tallaabada 7, taas oo (ku dhawaad) dhex marta dhammaan dhererka diyaarinta la bixiyay. Tani waxay ka dhigan tahay kakanaanta wakhtiga sidoo kale waa toosan. Maadaama ay had iyo jeer hal tallaabo ka danbeyso shaxeena ugu muhiimsan, kakanaanta wakhtiga waa O(N + (N - 1)). Isticmaalka Qoraalka Weyn, waxaanu tan u fududaynaynaa O(N) -sababtoo ah N waxay leedahay saamaynta ugu wayn marka cabbirka wax gelinta uu kordho.
Marka laga hadlayo kakanaanta booska, array dheeraad ah ayaa loo baahan yahay kaas oo dhererkiisu muraayad u yahay shaxdii asalka ahayd (hal laga jaray, haa, laakiin tan waa la iska indho tiri karaa), taasoo keenta kakanaanta meel bannaan ee O(N). Isticmaalka xusuusta ee kordhay waxay xaqiijinaysaa waxtarka algorithm ee ugu sarreeya.
Waxaan rajeynayaa inaad maqaalkan u aragto mid faa'iido u leh kabista wareysiga fiidiyowga. Waxay muujinaysaa in dhibaatada fudud lagu xallin karo dhowr siyaabood oo kala duwan, mid kasta oo leh xaddi kheyraad kala duwan (waqti, xusuusta).
Skillbox waxay ku talinaysaa:
- Codsaday koorsada khadka tooska ah .
- Koorso onlayn ah .
- Koorsada sanadka ee wax ku oolka ah .
Source: www.habr.com
