logo

Topologik saralash. Algoritmning murakkabligini baholash”

Yuklangan vaqt:

12.08.2023

Ko'chirishlar soni:

0

Hajmi:

497.0400390625 KB
O`zbekiston  Respublikasi
Oliy va o`rta maxsus ta’lim vazirligi
Sharof Rashidov nomidagi Samarqand Davlat
Universiteti Matematika fakul’teti
“ Amaliy matematika “  yo`nalishi
KURS ISHI
Mavzu: “Topologik saralash. Algoritmning murakkabligini
baholash”
Samarqand -2023                              Reja:
1. Kirish
2. Asosiy qism  
A) Saralash algoritmlar haqida
B) Qidirish algoritmlari
C) Topografik algoritmlarga misollar
D) Murakkablik tahlili
    3. Xulosa
    4. Amaliy ish
    5. Foydalangan Adobiyotlar                                                          Kirish
 Saralash algoritmlari
Saralash   algoritmlari   –   informatikada   juda   yaxshi   o’rganilgan   sohalardan
biri   va   u   juda   keng   qamrovli   qo’llanilish   sohasiga   ega.   Ularni   katta   hajmdagi
ma’lumotlarni   saqlash   va   qayta   ishlash   amallari   bajariladigan   har   qanday   joyda
uchratish mumkin. Ba’zi ma’lumotlarni qayta ishlash masalalari agar ma’lumotlar
saralangan bo’lsa oson yechiladi. 
Saralash metodlari
Odatda saralash metodlarini ikkiga ajratishadi:
Ichki   saralash   –ma’lumotlar   operativ   xotirada   joylashgan   bo’lib,   bunda
dasturning   harakatlari   sonini   (solishtirish,   solishtirishlar   soni,   elementlar
almashinuvi   va   b.qa   metodlarga   asoslangan)   optimallashtirish   muhim   ahamiyat
kasb etadi;
Tashqi   saralash   –   ma’lumotlar   murojaatlarni   sekinlashtiruvchi   tashqi
hotirada (magnit lenta, baraban, disk va b.qa) joylashgan bo’lib, bunda aynan shu
qurilmaga murojaatlar sonini kamaytirish lozim.
Bu kurs ishida ko’plab dasturchilar uchun amaliyotda muhim bo’lgan massiv
elementlarini ichki saralash algoritmlarini ko’rib chiqamiz.
Ta’kidlash   joizki,   surish   orqali   saralash   algoritmini   tashqi   ma’lumotlarni
saralashda qo’llash ham qulay.
Qidirish algoritmlari
Qidirish   algoritmlari   bu   berilgan   qiymatni   ma’lum   algoritm   asosida
elementlarning ichidan yoki elementlarning ma’lum bir qismidan qidirishni amalga
oshirish   algoritmlari.   Qidirish   algoritmlarining   bugungi   kunga   kelib   ancha
metodlari   ishlab   chiqilgan.   Qidirish   algoritmlarini   shartli   ravishta   tartiblanmagan
ma’lumotlar   to’plami   bilan   va   tartiblangan   ma’lumotlar   to’plami   bilan   ishlovchi
turlarga ajratish mumkin.
100%   dasturchilar   o’rganish   mobaynida   massivda   biron   elelment
mavjudligini   tekshirish   muammosiga   duch   keladi.   Dasturlash   tillarida   bir   qancha
qidirish   algoritmlari   mavjud.   Ularning   har   birining   ishlashprinsipi   o’ziga   xos   va
albatta murakkablik jihatidan ham farqlanadi.
Ustuvor navbatlar
Ustuvor navbatlar (ing. Priority queue) – oddiy navbatlarga o’xshash ammo
bir qator xususiyatlarga ega abstract konteyner:
Ustuvor   navbatning   har   bir   elementiga   shu   elementning   ustuvorligini
belgilovchi   qandaydir   qiymat   mos   qo’yilgan.   Prioritet   bir   biri   bilan   solishtirish
orqali kiritiladi; Ustuvor   navbatdan   element   yechib   olish   funksiyasi   qaysi   elementning
prioriteti maksimal bo’lsa o’shani qaytaradi.
       Ko’plab ilovalarda yozuvlarni ularning kalitlarini o’sish tartibi bo’yicha
qayta ishlashni talab qiladi, lekin bu qat’iy tartibda va hammasini birdaniga qilish
degani   emas.   Ko’pchilik   hollarda   yozuvlar   biron   to’plamda   yig’iladi   va   keyin
maksimal   kalitli   yozuv   qayta   ishlanadi,   shundan   so’ng   yana   yozuvlarni   yig’ish
yana   davom   ettirilishi,   so’ngra   joriy   kalitdan   kattaroq   kalitga   ega   yozuv   qayta
ishlanishi mumkin va h.k. Bunday ma’lumotlar strukturasi ustuvor navbat (priority
queue)   deb   yuritiladi.   Ustuvor   navbatlardan   foydalanish   oddiy   navbatlardan   (eng
eski element o’chiriladi) va steklardan (eng yangi element o’chiriladi) foydalanish
kabi,   ammo   ulardan   unumli   foydalanish   Ko’plab   ilovalarda   yozuvlarni   ularning
kalitlarini   o’sish   tartibi   bo’yicha   qayta   ishlashni   talab   qiladi,   lekin   bu   qat’iy
tartibda va hammasini birdaniga qilish degani emas. Ko’pchilik hollarda yozuvlar
biron murakkabroq.
to’plamda   yig’iladi   va   keyin   maksimal   kalitli   yozuv   qayta   ishlanadi,
shundan   so’ng   yana   yozuvlarni   yig’ish   yana   davom   ettirilishi,   so’ngra   joriy
kalitdan   kattaroq   kalitga   ega   yozuv   qayta   ishlanishi   mumkin   va   h.k.   Bunday
ma’lumotlar   strukturasi   ustuvor   navbat   (priority   queue)   deb   yuritiladi.   Ustuvor
navbatlardan   foydalanish   oddiy   navbatlardan   (eng   eski   element   o’chiriladi)   va
steklardan (eng yangi element o’chiriladi) foydalanish kabi, ammo ulardan unumli
foydalanish murakkabroq.
Ustuvor navbatlarni piramidada qurish
Piramidaning muhim ustunligidan biri undagi qiymatlardan maksimali uning
uchida   joylashgan   bo’ladi.   Piramidaning   qayta   tiklash   up()   va   down()   amallari
ko’chishlar  sonini piramidaning uchidan oshmagan holda amalga oshiradi, bu esa
ustuvor navbatlarni samarali qo’llashga imkon yaratadi.
Avvalo,   bu   qo’llash   elementning   tuzilmasini   (chunki   element   faqatgina
prioritetni   emas   balki   qiymatni   ham   o’zida   saqlaydi)   tavsiflashni   va   piramidani
hosil qiluvchi massivni e’lon qilishni talab qiladi. Piramidani qayta tiklash amallari
priority   maydonini   solishtirishi   lozim.   Navbatning   elementlari   sonini   saqlash
uchun konstruktorda 0 qiymati bilan tashkil qilinadigan alohida size o’zgaruvchisi
ajratiladi.
      Topologik tartiblash algoritmi yo'naltirilgan grafikni oladi va har bir 
tugun o'zi ko'rsatgan barcha tugunlardan oldin paydo bo'ladigan tugunlar qatorini 
qaytaradi.
Massivdagi tugunlarning tartiblanishi topologik tartib deyiladi. Mana bir misol:  
                                      
1-tugun 2 va 3-tugunlarga ishora qilganligi sababli, 1-tugun tartiblashda 
ulardan oldin paydo bo'ladi. Va 2 va 3 tugunlari 4-tugunga ishora qilganligi 
sababli, ular tartiblashda undan oldin paydo bo'ladi.
       
Shunday qilib, [1, 2, 3, 4, 5] grafikning topologik tartibi bo'ladi.
Grafikda bir nechta to'g'ri topologik tartib bo'lishi mumkinmi? Ha! 
Yuqoridagi misolda [1, 3, 2, 4, 5] ham ishlaydi.
Siklik grafiklar
Ushbu yo'naltirilgan grafikni sikl bilan ko'ring:
             
sikl imkonsiz cheklovlar to'plamini yaratadi - B tartiblashda D dan oldin va
keyin bo'lishi kerak.
Qoida tariqasida, siklik grafiklarda to'g'ri topologik tartiblar mavjud emas.
Algoritm Ushbu yo'naltirilgan grafik uchun topologik tartibni qanday ishlab 
chiqarishimiz mumkin? 
           
Keling, topologik tartibdagi birinchi tugunga e'tibor qarataylik. Bu 
tugunning kiruvchi yo'naltirilgan qirralari bo'lishi mumkin emas; u nolning   
gradusiga ega bo'lishi kerak.
Nega?
Chunki agar uning kiruvchi yo'naltirilgan qirralari bo'lsa, unda unga ishora 
qiluvchi tugunlar birinchi bo'lib kelishi kerak edi.
                                
Shunday qilib, biz nolga teng bo'lgan tugunni topamiz va uni topologik 
tartibga qo'shamiz.
                           
                         Bu   bizning   topologik   tartibdagi   birinchi   tugunni   qamrab   oladi.   Keyingisi
haqida nima deyish mumkin?
Topologik   tartibga   tugun   qo'shilgach,   biz   tugunni   va   uning   chiquvchi
qirralarini grafikdan olib tashlashimiz mumkin.
                         
va takrorlang
                        
va takrorlang
                               
bo'lgunimizcha
                      
tugunlardan tashqarida.
Eslatma: bu topologik tartibni yaratishning yagona usuli emas.
            Algoritmlarning   ikki   xil   turi   ajratib   ko’rsatiladi,   bular:   takrorlanuvchi
algoritmlar   va   rekursiv   algoritmlar.   Takrorlanuvchi   algoritmlar   asosida   sikl   va
shart   operatorlari   yotadi.   Bu   sinf   algoritmlarining   analizi   barcha   sikllar   va   ular
ichidagi   amallar   hisobini   taqazo   etadi.   Rekursiv   algoritmlar   (rekursiv   funksiya   –
o’z-o’zini chqiruvchi funksiya) esa asosiy masalani qismlarga ajratadi va ularning
har birini alohida yechadi. Rekursiv algorutmlarning analizi anchayin murakkab. U
masalani   qismlarga   bo’lish   amallarini   sonini,   asosiy   masalaning   har   bir   qismida
algoritmning bajarilishini, shu bilan birga ularning birlashmasini hisoblashni talab
etadi.            Algoritmlarning ikki xil turi ajratib ko’rsatiladi, bular: takrorlanuvchi -
algoritmlar   va   rekursiv   algoritmlar.   Takrorlanuvchi   algoritmlar   asosida   sikl   va
shart   operatorlari   yotadi.   Bu   sinf   algoritmlarining   analizi   barcha   sikllar   va   ular
ichidagi   amallar   hisobini   taqazo   etadi.   Rekursiv   algoritmlar   (rekursiv   funksiya   –
o’z-o’zini chqiruvchi funksiya) esa asosiy masalani qismlarga ajratadi va ularning
har birini alohida yechadi. Rekursiv algorutmlarning analizi anchayin murakkab. U
masalani   qismlarga   bo’lish   amallarini   sonini,   asosiy   masalaning   har   bir   qismida
algoritmning bajarilishini, shu bilan birga ularning birlashmasini hisoblashni talab
etadi.
Qaysi instruksiyalarni hisoblash kerak? Bu savolga aniq javob mavjud emas,
lekin   aniq   faktki   –   hisoblashda   mavjud   operatsiyalar(amallar)ni   inobatga   olish
lozim. Ularga quyidagilarni kiritish mumkin: Oddiy o’zlashtirish:   а   ←   b ; Massiv
elementlarini indekslash (uning qiymatini aniqlash); Arifmetik amallar: -, +, *, / ;
Solishtirish amallari: , =, <=, >=, <> ; Mantiqiy amallar: or, and, not. Algoritmning
vaqt   bo’yicha   murakkabligiga   kirish   ma’lumotlarining   hajmi   sezilarli   ta’sir
ko’rsatadi.   Unchalik   kata   bo’lmagan   hajmdagi   ma’lumotlarni   qayta   ishlashda
ikkita   turli   algoritmning   ishlash   vaqti   ahamiyatsizdek   tuyulishi   mumkin,   ammo
ma’lumotlar   hajmining   ortishi   ularning   bajarilish   vaqtiga   sezilarli   darajada   ta’sir
ko’rsatishi mumkin.
Lekin vaqt bo’yicha murakkablik faqatgina hajmga emas, balki 
ma’lumotlarning qiymatiga, shuningdek ularning tushish(uchrash) tartibiga ham 
bog’liq. Masalan, ko’pchilik saralash algoritmlari agar massivning o’zi saralangan 
bo’lsa, massivni tartiblashga anchayin kam vaqt sarflaydi. Shu kabi holatlar sabab 
vaqt bo’yicha murakkablikni uch xil holatda ko’rib chiqiladi: yomon, yaxshi va 
o’rta.
Lekin   vaqt   bo’yicha   murakkablik   faqatgina   hajmga   emas,   balki
ma’lumotlarning   qiymatiga,   shuningdek   ularning   tushish(uchrash)   tartibiga   ham
bog’liq.  Masalan,   ko’pchilik  saralash  algoritmlari   agar  massivning  o’zisaralangan
bo’lsa, massivni tartiblashga anchayin kam vaqt sarflaydi. Shu kabi holatlar sabab
vaqt   bo’yicha   murakkablikni   uch   xil   holatda   ko’rib   chiqiladi:   yomon,   yaxshi   va
o’rta.
Yomon   holat   kirish   ma’lumotlarining   omadsiz   kiritilishida   ya’ni   algoritm
masalani   yechish   uchun   maksimal   sondagi   elementar   amallarni   bajarishi   to’g’ri
kelish   holatiga   mos   keladi.   Yaxshi   holatda   aksincha   kirish   ma’lumotlari   imkon
qadar minimal sondagi amallarni bajarilishi ta’minlaydi.
O’rta   holat   anchayin   murakkab   aniqlanadi.   Kirish   ma’lumotlari   imkon
darajasida   guruhlarga   ajratiladi.   Keyin   har   bir   guruhning   qatnashish   ehtimolligi
aniqlanadi. Shundan so’ng, har bir guruhning ma’lumotlar bilan ishlashi  bo’yicha algoritmning   ishlash   vaqti   hisoblanadi.   Bizni   ko’pincha   eng   kam   va   eng   ko’p
holatlari ko’proq qiziqtiradi.
Kiritiluvchi   ma’lumotlarning   hajmi   katta   bo’lganda   biror   masalaning
ekzemplyar(nusxa)   asosida   bajariluvchi   yechimi,   algoritmlarning   ishlash   vaqti
analizini   solishtirish   asimptotik   tahlil   deb   yuritiladi.   Asimptotik   murakkabligi
kamroq bo'lgan algoritm ko'proq samarador (effektiv) hisoblanadi.
              Asimptotik   tahlilda   algoritmning   murakkabligi   –   bu   algoritmning
ma’lumotlari   hajmi   ortishi   bilan   algoritmning   ishlash   vaqtining   tezkor   ravishta
ortishini   belgilovchi   funksiyadir.   Asimptotik   tahlilda   asosiy   uchraydigan   o'sishni
baholash funksiyalari bular: 
(O-katta) – vaqtni o'sishini yuqori asimptotik baholash funksiyasi;
Ω  (Omega) – vaqtni o'sishini quyi asimptotik baholash funksiyasi;
Θ  (Teta) - vaqtni o'sishini quyi vayuqori asimptotik baholash funksiyasi.
Bunda   n   –   ma'lumotlarning   hajmiy   kattaligi   bo'lsin.   U   holda   f(n)
algoritmning   o’sish   funksiyasini   asimptotik   jihatdan   g(n)   funksiya   bilan
chegaralash mumkin: 
Misol   uchun,   muassasaning   tozalash   vaqti   uning   maydoni   kattaligiga   chiziqli
ravishta   bog’liq   ( Θ ( S )),   ya’ni   maydon   kattaligining   n   marta   ortishi   bilan   uni
tozalash   vaqti   ham   n   marta   ortadi.   Telefon   daftarchasidan   ismni   qidirishda   agar
chiziqli   qidirish   algoritmidan   foydalanilsa,   O(n)   chiziqli   vaqtni   talab   etadi.   Agar
ikkilik   qidiruvdan   foydalanilsa,   u   holda   ( Ο (log2( n )))   yozuvlar   soniga   logarifmik
bog’liq   bo’ladi.  
Biz   O   –   funksiya   bilan   ko’proq   kuzatuvlar   olib   boramiz.   Keyingi   kuzatishlarda
algoritmlarning   murakkabligi   yuqori   asimptotik   chegara   bilan   beriladi.  
Asimptotik tahlilning muhim qoidalari: 
O ( k * f ) =   O ( f ) – doimiy ko’payuvchi k (konstanta) tashlab yuboriladi, chunki
doimiy kirish ma’lumotlarining ortishi bilan uning ahamiyati yo’qoladi, masalan:
O(9,1n) =   O(n)  
O ( f * g )   =   O ( f )* O ( g )   –   ikkita   funksiya   ko’paytmasining   murakkabligini
baholash ularning murakkabliklari ko’paytmasiga teng, masalan:
O(5n*n) =   O(5n)*O(n) =   O(n)*O(n) =   O(n*n) =   O(n2)  
O ( f / g )= O ( f )/ O ( g )   –   ikkita   funksiyaning   bo’linmasining   murakkabligi   ular
murakkabliklarining bo’linmasiga teng, masalan:
O(5n/n) =   O(5n)/O(n) =   O(n)/O(n) =   O(n/n) =   O(1)  
O ( f + g )   teng   O(f)   va   O(g)   larning   dominantiga   –   funksiyalar   summasining
murakkabligini   baholash,   birinchi   va   ikkinchi   qo’shiluvchilarning   dominant
(hukmron) murakkabligini baholash bilan belgilanadi, masalan: O(n5+n10) =   O(n10)  
Amallarning sonini sanash juda mayda ish, eng muhimi bu unchalik muhim
emas.   Yuqorida   keltirilgan   qoidalardan   kelib   chiqqan   holda,   algoritmning
murakkabligini aniqlashda oldin bajarganimizdek amallarni sanash kerak emas, biz
uchun   algoritm   (operator   yoki   operatorlar   guruhi)   konstruksiyasi   qaysi
murakkablik   darajasiga   mansubligini   bilish   kifoya.   Bundan   ma’lumki,   sikl   va
rekursiyalarga   ega   bo’lmagan   algoritm   O(1)   konstanta   murakkabligiga   ega.   n   ta
iteratsiyani   bajaruvchi   siklning   murakkabligi   O(n)   ga   teng.   Bitta   n   o’zgaruvchi
qiymatiga   bog’liq   bo’lgan   ichma   ich   joylashgan   ikkita   siklning   konstruksiyasi
kvadratik   murakkablikka   O(n2)   ega   bo’ladi.  
Quyida eng ko’p uchraydigan murakkablik sinflari keltirilgan:  
O (1) – konstantali murakkablik;
  О ( n ) – chiziqli murakkablik;
О ( n а ) – polynomial murakkablik;
О (log( n )) – logarifmik murakkablik;
O(n*log(n)) – kvazichiziqli murakkablik;
O (2 n ) – eksponensial murakkablik;
O ( n !) –factorial murakkablik.
Murakkablik tahlili:  
Vaqt   murakkabligi:   O(V+E).   Yuqoridagi   algoritm   oddiygina   qo'shimcha
stekga ega DFS.   Shunday qilib, vaqtning murakkabligi DFS bilan bir xil.
Yordamchi fazo:   O(V). Stack uchun qo'shimcha joy kerak.
Eslatma:   Bu   erda   biz   stek   o'rniga   vektordan   ham   foydalanishimiz
mumkin.   Agar vektor ishlatilsa, topologik tartibni olish uchun elementlarni teskari
tartibda   chop   eting.Ilovalar:   Topologik   saralash   asosan   ish   o'rinlari   o'rtasidagi
berilgan bog'liqliklardan ishlarni rejalashtirish uchun ishlatiladi.   Informatika fanida
ushbu   turdagi   ilovalar   ko'rsatmalarni   rejalashtirishda,   elektron   jadvallardagi
formulalar   qiymatlarini   qayta   hisoblashda   formulalar   katakchalarini   baholashni
tartibga   solishda,   mantiqiy   sintezda,   fayllarni   yaratishda   bajarish   uchun
kompilyatsiya   vazifalarini   bajarish   tartibini   aniqlashda,   ma'lumotlarni   ketma-
ketlashtirishda   va   bog'lovchilardagi   belgilarga   bog'liqlikni   hal   qilishda   paydo
bo'ladi.  
                                                     Xulosa
Xulosa   qilib   aytganda   Algoritm   bilan   ishlash   barcha   turdagi   dasturlash
tillarida   ishlash   imkoniyatini   yengillashtirib   beradi.   Har   bir   dasturning   dastlab
algaritmini yaratib olgan maqul. Agar biz dasturimizning ketma ketligini bilmasak,
u   dastur   biz   o’ylagandan   ko’proq   hajmni   egallashi   mumkin   ekan.   vaqt   bo’yicha
murakkablik faqatgina hajmga emas, balki ma’lumotlarning qiymatiga, shuningdek
ularning   tushish(uchrash)   tartibiga   ham   bog’liq   Tashqi   saralash   –   ma’lumotlar
murojaatlarni   sekinlashtiruvchi   tashqi   hotirada   (magnit   lenta,   baraban,   disk   va
b.qa) joylashgan bo’lib, bunda aynan shu qurilmaga murojaatlar sonini kamaytirish
lozim.
Amallarning sonini sanash juda mayda ish, eng muhimi bu unchalik muhim
emas.   Yuqorida   keltirilgan   qoidalardan   kelib   chiqqan   holda,   algoritmning
murakkabligini aniqlashda oldin bajarganimizdek amallarni sanash kerak emas, biz
uchun   algoritm   (operator   yoki   operatorlar   guruhi)   konstruksiyasi   qaysi
murakkablik darajasiga mansubligini bilish kifoya.
Piramidaning   qayta   tiklash   up()   va   down()   amallari   ko’chishlar   sonini
piramidaning uchidan oshmagan holda amalga oshiradi, bu esa ustuvor navbatlarni
samarali qo’llashga imkon yaratadi.
  Men   C++   dasturi   strukturasi   haqida,   belgilar   bayoni,       saralash   algoritmi
tushunchasi,   ma’lumotlarni   kiritish   va   chiqarish   operatorlari   hamda   dasturda
ishlatiladigan toifalar, ifodalar va ko’nikmalarga ega bo`ldim.  
Algoritmlarni saralash va  ularni tartiblash lozim. Algoritmlash va dasturlash
tillari   bo’yicha   yozilgan   bir   necha   kitoblar   bilan   tanishib   chiqdim   va   ulardan
o’zimga kerakli malumotlarni oldim. 
 Kurs ishimda programmalash texnologiyalari algoritm, topografik algoritm,
