Dictionary (yoki Symbol table)
Dictionary ma'lumot tuzilmasi haqida eşitmagan bölişingiz mumkin, lekin dasturlaş jarayonida köp foydalanganingiz aniq. Dictionary'ga misol qilib Javascriptda object'lar, yoki PHP'da assotsiativ array'lar, Python'da Map'ni keltiriş mumkin.
Dictionary (yoki Symbol table) - obyektlar guruhini özida jamlagan ma'lumot tuzilmasi. Unda özaro boğlangan kalit (key) va qiymat (value) guruhi saqlanadi. Dictionary'dan ma'lumotni key'ni körsatgan holda olinadi.
Masalan:
const cars = {
'Mercedes': 'S223',
'BMW': 'X7',
'Mazda': 'CX-30'
}
cars içidan Mazda modelini çaqiriş uçun
cars['Mazda'] // CX-30
Dictionary'ning effektivligini tuşuntiriş uçun intervyuda beriladigan oddiy savollardan birini körib çiqamiz.
Masala: Matn içidan berilgan sözdagi harflar borligini tekşiring.
const stringA = "Hello"
const stringB = "Goodbye"
Odatiy yeçim - ikki sikl içida har bir sözning harflarini soliştirib çiqiş böladi. Bu metodning nomini Brute Force deyiladi.
Hm... Yeçim bor, lekin Brute Force samarali emas. Time complexity - O(N2). Ikki katta matnni soliştirişda esa, mos keladigan harflar vaqtliroq uçraşini umid qilib ötirasiz. Aks holda dasturning işlaşi uzoq vaqt oladi.
Endi dictionary'dan foydalangan holda masalani işlaymiz. Bunda stringA'ni dictionary'ga yiğamiz.
Brute Force bilan taqqoslaganda, dictionary' yordamida işlaş qanday afzallik berdi?
- Time complexity - O(N) ga tuşdi.
- Dictionary'da faqat unikal harflar yiğildi.
Kod
Boşqa ma'lumotlar tuzilmasi kabi Dictionary uçun ham biz API yozişimiz mumkin edi, ammo Javascript bu safar özining tayyor funksiyalari bilan işimizni yengillaştiradi.
Map - key/value birikmalarini özida saqlovçi tuzilma (dictionary ta'rifi Map uçun mos tuşadi). Map'ning object'dan farqi - Map'ga ma'lumot saqlaşda key'ni istalgan körinişda bersa böladi, hatto key uçun object bersa ham.
Uning metodlari:
Map'dan foydalanib endi yuqoridagi masalani boşqatdan yozamiz.
Ok, bitta qismi yoqmayapti:
dictionary.set(stringA[i], stringA[i]);
Qiymat berilişi ortiqçalik qilyapti. Unikal key'larning özini saqlaşning imkoni bormi?
Bor, lekin u holatda dictionary bölmay qoladi. Biz Javascriptning Set klassidan foydalanamiz.
Set - faqat unikal qiymatlarni özida saqlovçi tuzilma.
Endi yuqoridagi masalani Set böyiça yozib, biroz optimallaştiramiz.
stringB'ni ham Set'ga yiğişimiz mumkin, şunda iteratsiya qadamlari keskin kamayadi. Qisqargan kod:
Böldi. Yana nimani qisqartiriş mumkin?.. :D