Ma'lumotlar tuzilmalari va algoritmlarni nega o'rganish kerak? Axir, ularni ishda ishlatmaymanku 🤷‍♂️
Tags: datastructures, algorithms, dsa, javascript
Published: 2023-06-26 16:19:51

_Bismillah. Yosh dasturchi sifatida hayolingizdan bir marta bo'lsa ham, "nega o'zi shu 'data-structures and algorithms' ni o'rganishim kerak?" degan savol o'tgan bo'lsa kerak. Bugun shu savolga javob topishga harakat qilamiz._

_Men maqolada nimanidir tushuntirmoqchi bo'lsam, savolga shunchaki qisqa javob berib qo'ymasdan, o'quvchiga tushunarli bo'lishi uchun javobni uzoqroqdan olib kelaman. Maqolada qo'yilgan savolga javobni topish uchun keling uni turli qismlarga bo'lib tushunishga harakat qilamiz._

Mundarija: 

- Data strukturalar va algoritmlar o'zi nima?
- Data strukturalar va algoritmlar qanday turdagi muammolarga yechim berishda ishlatiladi?
- Data strukturalar va algoritmlar atrofidagi turli myth'larning paydo bo'lishi sabablari nimada?

## Data strukturalar va algoritmlar o'zi nima?
_Bundan buyon, "data strukturalar va algotimlar" **DSA** deb yuritiladi._

**_Ma'lumotlar tuzilmasi (data structure)_** - biror datani kompyuter xotirasida saqlab turish yo'li/ko'rinishi/usuli. Eng ommalashgan ma'lumotlar tuzilmasi turlari _array_, _stack_, _queue_, _hash table_, _graph_, _linked list_ va hokazo. Ularning turlari juda ham ko'p. Dasturlash tillari ularni shu yoki boshqacharoq nom bilan o'zida native implementation'ini taqdim qilishi yoki qilmasligi mumkin. Dasturlash tili uni native support qilmasa, uni yasash mumkin. Har bir tuzilma unga ma'lumotni yozish, chiqarish, o'chirish, o'zgartirish amallarining qanchalik tez, osonliga va tuzilmaning qanday implement qilinganliga ko'ra bir biridan farq qiladi. Quyidagi diagramda qaysi tillar qaysi data strukturani qaysi nom bilan native support qilishini ko'rishingiz mumkin. Bu haqida ko'proq [bu yerda](https://medium.com/omarelgabrys-blog/data-structures-language-support-5f70f8312e84) o'qishingiz mumkin.

![data structures](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e85n2bnu85jjpl3cojig.png)

Data struktura uchun soddaroq tushuntirish bu o'zida turli primitive string, number, integer, float, boolean kabi qiymatlarni saqlab tura oladigan tip. Bunga misol sifatida arrayni keltirish mumkin. U hamma dasturlash tillarida bor.

```
const array = ["Toshmat", "Shermatov", 25, true]

/*
    Eslatma: hamma dasturlash tillari ham JavaScript kabi array ichida turli tipdagi primitive qiymatlarni saqlash imkonini bermaydi
*/

```

**_Algoritm_** - biror bir muammoni hal qilish uchun, turli hisob kitoblar yoki data ustida bajariladigan turli amaliyotlarning tartibli ketma ketligidan iborat bo'lgan instruksiyalar to'plami. Algoritm aynan biror dasturlash tilida ifoda qilinishi shart emas. Uni insonlar muloqot tili, pseudokodlar, flowchartlar orqali ham ifodalash mumkin. Algoritmlar computer science, matematika, injineringni turli yo'nalishlari va xatto ekonomikada ham ishlatilishi mumkin.

Soddaroq tushuntirganda, siz birinchi marta dasturlash tilini o'rganayotgan vaqtingiz yozgan, array ichidan biror elementni topib beradigan kodingiz bu algoritm.

```
const names = ['dory', 'bruce', 'marlin', 'nemo', 'gill', 'bloat', 'nigel', 'squirt', 'darla', 'hank']

const findNemo = (names) => {
    for(let name of names) {
        if(name === 'nemo') {
            return name
        }
    }
}

console.log(findNemo(names))
```
Demak, DSA dasturlashda biror muammoga yechim berish uchun ishlatiladi.

## Data strukturalar va algoritmlar qanday turdagi muammolarga yechim berishda ishlatiladi?

Muammolar juda ko'p. Uning turlari ham. Yechimlar ham muammoning turidan kelib chiqib beriladi.