masalalari saralash algoritmlari, qidirish algoritimlari qaralgan.
                                                                                         Amaliy ish.
// A C++   topologik chop etish uchun dastur// DAGni saralash
#include <bits/stdc++.h>
using namespace std;
 
// Class grafikni ifodalash uchun
class Graph {
        // No. of vertices'
        int V;
    //   Qo'shni   ro'yxatlar   ro'yxatini   o'z   ichiga   olgan   massivga
ko'rsatgich         list<int>* adj;
 
        // TopologicalSort tomonidan ishlatiladigan funksiya
     void topologicalSortUtil(int v, bool tashrif buyurdi [],
                                                          stack<int>& Stack);
 
public:
        // Constructor
        Graph(int V);
 
        //   grafikga chekka qo'shish funktsiyasi
        void addEdge(int v, int w);
 
        // topologik tartibni chop etadi
        // to'liq grafik
        void topologicalSort();
};
 
Graph::Graph(int V) {
        this->V = V;
        adj = new list<int>[V];
}
 
void Graph::addEdge(int v, int w)
{
        // Add w to v’s list.
        adj[v].push_back(w);
}
 
// TopologicalSort tomonidan ishlatiladigan rekursiv funksiya
void Graph::topologicalSortUtil(int v, bool tashrif buyurilgan[],
                                                                stack<int>& Stack)
{
        // Joriy tugunni tashrif buyurilgan deb belgilang.
        visited[v] = true;
 
        // Barcha uchlari uchun takrorlang
        // bu cho'qqiga qo'shni
                  list<int>::iterator i;
        for (i = adj[v].begin(); i != adj[v].end(); ++i)
                if (!visited[*i])
                        topologicalSortUtil(*i, visited, Stack);
 
        // Yig'ish uchun joriy cho'qqini suring
        // qaysi do'konlar natijasi
        Stack.push(v);
}
 
