Bu nümunə obyektlərdən (objects) və ya dəstlərdən (sets) istifadə edərək dəyərlərin və ya onların tezliklərinin toplanmasını nəzərdə tutur. Bu yanaşma, çox vaxt daxili döngülərin (nested loops) və O(n²) əməliyyatlarının qarşısını almağa kömək edir, xüsusən də massivlər (arrays) və sətirlərlə (strings) işləyərkən.
Misal
İki sətir verildikdə, ikinci sətirin birinci sətirin anagramı olub-olmadığını müəyyən edən bir funksiya yazın.
Anagram nədir?
Anagram – bir söz və ya ifadənin hərflərini yenidən düzərək başqa bir söz və ya ifadə yaratmaqdır.
Məsələn:
- "cinema" → "iceman"
- "listen" → "silent"
Direkt həll (O(n log n))
Bu yanaşma, hər iki sətiri hərflərinə ayırıb sıralamaq və sonra onları müqayisə etmək üsuluna əsaslanır.
Kod:
function isAnagram(str1, str2) {
// Uzunluqlar fərqlidirsə, anagram ola bilməz
if (str1.length !== str2.length) {
return false;
}
// Hərfləri ayırıb sıralayırıq
const arr1 = str1.split('').sort();
const arr2 = str2.split('').sort();
// Sıralanmış massivləri müqayisə edirik
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
// Test
console.log(isAnagram("cinema", "iceman")); // true
console.log(isAnagram("hello", "world")); // false
Bu həllin mürəkkəbliyi: O(n log n) (çünki sıralama əməliyyatı O(n log n) vaxt aparır).
Tezlik sayğacı ilə həll (O(n))
Bu yanaşma hərflərin sayını obyektlərdə saxlayaraq müqayisə etməyə əsaslanır. Sıralama əvəzinə sayma üsulu istifadə olunduğu üçün daha sürətlidir və O(n) mürəkkəbliyinə malikdir.
Kod:
function validAnagram(str1, str2) {
if (str1.length !== str2.length) return false;
const obj = {};
// İlk sətirdəki hərfləri sayırıq
for (let i = 0; i < str1.length; i++) {
const letter = str1[i];
obj[letter] = ++obj[letter] || 1;
}
// İkinci sətirdəki hərfləri yoxlayırıq
for (let j = 0; j < str2.length; j++) {
const letter = str2[j];
if (!obj[letter]) {
return false;
} else {
obj[letter]--;
}
}
return true;
}
// Test
console.log(validAnagram('anagram', 'nagaram')) // true
console.log(validAnagram('anagrams', 'nagaramm')) // false
console.log(validAnagram("rat", "car")) // false
Bu həllin mürəkkəbliyi: O(n) (çünki hər iki sətir yalnız bir dəfə dövr edilir).
Nəticə
Direkt həll sətirləri sıralamaqla müqayisə edir və O(n log n) mürəkkəbliyinə malikdir.
Tezlik sayğacı həlli isə hərflərin sayını yoxlamaqla daha sürətli və effektivdir (O(n)).
Tezlik sayğacı nümunəsi, yalnız anagram yoxlamaq üçün deyil, müxtəlif massiv və sətir analizlərində də faydalıdır!