DEV Community

Cover image for CS50 - Week 3
Dilbar
Dilbar

Posted on

CS50 - Week 3

Algoritm - bu muammoni hal qilish uchun aniq ketma-ketlikda berilgan ko'rsatmalar to'plami. Algoritmlar bir-biridan tezligi va qancha xotira egallashi bilan farq qiladi. Dasturlash jarayonida aksar algoritmlar ma'lumotlarni qidirish (searching) va tartiblashga (sorting) borib taqaladi. Keling, ma'lumotlarni qidirish algoritmlari bilan tanishamiz:

Chiziqli qidiruv (Linear search)

Bizga quyidagi massiv berilgan bo'lsin:

[20, 500, 10, 5, 100, 1, 50]
Enter fullscreen mode Exit fullscreen mode

Massivni tasavvur qilishda uni quyidagi kabi yonma-yon turgan yettita qizil shkaf sifatida ko‘rish mumkin:

lockers

Ushbu massivdan 50 sonini topishimiz kerak. Kompyuter 50 sonini topish uchun har bir shkafni tekshirishi kerak. Ushbu jarayonni, ya’ni massiv ichida ma’lum bir raqamni, belgini yoki boshqa elementni izlashni "qidiruv" deb ataymiz.
Biz massivimizni algoritmga topshirib, algoritm orqali shkaflarni ochib, 50 raqami bor-yo‘qligini aniqlashni so‘rashimiz mumkin. Natijada, algoritm bizga “ha” yoki “yo‘q” (true yoki false) deb javob beradi.

lockers as algorithm

Quyidagi kabi ko‘rsatmalar yordamida algoritmni tuzishimiz mumkin:

Chapdan ongga har bir eshikni tekshirish:
    Agar 50 soni bor bolsa:
        Ha deb qaytaramiz (return true)
Yoq deb qaytaramiz (return false)
Enter fullscreen mode Exit fullscreen mode

Yuqoridagi ko‘rsatmalar inson o‘qishi uchun mo‘ljallangan pseudokod bo‘lib, kompyuterga topshiriladigan buyruqlarning oddiyroq ko‘rinishidir.

Chiziqli qidiruv algoritmini quyidagi kod yordamida C tilida amalga oshirishimiz mumkin:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Butun sonlardan iborat massiv berilgan
    int numbers[] = {20, 500, 10, 5, 100, 1, 50};

    // Kiritilgan sonni massivdan qidiramiz
    int n = get_int("Number: ");
    for (int i = 0; i < 7; i++)
    {
        if (numbers[i] == n)
        {
            printf("Topildi\n");
            return 0;
        }
    }
    printf("Topilmadi\n");
    return 1;
}
Enter fullscreen mode Exit fullscreen mode

Bu yerda for sikli yordamida chiziqli qidiruv amalga oshirilmoqda.
return 0 - dastur muvaffaqiyatli tugaganini bildiradi va dasturdan chiqiladi.
return 1 - dasturda xatolik yuz berganligini bildiradi.


Binar qidiruv (Binary search)

Binar qidiruv – bu 50 raqamini izlashda qo‘llaniladigan yana bir algoritm.
Agar massivdagi qiymatlar o'sish tartibida saralangan bo‘lsa, binar qidiruvning pseudokodini quyidagicha keltirishimiz mumkin:

Agar tekshiriladigan element qolmagan bolsa:
    Yoq deb qaytaramiz (return false)
Agar massivning[orta elementi] 50 soniga teng bolsa:
    Ha deb qaytaramiz (return true)
Agar massivning[orta elementi] > 50:
    Massivning chap yarmidan qidiramiz
Agar massivning[orta elementi] < 50:
    Massivning ong yarmidan qidiramiz
Enter fullscreen mode Exit fullscreen mode

Big O notatsiyasi

Algoritmning ishlashiga ketadigan vaqtini tahlil qilish uchun Big O notatsiyasidan foydalaniladi. Quyidagi grafikni ko‘rib chiqamiz:

big o graphed

"Kiritiladigan ma'lumot hajmi"x o‘qi; "Yechim uchun vaqt"y o‘qi;
Algoritmning samaradorligi uning egri chizig‘ining shakliga qarab aniqlanadi:
O(n²) - eng yomon ishlash vaqti hisoblanadi.
O(log n) - eng tezkor ishlash vaqtidir.