// Topologik tartiblash funksiyasi.
// U rekursiv topologicalSortUtil dan foydalanadi ()
void Graph::topologicalSort()
{
        stack<int> Stack;
 
        //   Barcha uchlarini tashrif buyurilmagan deb belgilang
        bool* visited = new bool[V];         for (int i = 0; i < V; i++)
                visited[i] = false;
 
        //   Rekursiv yordamchi funksiyani chaqiring
        //   Topologik saqlash uchun
        // Hammasidan boshlab saralash
        // uchlari birma-bir
        for (int i = 0; i < V; i++)
                if (visited[i] == false)
                        topologicalSortUtil(i, visited, Stack);
 
        // Stack tarkibini chop etish
        while (Stack.empty() == false) {
                cout << Stack.top() << " ";
                Stack.pop();
        }
         
        delete [] visited;
}
 
// Haydovchi kodi
int main()
{
        //   Yuqoridagi diagrammada berilgan grafikni tuzing
        Graph g(6);
        g.addEdge(5, 2);
        g.addEdge(5, 0);
        g.addEdge(4, 0);
        g.addEdge(4, 1);
        g.addEdge(2, 3);
        g.addEdge(3, 1);
 
        cout << "   Quyida berilganlarning topologik turi keltirilgan "
                        "graph \n";
 
        // Funktsiya chaqiruvi
        g.topologicalSort();
 
        return 0; }
                    
                            
