ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΡΡΠ°Π²Π°Ρ
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅, ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ
Π½Π° ΡΠΎΠ²Π°
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ Π²ΠΈΠ΄ ΡΡΠΏΡΠΎΠ²ΠΎΠ΄ ΠΊΡΠΌ Π²ΠΈΠ΄Π΅ΠΎΡΠΎ. Π Π½Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΌ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΏΠ»ΡΡ ΠΌΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π² JavaScript. ΠΠ±ΡΡΠΆΠ΄Π°Ρ ΡΠ΅ ΠΈ Π½ΡΠ°Π½ΡΠΈΡΠ΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ PROβ .
ΠΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ·ΡΠ²Π»Π΅Π½ΠΈΠ΅
ΠΠ°Π΄Π΅Π½ Π½ΠΈ Π΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠ°ΡΠΈΠ² ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π²ΡΡΡΠ° true ΠΈΠ»ΠΈ false Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠΎΠ²Π° Π΄Π°Π»ΠΈ ΡΡΠΌΠ°ΡΠ° ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄Π²Π΅ ΡΠΈΡΠ»Π° Π² ΠΌΠ°ΡΠΈΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡΠ°Π²Π½Π° Π½Π° Π΄Π°Π΄Π΅Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ.
Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΠΈΠΌΠ° Π»ΠΈ Π΄Π²Π΅ ΡΠ΅Π»ΠΈ ΡΠΈΡΠ»Π° Π² ΠΌΠ°ΡΠΈΠ²Π°, x ΠΈ y, ΠΊΠΎΠΈΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ±Π΅ΡΠ°Ρ Π·Π°Π΅Π΄Π½ΠΎ, ΡΠ° ΡΠ°Π²Π½ΠΈ Π½Π° ΡΠΊΠ°Π·Π°Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ?
ΠΡΠΈΠΌΠ΅Ρ Π
ΠΠΊΠΎ Π½ΠΈ Π΅ Π΄Π°Π΄Π΅Π½ ΠΌΠ°ΡΠΈΠ² [1, 2, 4, 9] ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π΅ 8, ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅ Π²ΡΡΠ½Π΅ false, Π·Π°ΡΠΎΡΠΎ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π΄Π²Π΅ ΡΠΈΡΠ»Π° Π² ΠΌΠ°ΡΠΈΠ²Π° Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π΄Π°Π΄Π°Ρ ΡΠ±ΠΎΡ Π΄ΠΎ 8.
ΠΡΠΈΠΌΠ΅Ρ Π
ΠΠΎ Π°ΠΊΠΎ ΡΠΎΠ²Π° Π΅ ΠΌΠ°ΡΠΈΠ² [1, 2, 4, 4] ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π΅ 8, ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΡΠ½Π΅ true, Π·Π°ΡΠΎΡΠΎ 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, Π½ΠΎ Π² ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΎΠΏΡΠΈΠΈ).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈ for ΡΠΈΠΊΠ»ΠΈ, ΡΠΎ Π΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠΈΡΠ½ΠΎ Ρ O(NΒ²) Π²ΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 2: ΠΠ²ΠΎΠΈΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅
ΠΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: O(Nlog(N)).
ΠΠΎΡΠΌΠΈΡΠ΅ΡΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: O(1).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ°ΡΠΈΠ²ΠΈΡΠ΅ ΡΠ° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΡΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΌΠ°ΡΠΈΠ²ΠΈ. Π‘Π°ΠΌΠΎΡΠΎ Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅ ΠΈΠΌΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° O(log(N)). ΠΡΠ΅ ΠΏΠ°ΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ for ΡΠΈΠΊΡΠ», Π·Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΡΠΌΠΎ Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ° Π΄Π° ΠΈΠ·ΡΡΠ½ΠΈΠΌ Π½Π΅ΡΠ°ΡΠ°, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎΡΠΎ ΡΡΡΡΠ΅Π½Π΅. Π ΡΡΡΠΎ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° 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]. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΌΠ°ΡΠΈΠ²Π°, ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°ΡΠ° ΠΏΡΡΠ²ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈ Π΄Π°Π»ΠΈ Π½ΡΠΊΠΎΡ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΊΡΠΌ ΠΌΠ°ΡΠΈΠ²Π°, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΆΠ΅Π»Π°Π½Π°ΡΠ° ΡΡΠΌΠ°. Π’ΠΎΠ²Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π²Π΅Π΄Π½ΡΠΆ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π² ΠΌΠ°ΡΠΈΠ²Π°.
Π‘Π°ΠΌΠΈΡΡ for ΡΠΈΠΊΡΠ» ΡΠ΅ ΠΈΠΌΠ° Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΎΡ O(N), Π½ΠΎ Π²ΡΡΡΠ΅ Π² for ΡΠΈΠΊΡΠ»Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΠΎ ΡΡΡΡΠ΅Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ Π΄Π°Π²Π° ΠΎΠ±ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΎΡ O(Nlog(N)). Π’ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΎ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎΡΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ° ΠΌΡΡΡΠΎ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ 3: ΠΠΈΠ½Π΅ΠΉΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅
ΠΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: O(N).
ΠΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ: O(1).
Π‘Π΅Π³Π° ΡΠ΅ ΡΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ ΠΌΠ°ΡΠΈΠ²ΡΡ Π΅ ΡΠΎΡΡΠΈΡΠ°Π½. Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ Π΄Π²Π΅ ΡΠΈΡΠ»Π°: Π΅Π΄Π½ΠΎ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ ΠΈ Π΅Π΄Π½ΠΎ Π² ΠΊΡΠ°Ρ. ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ, ΠΏΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ Π½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΈ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ°.
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΈΠ»ΠΈ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΠΌ ΠΆΠ΅Π»Π°Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΈ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ true, ΠΈΠ»ΠΈ Π½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΈ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΠ±Π»ΠΈΠΆΠ°Ρ ΠΈ ΡΠ΅ Π²ΡΡΠ½Π°Ρ false.
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 ΠΊΡΠΌ ΠΌΠ°ΡΠΈΠ²Π° βΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅β.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΎΡ ΠΌΠ°ΡΠΈΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΌΠ°ΡΠΈΠ²Π° ΠΎΡ βΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅β ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ Π΅Π΄Π½Π° ΠΎΡ ΡΡΡ Π΅ ΡΠ°Π²Π½Π° Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ. ΠΠΊΠΎ Π΄Π°, Π²ΡΡΠ½Π΅ΡΠ΅ true.
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;
};
ΠΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ for ΡΠΈΠΊΡΠ», ΠΊΠΎΠΉΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π²ΠΈΠ΄ΡΡ ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΈΠΌΠ° Π»ΠΈΠ½Π΅ΠΉΠ½Π° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ O(N).
ΠΡΠΎΡΠ°ΡΠ° ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½Π° ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΅ Array.prototype.include(), JavaScript ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π²ΡΡΠ½Π΅ true ΠΈΠ»ΠΈ false Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠΎΠ²Π° Π΄Π°Π»ΠΈ ΠΌΠ°ΡΠΈΠ²ΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π΄Π°Π΄Π΅Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ.
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ Π½Π° Array.prototype.includes(), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ polyfill, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ ΠΎΡ MDN (ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° JavaScript) ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° JavaScript Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» ΠΊΠ°ΡΠΎ 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() Π΅ ΡΠΈΠΊΡΠ»ΡΡ while Π² ΡΡΡΠΏΠΊΠ° 7, ΠΊΠΎΠΉΡΠΎ (ΠΏΠΎΡΡΠΈ) ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· ΡΡΠ»Π°ΡΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΌΠ°ΡΠΈΠ². Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΡΡΡΠΎ Π΅ Π»ΠΈΠ½Π΅ΠΉΠ½Π°. Π, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π΅Π΄Π½Π° ΡΡΡΠΏΠΊΠ° Π·Π°Π΄ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ Π½ΠΈ ΠΌΠ°ΡΠΈΠ², Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ Π΅ O (N + (N - 1)). ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Big O Π½ΠΎΡΠ°ΡΠΈΡ, Π½ΠΈΠ΅ Π³ΠΎ ΠΎΠΏΡΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄ΠΎ O(N) - Π·Π°ΡΠΎΡΠΎ N ΠΈΠΌΠ° Π½Π°ΠΉ-Π³ΠΎΠ»ΡΠΌΠΎ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ.
ΠΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΠΌΠ°ΡΠΈΠ², ΡΠΈΡΡΠΎ Π΄ΡΠ»ΠΆΠΈΠ½Π° ΠΎΡΡΠ°Π·ΡΠ²Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΠΌΠ°ΡΠΈΠ² (ΠΌΠΈΠ½ΡΡ Π΅Π΄Π½ΠΎ, Π΄Π°, Π½ΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°), ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ O(N) ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ. Π, ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ°.
ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΊΠ°ΡΠΎ Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π²Π°ΡΠ΅ΡΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Ρ. Π’ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½Π° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ (Π²ΡΠ΅ΠΌΠ΅, ΠΏΠ°ΠΌΠ΅Ρ).
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Pythonβ .- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΡΠΎΡΠ΅ΡΠΈΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ
βPHP ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 0 Π΄ΠΎ PROβ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com