Tsüklite liigsete iteratsioonide optimeerimine JavaScriptis
Järgmises koodis kontrollib üks programmeerija,
kas massiivis on number 3:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
}
}
console.log(exists);
Mis on selle lahendusega valesti? Näib, et
tsüklis ei tehta üleliigseid operatsioone. Probleem
on aga selles, et pärast seda, kui on kindlaks tehtud,
et number 3 on massiivis, jätkab
tsükkel ikkagi kuni massiivi lõpuni.
Kõige ebaratsionaalsem on see, kui number 3
leitakse kuskil massiivi alguses, kuid massiiv ise
on pikkusega, näiteks 1000 elementi.
Sel juhul tehakse tuhat kasutut lisatsüklit!
Mitte optimaalselt.
Optimeerime koodi, peatades tsükli õigel ajal:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
break;
}
}
console.log(exists);
Järgmine kood loeb kokku, mitu
massiivi elementi tuleb liita,
et summa muutuks suuremaks kui 10.
Tehke optimeerimine:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let sum = 0;
let i = 1;
for (let elem of arr) {
sum += elem;
if (sum <= 10) {
i++;
}
}
console.log(i);
Järgmine kood väljastab paarisarvud antud vahemikust. Tehke optimeerimine:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0) {
console.log(i);
}
}
Järgmine kood väljastab arvud,
mis jaguvad samaaegselt nii 2-ga
kui ka 3-ga. Tehke optimeerimine:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0 && i % 3 === 0) {
console.log(i);
}
}
Järgmine kood otsib kõik reeded,
mil on 13. praegusel aastal.
Tehke optimeerimine:
for (let i = 0; i <= 11; i++) {
let curr = new Date;
let last = new Date(curr.getFullYear(), i + 1, 0).getDate();
for (let j = 1; j <= last; j++) {
let date = new Date(curr.getFullYear(), i, j);
if (date.getDate() === 13 && date.getDay() === 5) {
console.log(date);
}
}
}