Software engineering'da _system design_, _design patterns_, _data structures and algorithms_ kabi atamalarga ko'p duch kelasiz. Bularning har biri software development jarayonidagi qaysidir turdagi muammoga yechim berishda ishlatiladigan topic'lardir.

Umumiy dastur infrastrukturasini (servers, networks, databases), scalibility va performance (caching strategies, load balancers, resource utilization) qanday bo'lishini qaror qilishda va bu bilan bog'liq kattaroq muammolarga yechim berishda **_system design_**'ni yaxshi bilish va bilan bog'liq yaxshi ilm va tajribalarni amaliyotga qo'llash kerak bo'ladi.

Dastur infrastrukturasidan so'ng, kod yozish boshlanganda, hamma uchun tushunarli, resusable(qayta ishlatish mumkin bo'lgan), infrastrukturadagi servislarni qurish uchun qulay **_design pattern_** tanlanadi. Design pattern bu system design darajasidan keyin o'rindagi mavjud muammolarga yechim beradi.

Demak biz system design'ni, qaysi servislar uchun qaysi design pattern'ni ishlatishni hal qildik. Endi keyingi bosqichga o'tamiz. Siz bir servis yozayotganingizda, shu servisning bir qismida ayni bir amaliyotni bajaradigan funksiya yozishingiz kerak. Bu funksiya o'ziga integer(raqam) qabul qilishi va shu raqamni RIM raqami ko'rinishiga o'tkazib berishi kerak. Aytaylik, siz ishlayotgan loyihada shunday bir kichik qism bor. Xo'sh, bu ham muammo va bu muammoga qanday yechim beramiz? Quyida, muammoning kengroq ta'rifini o'qishingiz mumkin.

