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!
Bu yazıda başıma gələn hadısənin həllini heç-bir yerdə tapa bilməyərək müxtəlif resurslardan toplayaraq bir araya gətirmək istədim. ChatGPT sağolsun müəyyən əmrlərlə yardımçı olurdu lakin ardıcıllıq çox önəmli olduğundan proses tamamlanmırdı.
Deməli iki server düşünün, A serverində işləyərkən onun dataları xarab olur və sən ayarları kopyalaya bilmirsən. Əgər sizin də Contabo serverinizdə layihəniz varsa o zaman bu sizin başınıza da gələ bilər
Nə yaxşı ki, backup məntiqini düşünmüşdüm və layihələrin əsas data-ları bərpa etmək asanlıqla mümkün oldu.
Bir həftədən sonra B serverini aldım və yenidən A serverində nələr etmişdimsə onu da konfiqurasiya edə bildim. Lakin saytlar yalnız http üzərindən işləyirdi və ya xəta verirdi.
Mən nginx istifadə etdiyimdən online olaraq certbot vasitəsi ilə sertifikatların alınması çətin oldu. Ona görə də ilk öncə nginx-i söndürdüm:
sudo systemctl stop nginx
Sonra offline olaraq sertifikatları yenidən almağa cəht etdim:
sudo certbot certonly --standalone -d example.com -d www.example.com --force-renewal
Proseslərə razılığımı verdim və sertifikatlar uğurla yeniləndi. Sonra sayt üçün nginx configləri yenilədim. Ən önəmlisi də ssl_certificate hissəsinə nəzər yetirmək lazımdı ki, yenicə əldə etdiyimiz serifikatları düzgün təyin edə bilək.
# /etc/nginx/site-available/example.com
server {
server_name example.com www.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8001;
proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
}
Sonra nginx işə salırıq:
sudo systemctl start nginx
Əgər hər şeyi düzgün konfiqurasiya etmisinizsə o zaman xəta çıxmayacaq.
Abstract Factory nümunəsi, konkret klasları(classes) göstərmədən, bir-biri ilə əlaqəli və ya asılı olan obyektlər ailəsini yaratmaq üçün bir interfeys təmin edir.
Misal üçün
// Abstrakt Məhsul
class Button {
render() {
throw new Error("Bu metodu override edin!");
}
}
Button klası abstrakt məhsuldur. O, bu klası genişləndirən hər hansı konkret məhsul tərəfindən mütləq yenidən yazılmalı olan render metodunu müəyyən edir.
// Konkret Məhsul
class WindowsButton extends Button {
render() {
console.log("Windows üslubunda düymənin göstərilməsi.");
}
}
class MacOSButton extends Button {
render() {
console.log("MacOS üslubunda düymənin göstərilməsi.");
}
}
WindowsButton və MacOSButton, Button klasını genişləndirən konkret məhsullardır. Onlar render metodunun spesifik realizasiyasını təmin edirlər.
// Abstrakt fabrik
class GUIFactory {
createButton() {
throw new Error("Bu metodu override edin!");
}
}
GUIFactory klası abstrakt fabrikdir. O, bu klası genişləndirən hər hansı konkret fabrik tərəfindən mütləq yenidən yazılmalı olan createButton metodunu müəyyən edir.
// Konkret fabrik
class WindowsFactory extends GUIFactory {
createButton() {
return new WindowsButton();
}
}
class MacOSFactory extends GUIFactory {
createButton() {
return new MacOSButton();
}
}
WindowsFactory və MacOSFactory, GUIFactory klasını genişləndirən konkret fabriklərdir. Onlar createButton metodunun spesifik realizasiyasını təmin edirlər və müvafiq olaraq WindowsButton və MacOSButton instansiyalarını qaytarırlar.
// Klient tərəfin kodu
function createUI(factory) {
const button = factory.createButton();
button.render();
}
createUI funksiyası, fabriki istifadə edərək düymə yaratmaq və render etmək üçün klient kodudur. Bu funksiya fabriki arqument olaraq qəbul edir, fabrikin createButton metodunu çağırır və düyməni alır, sonra isə düymənin render metodunu çağırır.
İstifadəsi
const windowsFactory = new WindowsFactory();
createUI(windowsFactory);
const macFactory = new MacOSFactory();
createUI(macFactory);
Xülasə
Burada, biz WindowsFactory və MacOSFactory instansiyalarını yaradıb, onları createUI funksiyasına ötürürük. Bu, kodun fərqli fabriklərlə işləyərək düymələri müxtəlif üslublarda yaratma və render etmə üsulunu nümayiş etdirir. Abstract Factory nümunəsi klient kodunun yaratması lazım olan obyektlərin konkret klaslardan ayrılmasına imkan verir, bu da çeviklik və genişlənə bilənlik təmin edir.
-
Kompüter elmi
Kompüter elmləri əsaslı müzakirə kateqoriyası
2 2 -
-
-
-
-