Izoh
Bu kod natijasi bo’yicha quyida berilgan 543210 grafining topologik turi keltirildi.
Bu yerda grafning topologic turi saralandi. Foydalangan Adabiyotlar
1. Markushevich A. I. Teoriya analiticheskix funktsiy. V 2-x t. – M.: Nauka,
1968.   T.
2.   –   624s   2.   Goluzin   G.M.   Geometricheskaya   teoriya   funktsii   kompleksnogo
peremennogo.   –   M.   :   Nauka,   1976.–   540   s.  
3.   B.   V.   SHabat.   Vvedenie   v   kompleksnıy   analiz.   1–chast.   M.N.   1989.
  4.   G.   Xudayberganov,   A.   Vorisov,   X.   Mansurov.   Kompleks   analiz.   Toshkent,
«Universitet»,   198.  
5.   G.   Xudayberganov,   A.   Vorisov,   X.   Mansurov.   Kompleks   analiz.Karshi.
«Nasaf»,   2003.  
6.   Virt   N.   Algoritmı   strukturı   dannıx   programmı.-M.:Mir,   1985.-405s.  
7.   Aripov   M.M.,   Imomov   T.,   Irmuxamedov   Z.M.   va   boshqalar.   Informatika.
Axborot   texnologiyalari.   Toshkent,   1-qism.   2002,   2-qism.   2003  
8.   http://ziyonet.uz  
9. www.google.uz