Chiziqli qidiruv algoritmi ishlalishiga ketadigan vaqt - O(n), chunki eng yomon holatda n qadam talab qilinishi mumkin.
Binar qidiruv algoritmi ishlashiga ketadigan vaqt esa O(log n), chunki eng yomon holatda qadamlar soni tobora kamayib boradi.

Dasturchilarni qiziqtiradigan ikkita holat mavjud:

  • Eng yomon holat yoki yuqori chegarasi (upper bound).
  • Eng yaxshi holat yoki quyi chegarasi (lower bound).

Ω belgisi algoritmning eng yaxshi holatini (quyi chegarani) belgilash uchun ishlatiladi, masalan, Ω(n).

Θ belgisi esa yuqori va quyi chegaralar bir xil bo‘lgan holatni belgilaydi, ya’ni eng yaxshi va eng yomon ishlash vaqtining bir xil bo‘lishi.


Saralash algoritmlari (Sorting)

Saralash – bu tartiblanmagan qiymatlar ro‘yxatini tartiblangan holda o‘zgartirish jarayonidir.
Massiv tartiblangan holatda bo‘lsa, undan ma'lum bir elementni qidirish kompyuter uchun ancha yengil bo‘ladi. Masalan, binar qidiruv (binary search) tartiblangan massivda ishlaydi, ammo tartiblanmagan massivda ishlamaydi.

Saralash algoritmlarining ko‘plab turlari mavjud. Ulardan biri tanlash usuli (selection sort) ni ko'rib chiqamiz. Bizga quyidagicha massiv berilgan bo'lsin:

red lockers

Tanlash usuli algoritmining pseudokodi quyidagicha bo'ladi:

i = 0 dan n-1 gacha:
    numbers[i] va numbers[n-1] orasidagi eng kichik sonni topamiz
    Eng kichik sonni numbers[i] bilan almashtiramiz
Enter fullscreen mode Exit fullscreen mode

Bosqichlar tahlili:

  • Birinchi marta massiv elementlari bo‘ylab yurish n - 1 qadam talab qiladi.
  • Ikkinchi marta esa n - 2 qadam talab qilinadi.
  • Ushbu mantiq davom ettirilsa, kerakli qadamlar quyidagicha ifodalanishi mumkin:
(n - 1) + (n - 2) + (n - 3) + ... + 1
Enter fullscreen mode Exit fullscreen mode

Bu formulani soddalashtirish orqali quyidagini olamiz: n(n-1)/2 yoki O(n²).
Demak, tanlash usuli algoritmi eng yomon holatda O(n²) tartibida saralar ekan. Hatto barcha qiymatlar tartiblangan bo‘lsa ham, qadamlar soni o‘zgarmaydi, ya’ni eng yaxshi holat ham O(n²) tartibida ishlaydi.


Pufakchali saralash algoritmi (Bubble sort)

Pufakchali saralash — yana bir saralash algoritmi bo'lib, bunda elementlarni qayta-qayta joylarini almashtirib, kattaroq qiymatlarni oxiriga “ko‘taramiz”.

Pufakchali saralash algoritmining pseudokodi quyidagicha bo'ladi:

n1 marta takrorlaymiz:
    0 dan n2 gacha har bir i uchun:
        Agar numbers[i] va numbers[i+1] notogri tartibda bolsa:
            Ularni joyini almashtiramiz
    Agar almashtirishlar qolmagan bolsa:
        Dasturdan chiqamiz
Enter fullscreen mode Exit fullscreen mode

Massivni tartiblash davomida shuni bilamizki, uning ko‘proq qismi tartiblanib boradi, shuning uchun faqat hali tartiblanmagan juftliklarni tekshirishning o'zi kifoya qiladi.
Shuning uchun pufakchali saralash algoritmi eng yomon holatda massiv tartiblanmagan bo'lsa O(n²), eng yaxshi holatda massiv allaqachon tartiblangan bo‘lsa O(n) tartibida ishlaydi.

Saralash algoritmlari qanday holatda qanday ishlashini ushbu sahifada vizual ko'rishimiz mumkin.

Ushbu maqolada CS50x 2024 manbasidan foydalanilgan.

Top comments (0)