Ma'lumotlar tuzilmasi va turlari
Ma'lumotlar tuzilmasi (Data Structure) — bu ma'lumotlarni saqlash va tartibga solish uchun foydalaniladigan maxsus xotira tuzilmasidir. Bu kompyuterda ma'lumotlarni shunday joylashtirish usuliki, ularga keyinchalik juda tez va samarali murojaat qilish, qidirish hamda yangilash imkoniyati yaratiladi.
Talabingiz va loyihangiz xususiyatiga qarab, to'g'ri ma'lumotlar tuzilmasini tanlash juda muhimdir. Masalan, agar siz ma'lumotlarni xotirada ketma-ket saqlashni xohlasangiz, Massiv (Array) ma'lumotlar tuzilmasidan foydalanishingiz mumkin.

Eslatma: Ma'lumotlar tuzilmasi (Data structure) va ma'lumotlar turlari (Data types) bir oz farq qiladi. Ma'lumotlar tuzilmasi — bu muayyan tartibda tashkil etilgan ma'lumot turlarining to'plamidir.
Asosan, ma'lumotlar tuzilmalari ikkita katta toifaga bo'linadi:
Keling, ularning har birini batafsil ko'rib chiqamiz.
Chiziqli ma'lumotlar tuzilmalarida elementlar ketma-ket, birin-ketin joylashadi. Elementlar ma'lum bir tartibda bo'lganligi sababli, ularni dasturlash va tushunish oson.
Biroq, dasturning murakkabligi va ma'lumotlar hajmi oshgani sayin, chiziqli tuzilmalar amallar bajarish vaqti (operatsion murakkablik) tufayli har doim ham eng yaxshi tanlov bo'lavermaydi.
Eng keng tarqalgan chiziqli ma'lumotlar tuzilmalari:
Massivda elementlar xotirada ketma-ket, uzluksiz yacheykalarda joylashadi. Massivning barcha elementlari bir xil turga tegishli bo'ladi.

Stek ma'lumotlar tuzilmasida elementlar LIFO (Last In First Out — oxirgi kirgan birinchi chiqadi) prinsipi asosida saqlanadi. Ya'ni, stekka eng oxirgi qo'shilgan element birinchi bo'lib olinadi.
U xuddi ustma-ust taxlangan likopchalarga o'xshaydi: ustiga qo'yilgan oxirgi likopcha eng birinchi olinadi.

Stekdan farqli o'laroq, navbat ma'lumotlar tuzilmasi FIFO (First In First Out — birinchi kirgan birinchi chiqadi) prinsipi asosida ishlaydi. Ya'ni, navbatga birinchi bo'lib kirgan element birinchi bo'lib chiqariladi.
U chipta kassasidagi odamlar navbatiga o'xshaydi: birinchi kelgan odam birinchi bo'lib chipta oladi.

Bog'langan ro'yxatda ma'lumot elementlari tugunlar (nodes) zanjiri orqali o'zaro bog'lanadi. Har bir tugun o'zida ma'lumotni va keyingi tugunning xotira manzilini (pointer/reference) saqlaydi.

Chiziqli tuzilmalardan farqli o'laroq, chiziqli bo'lmagan ma'lumotlar tuzilmalaridagi elementlar ketma-ket joylashmaydi. Ular iyerarxik yoki to'rsimon shaklda tashkil etiladi, bu yerda bitta element bir yoki bir nechta boshqa elementlar bilan bog'lanishi mumkin.
Chiziqli bo'lmagan tuzilmalar asosan graf va daraxt turlariga bo'linadi.
Graf ma'lumotlar tuzilmasida har bir tugun cho'qqi (vertex) deb ataladi va har bir cho'qqi boshqa cho'qqilar bilan qirralar (edges) orqali bog'lanadi.

Mashhur graf tuzilmalari va algoritmlari:
Grafga o'xshab, daraxt ham cho'qqilar va qirralar to'plamidir. Biroq, daraxt tuzilmasida sikllar bo'lmaydi va har qanday ikkita cho'qqi o'rtasida faqat bitta yo'l mavjud bo'ladi. Eng yuqoridagi tugun ildiz (root) deb ataladi.

Mashhur daraxt tuzilmalari:
| Xususiyat | Chiziqli Ma'lumot Tuzilmalari | Chiziqli Bo'lmagan Ma'lumot Tuzilmalari |
|---|---|---|
| Tartiblanishi | Elementlar ketma-ket (sekvensial) tartibda, birin-ketin joylashadi. | Elementlar ketma-ket bo'lmagan iyerarxik yoki to'r tartibida joylashadi. |
| Qatlamlar | Barcha elementlar bitta darajada (yagona qatlamda) bo'ladi. | Elementlar turli xil iyerarxik qatlamlarda joylashadi. |
| Aylanib chiqish (Traversal) | Bitta o'tishda (single run) birinchi elementdan oxirgisigacha to'liq aylanib chiqish mumkin. | Barcha elementlarni ko'rish uchun murakkabroq qidiruv (BFS, DFS) va bir necha bosqich talab etiladi. |
| Xotira samaradorligi | Elementlar uchun xotira ajratish har doim ham optimal bo'lmaydi. | Ehtiyojga qarab xotiradan juda moslashuvchan va samarali foydalaniladi. |
| Vaqt murakkabligi | Ma'lumotlar hajmi oshishi bilan qidiruv va o'chirish vaqti chiziqli oshib boradi (O(n)). | Qidiruv va qo'shish ko'pincha ancha tez: logarifmik vaqtda (O(log n)) bajariladi. |
| Misollar | Array (Massiv), Stack, Queue, Linked List | Tree (Daraxt), Graph (Graf), Hash Map |
Ma'lumotlar tuzilmasining eng oddiy namunasi bo'lgan massivni turli tillarda yaratish:
package main
import "fmt"
func main() {
// Go tilida massiv va slice e'lon qilish
numbers := []int{10, 20, 30, 40, 50}
fmt.Println("Barcha elementlar:", numbers)
fmt.Printf("1-element (index 0): %d\n", numbers[0])
fmt.Printf("Elementlar soni (uzunlik): %d\n", len(numbers))
}Har bir ma'lumot tuzilmasining qanday ishlashini bilish sizga loyihangiz uchun eng to'g'ri va eng samaralisini tanlash imkonini beradi. Bu esa xotira va vaqt bo'yicha yuqori tezlikda ishlovchi dasturlar yaratishingizga zamin yaratadi.
package main
import "fmt"
func main() {
// Chiziqli ma'lumot tuzilmasi: Go slice (dinamik massiv)
items := []string{"Array", "Stack", "Queue", "Linked List"}
fmt.Println("Chiziqli ma'lumot tuzilmalari:")
for idx, item := range items {
fmt.Printf("%d. %s\n", idx+1, item)
}
}