O`zbekiston Respublikasi Oliy va o`rta maxsus ta’lim vazirligi Sharof Rashidov nomidagi Samarqand Davlat Universiteti Matematika fakul’teti “ Amaliy matematika “ yo`nalishi KURS ISHI Mavzu: “Topologik saralash. Algoritmning murakkabligini baholash” Samarqand -2023

Reja: 1. Kirish 2. Asosiy qism A) Saralash algoritmlar haqida B) Qidirish algoritmlari C) Topografik algoritmlarga misollar D) Murakkablik tahlili 3. Xulosa 4. Amaliy ish 5. Foydalangan Adobiyotlar

Kirish Saralash algoritmlari Saralash algoritmlari – informatikada juda yaxshi o’rganilgan sohalardan biri va u juda keng qamrovli qo’llanilish sohasiga ega. Ularni katta hajmdagi ma’lumotlarni saqlash va qayta ishlash amallari bajariladigan har qanday joyda uchratish mumkin. Ba’zi ma’lumotlarni qayta ishlash masalalari agar ma’lumotlar saralangan bo’lsa oson yechiladi. Saralash metodlari Odatda saralash metodlarini ikkiga ajratishadi: Ichki saralash –ma’lumotlar operativ xotirada joylashgan bo’lib, bunda dasturning harakatlari sonini (solishtirish, solishtirishlar soni, elementlar almashinuvi va b.qa metodlarga asoslangan) optimallashtirish muhim ahamiyat kasb etadi; Tashqi saralash – ma’lumotlar murojaatlarni sekinlashtiruvchi tashqi hotirada (magnit lenta, baraban, disk va b.qa) joylashgan bo’lib, bunda aynan shu qurilmaga murojaatlar sonini kamaytirish lozim. Bu kurs ishida ko’plab dasturchilar uchun amaliyotda muhim bo’lgan massiv elementlarini ichki saralash algoritmlarini ko’rib chiqamiz. Ta’kidlash joizki, surish orqali saralash algoritmini tashqi ma’lumotlarni saralashda qo’llash ham qulay. Qidirish algoritmlari Qidirish algoritmlari bu berilgan qiymatni ma’lum algoritm asosida elementlarning ichidan yoki elementlarning ma’lum bir qismidan qidirishni amalga oshirish algoritmlari. Qidirish algoritmlarining bugungi kunga kelib ancha metodlari ishlab chiqilgan. Qidirish algoritmlarini shartli ravishta tartiblanmagan ma’lumotlar to’plami bilan va tartiblangan ma’lumotlar to’plami bilan ishlovchi turlarga ajratish mumkin. 100% dasturchilar o’rganish mobaynida massivda biron elelment mavjudligini tekshirish muammosiga duch keladi. Dasturlash tillarida bir qancha qidirish algoritmlari mavjud. Ularning har birining ishlashprinsipi o’ziga xos va albatta murakkablik jihatidan ham farqlanadi. Ustuvor navbatlar Ustuvor navbatlar (ing. Priority queue) – oddiy navbatlarga o’xshash ammo bir qator xususiyatlarga ega abstract konteyner: Ustuvor navbatning har bir elementiga shu elementning ustuvorligini belgilovchi qandaydir qiymat mos qo’yilgan. Prioritet bir biri bilan solishtirish orqali kiritiladi;

Ustuvor navbatdan element yechib olish funksiyasi qaysi elementning prioriteti maksimal bo’lsa o’shani qaytaradi. Ko’plab ilovalarda yozuvlarni ularning kalitlarini o’sish tartibi bo’yicha qayta ishlashni talab qiladi, lekin bu qat’iy tartibda va hammasini birdaniga qilish degani emas. Ko’pchilik hollarda yozuvlar biron to’plamda yig’iladi va keyin maksimal kalitli yozuv qayta ishlanadi, shundan so’ng yana yozuvlarni yig’ish yana davom ettirilishi, so’ngra joriy kalitdan kattaroq kalitga ega yozuv qayta ishlanishi mumkin va h.k. Bunday ma’lumotlar strukturasi ustuvor navbat (priority queue) deb yuritiladi. Ustuvor navbatlardan foydalanish oddiy navbatlardan (eng eski element o’chiriladi) va steklardan (eng yangi element o’chiriladi) foydalanish kabi, ammo ulardan unumli foydalanish Ko’plab ilovalarda yozuvlarni ularning kalitlarini o’sish tartibi bo’yicha qayta ishlashni talab qiladi, lekin bu qat’iy tartibda va hammasini birdaniga qilish degani emas. Ko’pchilik hollarda yozuvlar biron murakkabroq. to’plamda yig’iladi va keyin maksimal kalitli yozuv qayta ishlanadi, shundan so’ng yana yozuvlarni yig’ish yana davom ettirilishi, so’ngra joriy kalitdan kattaroq kalitga ega yozuv qayta ishlanishi mumkin va h.k. Bunday ma’lumotlar strukturasi ustuvor navbat (priority queue) deb yuritiladi. Ustuvor navbatlardan foydalanish oddiy navbatlardan (eng eski element o’chiriladi) va steklardan (eng yangi element o’chiriladi) foydalanish kabi, ammo ulardan unumli foydalanish murakkabroq. Ustuvor navbatlarni piramidada qurish Piramidaning muhim ustunligidan biri undagi qiymatlardan maksimali uning uchida joylashgan bo’ladi. Piramidaning qayta tiklash up() va down() amallari ko’chishlar sonini piramidaning uchidan oshmagan holda amalga oshiradi, bu esa ustuvor navbatlarni samarali qo’llashga imkon yaratadi. Avvalo, bu qo’llash elementning tuzilmasini (chunki element faqatgina prioritetni emas balki qiymatni ham o’zida saqlaydi) tavsiflashni va piramidani hosil qiluvchi massivni e’lon qilishni talab qiladi. Piramidani qayta tiklash amallari priority maydonini solishtirishi lozim. Navbatning elementlari sonini saqlash uchun konstruktorda 0 qiymati bilan tashkil qilinadigan alohida size o’zgaruvchisi ajratiladi. Topologik tartiblash algoritmi yo'naltirilgan grafikni oladi va har bir tugun o'zi ko'rsatgan barcha tugunlardan oldin paydo bo'ladigan tugunlar qatorini qaytaradi. Massivdagi tugunlarning tartiblanishi topologik tartib deyiladi.

Mana bir misol: 1-tugun 2 va 3-tugunlarga ishora qilganligi sababli, 1-tugun tartiblashda ulardan oldin paydo bo'ladi. Va 2 va 3 tugunlari 4-tugunga ishora qilganligi sababli, ular tartiblashda undan oldin paydo bo'ladi. Shunday qilib, [1, 2, 3, 4, 5] grafikning topologik tartibi bo'ladi. Grafikda bir nechta to'g'ri topologik tartib bo'lishi mumkinmi? Ha! Yuqoridagi misolda [1, 3, 2, 4, 5] ham ishlaydi. Siklik grafiklar Ushbu yo'naltirilgan grafikni sikl bilan ko'ring: sikl imkonsiz cheklovlar to'plamini yaratadi - B tartiblashda D dan oldin va keyin bo'lishi kerak. Qoida tariqasida, siklik grafiklarda to'g'ri topologik tartiblar mavjud emas. Algoritm