ášá áááªáá á áá»ážáá á³á á áá
á á áá¥áá áá áá¢
áá
áœáá ášáªá²á®á áá á á¥á® ášáááµ á áááµ ááᢠá á¥á± ááµá¥ á ááá ášáá³á© áááµááᜠáá á áµá°á«ášá¶áœá á ááá£áá, á á°ášááªá ášá«áŽá ášáááµáá á¥áµá á áá« áµááªááµ. ášá¥á«áá³áá± á áááªáá áá©áá¶áœá á°á¥á«áá°áá.
á¥á á¥ááµá³ááµáá³áá- áááá áš "áá¥á" á áá£á¢áᜠ- áš "Habr" ášááµá°áááá« á®áµá á áá áá á ááááá áš Skillbox á®ááµ ááµá¥ á²áááá¡ áš 10 á©á¥ááµ á ááœ.
Skillbox áááá«áá¡ á°áá£á«á á®ááµ
"áá£áá ááᢠPRO" .
ášáœáá© ááá
ášá³áá áµááµá á¥á ášá°áá°á á¥áŽáµ á°á°á¥á¶ááᢠášáá«á á áµááµá© ááµá¥ á«ááµ ášááá± áá¥á®áœ áµáá ášá°á°á á á¥áŽáµ áá á¥á©á ááá ááœáá á ááá áá á áááµášáµ á¥áááµ ááá áá°áµ ášááááµ á°áá£á á¥áá²áá¥á áá ášááá¢
á áá á ááááᣠá áµááµá ááµá¥ áááµ á¢áá²áá®áœ á á 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 áá á²áá»ážá á°áá³á³á áá, ááá áá á áá áááµá ááá±áá á áá«á®áœ á¥áááá«áá).
áááá«á±á ášá¥á áááµá á loops á¥ááµ ááááœá áµááá ááᣠᚠO(N²) ášáá ááµá¥áµá¥ááµ áá á³áµá«á²á ááá¢
áááµá 2: áááµá®áœ ááá
ášáá ááµá¥áµá¥ááµá¡ O(Nlog(N))á¢
ášáŠá³ ááµá¥áµá¥ááµá¡ O(1).
áµááµá®áœ áµáá³ááᣠáááµá®áœ áááá á áá áá áááµá áááá á¥ááœáááᢠáá áá³áá áµááµá®áœ á á£á ááá£áá áµáá° ááá ááᢠášáááµá®áœ ááá á«á± ášO(áá(N)) áá á ááᢠááá ááᣠá ááá á¥á«áá³áá±á áá¥áš ááá ášááᜠá¥áŽá¶áœ áá áááá°áœ á loop áá áá á«áµááááá³áá¢
áááµáá áá á¥áá°áááµá á¥ááᢠááá®áœá ááᜠáááµášáᣠáááµá®áœ áááá áááá£á á ášá°ááš á°áá£á á¥áá ááááᢠá¥á á¥áá²áá ášááµáááµ á¢ááŽááµ() á°áá£áᣠášá°á°á á á¢ááŽááµ á²áááµ ášáµááµááá á¥áµá áááá³áá¢
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] áááá«áᢠášáá«á ášááááªá«áá á¢ááŽááµ á³áášáá ášáµááµá á¥áªáµ ááá¥á«á á¥á ášá°ááááá áµáá áááášáµ ááªáá¹ á¥áŽá¶áœ áá° áµááµá áášáá áá»á á¥áá°áá ááášáµ áááµá®áœ áááá áá áááᢠáá á¥ááá á áµááµá ááµá¥ ááá á¥á«áá³áá± á á«á á ááµ áá áášááááá¢
áš loop á«á± ášO(N) ášááµáá áá ááµá¥áµá¥ááµ ááášááᣠááá áá á loop ááµá¥ áááµá®áœ ááá á¥áá°ááááᣠáá á á á ááá áš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)) áá£á áµááµá ááᢠá á¥á ááᥠáááµá ášá°á áááá áµ á ááááá ášáŠ(N) áá° áŠ(Nlog(N)) áááá«áᢠá«áá³áá áµááµá áá ááµáá«á áááµá ááááµ áá»áá?
áš 4 áááµá
ášáá ááµá¥áµá¥ááµá¡ O(N)á¢
ášáŠá³ ááµá¥áµá¥ááµá¡ O(N)
á áᣠááµáá«á áááµá á áဠáá áá áááµášá ášááááááá ášá°áááᜠáááá ášá«á á á²áµ á á°á«á°á ááá á á áá¥áᢠá¥áá á«áá ášáááµ áááᥠášá áá ášáá á°áš áµááµá³ á á ááá ááá¡ ášáŠ(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;
};
ášáááµáá áá°ášáµ á loop áá, á¥á±á ášáá á¥áá³ášáá, áš O (N) ášááµáá áá ááµá¥áµá¥ááµ á áá.
ááá°áá ášá°áá£á«áœá á°á°ááá ááá Array.prototype.include() ááᣠášáá« áµááªááµ áᎠáµááµá ášá°á°á áá á¥áŽáµ á¥áá°á«áá áá á áááµášáµ á¥áááµ ááá áá°áµ ášááááµ ááá¢
áš Array.prototype.includes()á ášáá ááµá¥áµá¥ááµ áááá á á€áá²á€á ášáášá áá (á¥á á áá«áµááªááµ ášá°á»ááá) áááá áášáµ á¥ááœááá ááá á áá« áµááªááµ áá°á ááá á®áµ á¥áá° 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() á°á°ááá ááá á á°ášá 7 áá á«áá ášáá áá°áµ áá (ášáá áá°á) ášá°á°á áá áµááµá áááá ááááµ ášáá«ááᢠáá áááµ ášáá ááµá¥áµá¥áá±á ááµáá«á ááᢠá°á áᣠáááá ášááá áµáá°á«áœá á ááµ á¥ááá á áá áµáááᣠášáá ááµá¥áµá¥áá± O (N + (N - 1)) ááᢠá¢á አááŽáœá á áá ááᣠáá° O(N) á¥ááááá - áááá«á±á ášáá¥á áµ áá áá á²ášáá áµáá á°áœá¥á á«áá N ááá¢
ášáŠá³ ááµá¥áµá¥ááµá á á°ááášá°á£ áááá± ášááááªá«áá áµááµá ášáá«áážá£áá á°ášá᪠áµááµá á«áµáááá (á ááµ á²áááµ á áᣠáá áœá áá£á ááœáá) áá á áš O(N) ášáŠá³ ááµá¥áµá¥ááµ á«áµášáµááᢠá°á á ᣠášáá á°áš áµááµá³ á á ááá ášáá°ááá ášá áááªáá áá€á³áááµ á«ášááá£áá¢
áœáá ááªá²á® áá áá áá á¥áá° ááá« á áá áá á¥áá³áááµ á°áµá á á°ááááᢠááá áœáá á á°áá«á© áááá¶áœ á á°áá«áš áá á á¥á á áá ášáá (áá, áá á°áš áµááµá³) á áá áá ááá³áµ á¥áá°áá»á á«á³á«á.
Skillbox áááá«áá¡
- á ááµáá áá á®ááµ á°á°áá¥á¯á
"Python ááᥠá°áá³á" .- ášááµáá áá á®ááµ
"ášáá« ááá£á ááá¢" .- á°áá£á«á áááµ á®ááµ
"PHP ááᢠᚠ0 áá° PRO" .
ááá: hab.com