![leetcode problem](https://imgur.com/Jek1TcJ.png)

Ayni muammoga beriladigan yechim uchun yoziladigan amallar ketma ketligi **_algoritm_** va mana shu maummoni yechish uchun datani saqlashda yoki ushlab turishda ishlatadiganlaringiz esa **_data structure_** deyiladi.

Bundan ko'rinib turibdiki, DSA bu system design leveldagi kattaroq, boshqa kategoriyadagi muammolarni hal qilishda emas, ko'proq, dasturning biror qismidagi kichikroq bir taskni qilishdagi biror muammoni hal qilishda asosan ishlatiladi. Lekin bu muammoga beriladigan yechimning oson ekanligini anglatmaydi.

DSA muammolariga berayotgan yechimingiz **_Big O Notation_** yordamida o'lchanadi. Uni o'lchashda asosan ikkita savol beriladi.

- Yechimning muaamoni hal qilishiga qancha vaqt ketadi? (Time complexity)
- Yechimning muammoni hal qilishiga qancha joy/xotira ketadi? (Space complexity)

Yechimning muammoni hal qilish uchun protseccorga ko'p yuklama tushirishi time complexity'ni oshirib yuboradi. Bu odatda loop ichida loop ishlatgan vaqtingiz sodir bo'lishi mumkin (**_O(n2)_**).

Yechimning RAM'ga ko'p yuklama tushirib yuborishi esa, space complexity'ni oshirib yuboradi. Bu ham odatda loop ichida loop ishlatib, uni ichida variable qiymatini o'zgartirgan vaqtingiz sodir bo'lishi mumkin. Bu **_linear space complexity_** deyiladi.

Computer science'da data strukturalar va algoritmlarning o'zaro doim yonma yon kelishi bu ular muammoni hal qilishda doim birga ishlatilishi bilan bog'liq.

Yuqori tezlikka erishish uchun va odatda dasturni ishlatayotgan kompyuterimizda chegaralangan xotira(RAM) bo'lgani sababli, DSA muammolariga berilayotgan yechimning judayam kam xotira ishlatadigan va execution uchun ham kam vaqt sarflaydigan bo'lishi judayam muhim hisoblanadi.

## Data strukturalar va algoritmlar atrofidagi turli myth'larning paydo bo'lishi sabablari nimada?

Dasturchilar endi biror dasturlash tilini o'rganib, kod yozishni boshlaganlarida yoki xatto allaqchon ishlab yurgan dasturchilarda ham quyidagi o'y va savollar qachondir paydo bo'lgan bo'lishi mumkin:

- Data strukturalar va algoritmlar nega kerak?
- Men birorta algoritmni o'rganmagan bo'lsam ham ishlab yuribmanku.
- Men birorta o'rgangan algoritmimni ishimda ishlatmadim.
- Algoritmlar baribir ishda ishlatilmasa, uni nega interview savollarida so'rashadi?

DSA haqida siz o'ylayotgan o'ylar bir vaqtning o'zida to'g'ri va xato bo'lishi mumkin.

Bilasizmi, bunaqa o'y va savollarga juda ko'p omillar sabab bo'ladi. Lekin men shu omillarni jamlashga va tartiblashga harakat qilaman va yuqoridagi savollarga javob topishga urunamiz.

**DSA muammolarining va unga beriladigan yechimning siz ishlayotgan loyihadagi ahamiyati.** Turli software dasturlarda turli leveldagi muammolarning prioritet darajasi bo'ladi. Tushunishingiz uchun misol keltiraman. Bir yigit start-up boshlamoqchi. Uning qo'lida judayam kam mablag' va start-upni bozorga olib chiqish uchun judayam qisqa vaqt bor. Yigit judayam tajribali software architector, system engineer, cloud engineer, frontend va backend specialistlaridan iborat jamoa tuzishga cho'ntagi ko'tarmaydi. Hozircha faqat bitta middle full-stack developer ishga ola oladi. Bu dasturdagi birlamchi muammo esa shu dasturni belgilangan funksionalliklari bilan tezroq bozorga chiqarish. Owner uchun servislar ichidagi qaysidir taskka javob beradigan funksiyani 5-10 millisekundga tezroq ishlashi umuman muhim emas. U dasturchi shunaqa qilishi uchun vaqt sarflab o'tirishini ham istamaydi.

Bunaqa holda dasturni yozishda, fancy system-design qilish, good design pattern tanlash, DSA tasklarni time va space compelexity tomonlama optimizatsiya qilish prioritet tomondan oxirgi o'rinlarga tushib ketadi. "Ishlasa bo'ldi" uslubida development jarayoni boshlanadi. Chunki MVP chiqarish uchun shuni o'zi yetarli.

Bundan loyihalarda ishlaydigan dasturchilarda yuqoridagi kabi savollar va o'ylar tug'ilishni boshlaydi. Chunki rostan ham siz qaysidir pattern, arxitektura, algoritmni dokumenentatsion to'liq o'rganib chiqmasangiz ham, kallani ishlatib dastur yozishingiz mumkin. Demak, ko'rinib turibdiki, DSA muammolarining prioritet darajasi yuqori bo'lmasa, DSA ni bilmasangiz ham ishlay olasiz.

Boshqa tomondan, agar siz millionlab foydalanuvchilari bor yoki ishga tushirilganda shuncha foydalanuvchi ishlatishi mumkin bo'lgan loyihada ishlayapsiz deb tasavvur qilaylik.

Foydalanuvchilar sonining ko'pligi, dasturning judayam katta ekanligi yoki katta boshqa dasturlar bilan integratsiyaga kirishishi uni shunchaki randomly yozib qo'ya olmaysiz degani. Undagi muammolarning darajasi ham katta bo'ladi. Dastur ishlashidagi 1-2 sekund kechikishlar ham millionlab dollar zarar olib kelishi mumkin. Ana shunday holatda, siz DSA muammolariga beradigan yechimingiz eng optimali va eng yaxshisi bo'lishi kerak bo'ladi. Muammoni yechayotganda unga mos keladigan eng yaxshi data strukturani tanlay olish, u bilan bog'liq write/read/update cost'larini hisoblab, allaqachon ma'lum algoritmlardan keraklilarini o'zgartirilgan yoki shunday holda muammoga yechim sifatida ishlata olish qobilyati judayam judayam muhim bo'ladi.

Odatda FAANG kompaniyalarda bunday muammolarning ham prioritet darajasi yuqori bo'ladi. Balki, FAANG uchun interviewlarda shu sababli ham DSA masalalari berilar.

**Xulosa.**
DSA ni dokumentatsion o'rganmagan bo'lsangiz ham, hammaga ma'lum data strukturalarni va algoritmlarni bilmasangiz ham kod yoza olasiz. Xatto u kod ishlayveradi ham. Lekin siz bu bilan kompaniyaga qanchalik qiymat berayotganingizni ham o'ylang. Judayam ko'pchilik bunaqa qila oladi. Murakkabroq muammolar ustida ishlamoqchi bo'lsangiz, qadringizni oshirmoqchi bo'lsangiz va katta kompaniyalarda ishlamoqchi bo'lsangiz DSA ni o'rganing. Shunchaki emas, tartibli o'rganing. O'rganganlaringizni Leetcode'da amaliyot qiling.