O’ZBEKISTON RESPUBLIKASI
AXBOROT TEXNOLOGIYALARI
VA KOMMUNIKATSIYALARINI
RIVOJLANTIRISH VAZIRLIGI
MUHAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
QARSHI FILIALI
KI-13-20 (S) GURUH TALABASINING
ALGORITMLARNI LOYIHALASH
FANIDAN
2-MUSTAQIL ISHI
Bajardi: Dilmurodov.F
Qabulqildi: Ablaqulov.K Qarshi 2023
1. Ketma-ketliklar, to‘plamlar, daraxtlar, graflarni ifodalash usullari
2. Taqribiy integrallash usullari aniqligi va hisoblash hajmi bo‘yicha taqqoslash
3. Algebraik va transtendent tenglamalarni taqribiy yechish usullarini yaqinlashish tezligi bo‘yicha baxolash
4. Chiziqli algebraik tenglamalar sistemalarini taqribiy yechish usullari. Yaqinlashish shartlari
Xulosa
Foydalaniladigan adabiyotlar
Ketma -ketliklar, daraxtlar, graflarni ifodalash usullari
Uzellar (elementlar) va ularning munosabatlaridan iborat elementlar to‟plamining ierarxik tuzilmasiga daraxtsimon ma‟lumotlar tuzilmasi deyiladi. Daraxt – bu shunday chiziqsiz bog‟langan ma‟lumotlar tuzilmasiki, u quyidagi belgilari bilan tavsiflanadi: - daraxtda shunday bitta element borki, unga boshqa elementlardan murojaat yo‟q. Bu element daraxt ildizi deyiladi; - daraxtda ixtiyoriy element chekli sondagi ko‟rsatkichlar yordamida boshqa tugunlarga murojaat qilishi mumkin; - daraxtning har bir elementi faqatgina o‟zidan oldingi kelgan bitta element bilan bog‟langan.64 4.2. Binar daraxtlarni qurish Binar daraxtda har bir tugun-elementdan ko‟pi bilan 2 ta shox chiqadi. Daraxtlarni xotirada tasvirlashda uning ildizini ko‟rsatuvchi ko‟rsatkich berilishi kerak. Daraxtlarni kompyuter xotirasida tasvirlanishiga ko‟ra har bir element (binar daraxt tuguni) to‟rtta maydonga ega yozuv shaklida bo‟ladi, ya‟ni kalit maydon, informatsion maydon, ushbu elementni o‟ngida va chapida joylashgan elementlarning xotiradagi adreslari saqlanadigan maydonlar. Shuni esda tutish lozimki, daraxt hosil qilinayotganda, otaga nisbatan chap tomondagi o‟g‟il qiymati kichik kalitga, o‟ng tomondagi o‟g‟il esa katta qiymatli kalitga ega bo‟ladi. Har safar daraxtga yangi element kelib qo‟shilayotganda u avvalambor daraxt ildizi bilan solishtiriladi. Agar element ildiz kalit qiymatidan kichik bo‟lsa, uning chap shoxiga, aks holda o‟ng shoxiga o‟tiladi. Agar o‟tib ketilgan shoxda tugun mavjud bo‟lsa, ushbu tugun bilan ham solishtirish amalga oshiriladi, aks holda, ya‟ni u shoxda tugun mavjud bo‟lmasa, bu element shu tugunga joylashtiriladi. Masalan, daraxt tugunlari quyidagi qiymatlarga ega 6, 21, 48, 49, 52, 86, 101. U holda binar daraxt ko‟rinishi quyidagi 4.1-rasmdagidek bo‟ladi: 4.1-rasm. Binar daraxt ko‟rinishi Natijada, o‟ng va chap qism daraxtlari bir xil bosqichli tartiblangan binar daraxt hosil qildik. Agar daraxtning o‟ng va chap qism daraxtlari bosqichlarining farqi birdan kichik bo‟lsa, bunday daraxt ideal muvozanatlangan daraxt deyiladi. Yuqorida hosil qilgan binar daraxtimiz ideal muvozanatlangan daraxtga misol65 bo‟ladi. Daraxtni muvozanatlash algoritmini sal keyinroq ko‟rib chiqamiz. Undan oldin binar daraxtni yaratish algoritmini o‟rganamiz. 4.3. Algoritm Binar daraxt yaratish funksiyasi Binar daraxtni hosil qilish uchun kompyuter xotirasida elementlar quyidagi 4.2-rasmdagidek toifada bo‟lishi lozim. 4.2-rasm. Binar daraxt elementining tuzilishi p – yangi element ko‟rsatkichi next, last – ishchi ko‟rsatkichlar, ya‟ni joriy elementdan keyingi va oldingi elementlar ko‟rsatkichlari r=rec – element haqidagi birorta ma‟lumot yoziladigan maydon k=key – elementning unikal kalit maydoni left=NULL – joriy elementning chap tomonida joylashgan element adresi right=NULL – joriy elementning o‟ng tomonida joylashgan element adresi. Dastlab yangi element hosil qilinayotganda bu ikkala maydonning qiymati 0 ga teng bo‟ladi. tree – daraxt ildizi ko‟rsatkichi n – daraxtdagi elementlar soni Boshida birinchi kalit qiymat va yozuv maydoni ma‟lumotlari kiritiladi, element hosil qilinadi va u daraxt ildiziga joylashadi, ya‟ni tree ga o‟zlashtiriladi. Har bir hosil qilingan yangi elementning left va right maydonlari qiymati 0 ga tenglashtiriladi. Chunki bu element daraxtga terminal tugun sifatida joylashtiriladi, hali uning farzand tugunlari mavjud emas. Qolgan elementlar ham shu kabi hosil66 qilinib, kerakli joyga joylashtiriladi. Ya‟ni kalit qiymati ildiz kalit qiymatidan kichik bo‟lgan elementlar chap shoxga, katta elementlar o‟ng tomonga joylashtiriladi. Bunda agar yangi element birorta elementning u yoki bu tomoniga joylashishi kerak bo‟lsa, mos ravishda left yoki right maydonlarga yangi element adresi yozib qo‟yiladi. Binar daraxtni hosil qilishda har bir element yuqorida ko‟rsatilgan toifada bo‟lishi kerak. Lekin hozir biz o‟zlashtirish osonroq va tushunarli bo‟lishi uchun key va rec maydonlarni bitta qilib info maydon deb ishlatamiz. 4.3-rasm. Binar daraxt elementining tuzilishi Ushbu toifada element hosil qilish uchun oldin bu toifani yaratib olishimiz kerak. Uni turli usullar bilan amalga oshirish mumkin. Masalan, node nomli yangi toifa yaratamiz: class node{ public: int info; node *left; node *right; }; Endi yuqoridagi belgilashlarda keltirilgan ko‟rsatkichlarni shu toifada yaratib olamiz. node *tree=NULL; node *next=NULL; int n,key; cout<<"n=";cin>>n; Nechta element (n) kiritilishini aniqlab oldik va endi har bir element qiymatini kiritib, binar daraxt tuzishni boshlaymiz. for(int i=0;i>key; p->info=key; p->left=NULL; p->right=NULL; if(i==0){ tree=p; next=tree;sontinue;} next=tree; while(1){ last=next; if(p->infoinfo) next=next->left; else next=next->right; if(next==NULL) break; } if(p->infoinfo) last->left=p; else last->right=p; } Bu yerda p hali aytganimizdek, kiritilgan kalitga mos hosil qilingan yangi element ko‟rsatkichi, next yangi element joylashishi kerak bo‟lgan joyga olib boradigan shox adresi ko‟rsatkichi, ya‟ni u har doim p dan bitta qadam oldinda yuradi, last esa ko‟rilayotgan element kimning avlodi ekanligini bildiradi, ya‟ni u har doim p dan bir qadam orqada yuradi (4.4-rasm). 4.4-rasm. Binar daraxt elementlarini belgilash Shunday qilib binar daraxtini ham yaratib oldik. Endigi masala uni ekranda tasvirlash kerak, ya‟ni u ko‟rikdan o‟tkaziladi yoki vizuallashtirsa ham bo‟ladi. 68 4.4. Daraxt “ko‟rigi” funksiyalari 4.5-rasmdagidek binar daraxt berilgan bo‟lsin: 4.5-rasm. 3 ta elemetdan iborat binar daraxt Binar daraxtlari ko‟rigini uchta tamoyili mavjud. Ularni berilgan daraxt misolida ko‟rib chiqaylik: 1) Yuqoridan pastga ko‟rik (daraxt ildizini qism daraxtlarga nisbatan oldinroq ko‟rikdan o‟tkaziladi): A, B, C ; 2) Chapdan o‟ngga: B, A, C ; 3) Quyidan yuqoriga (ildiz qism daraxtlardan keyin ko‟riladi): B, C, A . Daraxt ko‟rigi ko‟pincha ikkinchi usul bilan, ya‟ni tugunlarga kirish ularning kalit qiymatlarini o‟sish tartibida amalga oshiriladi. 4.5. Daraxt ko‟rigining rekursiv funksiyalari 1. int pretrave(node *tree){ if(tree!=NULL) {int a=0,b=0; if(tree->left!=NULL) a=tree->left->info; if(tree->right!=NULL) b=tree->right->info; coutleft); pretrave(tree->right); } return 0;69 }; 2. int intrave(node *tree){ if(tree!=NULL) { intrave(tree->left); coutright); } return 0; }; 3. int postrave(node *tree){ if(tree!=NULL) { postrave(tree->left); postrave(tree->right); coutright!=NULL)) coutright!=NULL) coutinfo>key) next=next->left; else next=next->right; } cout<<"tuzilmada izlangan element yo’q!!!"left; else p=p->right; } Berilgan kalitga teng tugun topilmadi, element qo‟shish talab qilinadi. Ota bo‟lishi mumkin tugunga q ko‟rsatkich beriladi, elementning o‟zi esa yangi nomli ko‟rsatkichi bilan beriladi. node *q=new node; Qo‟yilayotgan yangi element chap yoki o‟ng o‟g‟il bo‟lishini aniqlash lozim. If(keykey) q->left=yangi; else q->right=yangi; search=yangi; return 0; 4.8. Binar daraxtdan elementni o‟chirish funksiyasi Tugunni o‟chirib tashlash natijasida daraxtning tartiblanganligi buzilmasligi lozim. 73 Tugun daraxtda o‟chirilayotganda 3 xil variant bo‟lishi mumkin: 1) Topilgan tugun terminal (barg). Bu holatda tugun otasining qaysi tomonida turgan bo‟lsa, otasining o‟sha tomonidagi shoxi o‟chiriladi va tugunning xotirada joylashgan sohasi tozalanadi. 2) Topilgan tugun faqatgina bitta o‟g‟ilga ega. U holda o‟g‟il ota o‟rniga joylashtiriladi. 3) O‟chirilayotgan tugun ikkita o‟g‟ilga ega. Bunday holatda shunday qism daraxtlar zvenosini topish lozimki, uni o‟chirilayotgan tugun o‟rniga qo‟yish mumkin bo‟lsin. Bunday zveno har doim mavjud bo‟ladi: - bu yoki chap qism daraxtning eng o‟ng tomondagi elementi (ushbu zvenoga erishish uchun keyingi uchiga chap shox orqali o‟tib, navbatdagi uchlariga esa, murojaat NULL bo‟lmaguncha, faqatgina o‟ng shoxlari orqali o‟tish zarur); - yoki o‟ng qism daraxtning eng chap elementi (ushbu zvenoga erishish uchun keyingi uchiga o‟ng shox orqali o‟tib, navbatdagi uchlariga esa, murojaat NULL bo‟lmaguncha, faqatgina chap shoxlari orqali o‟tish zarur). O‟chirlayotgan element chap qism daraxtining eng o‟ngidagi element o‟chirilayotgan element uchun merosxo‟r bo‟ladi ( 12 uchun – 11 bo‟ladi). Merosxo‟r esa o‟ng qism daraxtning eng chapidagi tuguni (12 uchun - 13). Merosxo‟rni topish algoritmini ishlab chiqaylik (4.8-rasmga qarang). p – ishchi ko‟rsatkich; q - p dan bir qadam orqadagi ko‟rsatkich; v – o‟chirilayotgan tugun merosxo‟rini ko‟rsatadi; t – v dan bir qadam orqada yuradi; s - v dan bir qadam oldinda yuradi (chap o‟g‟ilni yoki bo‟sh joyni ko‟rsatib boradi).74 4.8-rasm. Binar daraxtdan oraliq tugunni o‟chirich tartibi Yuqoridagi daraxt bo‟yicha qaraydigan bo‟lsak, oxir oqibatda, v ko‟rsatkich 13 tugunni, s esa bo‟sh joyni ko‟rsatishi lozim. 1) Elementni qidirish funksiyasi orqali o‟chirilayotgan elementni topamiz. p ko‟rsatkich o‟chirilayotgan elementni ko‟rsatadi. 2) O‟chiriladigan elementning o‟rniga qo‟yiluvchi tugunga v ko‟rsatkich qo‟yamiz. node *del(node *tree,int key){ node *p=new node; node *next=tree; node *q=NULL; while(next!=NULL) { if (next->info==key){cout<<"Binar daraxtda "<left; } else {q=next;next=next->right;} } if(next==NULL) cout<<"tuzilmada izlangan element yo’q!!!"right; else 75 if(p->right==NULL) v=p->left; if((p->left!=NULL)&&(p->right!=NULL)){t=p; v=p->right; s=v->left;} while(s!=NULL){ t=v; v=s; s=v->left; } if((t!=NULL)&&(t!=p)){ t->left=v->right; v->right=p->right; v->left=p->left; } if(t==p) v->left=p->left; if(q==NULL){ coutleft) q->left=v; else q->right=v; delete(p); // o’chirilgan element joylashgan xotira yacheykasini tozalash return tree; } 4.9. Daraxtni muvozanatlash algoritmi Binar daraxt muvozanatlangan yoki AVL-muvozanatlangan bo‟lishi mumkin. Daraxt AVL-muvozanatlangan (1962 yil sovet olimlari Аdelson, Velsk76 Georgiy Maksimovich va Landis Yevgeniya Mihaylovichlar tomonidan taklif qilingan) deyiladi, agar daraxtdagi har bir tugunning chap va o‟ng qismdaraxtlari balandliklari farqi 1 tadan ko‟p bo‟lmasa. Berilgan butun sonlar – kalitlar ketma-ketligidan binar daraxt yaratib olamiz va uni muvozanatlaymiz. Daraxtni muvozanatlashdan maqsad, bunday daraxtga yangi element kiritish va daraxtdan element izlash algoritmi samaradorligini oshirishdan iborat, ya‟ni bu amallarni bajarishdagi solishtirishlar soni kamayadi. Binar daraxtni muvozanatlash algoritmi quyidagicha bo‟ladi.
Binar daraxtning balandligi deb daraxt bosqichlari soniga aytiladi. Binar daraxt balandligini aniqlash uchun uning har bir tuguni chap va o‟ng qismdaraxtlari balandliklari solishtiriladi va maksimal qiymat balandlik deb olinadi. Misol uchun quyidagi 4.9-rasmdagi daraxtning balandligi 2 ga teng. 4.9-rasm. Binar daraxt balandligi Daraxt balandligini aniqlash dastur kodini keltiramiz. int height(node *tree){ int h1,h2; if (tree==NULL) return (-1); else { h1 = height(tree->left);78 h2 = height(tree->right); if (h1>h2) return (1 + h1); else return (1 + h2); } } 4.11. Binar daraxtni muvozanatlanganmi yoki yo‟qligini tekshirish Daraxtning balandligini aniqlashni o‟rganganimizdan keyin uning muvozanatlanganligini tekshirish mumkin. Binar daraxtning muvozanatlanganligini tekshirish uchun uning har bir tugunini har ikkala qismdaraxti balandliklarini hisoblab, farqlarini tekshirib ko‟rish kerak. Agar farq 0 yoki 1 ga teng bo‟lsa, bu muvozanatlangan daraxt hisoblanadi. Quyida binar daraxtni muvozanatlanganlikka tekshirishning rekursiv funksiyasini qo‟llovchi dastur keltirilgan. Dastur kodi #include #include using namespace std; class node{ public: int info; node *left; node *right; }; int k=0,Flag=1; int height(node *tree){ int h1,h2; if (tree==NULL) return (-1); else { h1 = height(tree->left); h2 = height(tree->right); if (h1>h2) return (1 + h1);79 else return (1 + h2); } } void vizual(node *tree,int l) { int i; if(tree!=NULL) { vizual(tree->right,l+1); for (i=1; i<=l; i++) cout<<" "; coutleft) - height (tree->right); if ((t<-1) || (t>1)) { Flag = 0; return Flag; } AVLtree (tree->left); AVLtree (tree->right); } } int GetFlag(){return Flag;} int main() { int n,key,s; node *tree=NULL,*next=NULL; cout<<"n="; cin>>n; int arr[n]; for(int i=0; i>s; p->info=s; p->left=NULL;80 p->right=NULL; if(i==0){tree=p; next=tree; continue; } next=tree; while(1) { last=next; if(p->infoinfo)next=next->left; else next=next->right; if(next==NULL)break; } if(p->infoinfo)last->left=p; else last->right=p;} cout<<<"\nbinar daraxt:\n"; vizual(tree,0); AVLtree(tree); if(GetFlag()) cout<<"ha, muvozanatlangan daraxt"; else cout<<"yo’q, muvozanatlanmagan daraxt";cout< Binar daraxtni ko‟rikdan o‟tkazayotganda biz yuqorida har bir 81 tugunni o‟ngida va chapida turgan tugunlarni so‟z bilan ifodaladik. Lekin bu usul bir muncha noqulay. Daraxtni vizual ko‟rinishda ifodalash uni anglashning juda qulay usuli hisoblanadi. Daraxtni vizuallashtirishning grafik ko‟rinishi va konsol oynasida ifodalash kabi turlari mavjud. Shundan konsol oynasida daraxtni vizuallashtirishni ko‟rib chiqamiz. Bunda sonlar daraxt shaklida joylashtiriladi. Quyida bunday usulning dastur kodi keltirilgan.
Yuqorida ko‘rilgan misollarda, odatda, biz masalani yechish algoritmini so‘zlar va matematik formulalar orqali ifodaladik. Lekin algoritm boshqa ko‘rinishlarda ham berilishi mumkin. Biz endi algoritmlarning eng ko‘p uchraydigan turlari bilan tanishamiz. 1. Algoritmning so‘zlar orqali ifodalanishi. Bu usulda ijrochi uchun beriladigan har bir ko‘rsatma jumlalar, so‘zlar orqali buyruq shaklida beriladi. 2. Algoritmning formulalar bilan ifodalanish usulidan matematika, fizika, kimyo kabi aniq fanlardagi formulalarni o‘rganishda foydalaniladi. Bu usul ba’zan analitik ifodalash deyiladi. 3. Algoritmlarning maxsus geometrik shakllar yordamida ifodalanishida masala yechish jarayoni aniq va ravon tasvirlanadi va bu ko‘rinish blok-sxema deyiladi. 4. Algoritmning jadval ko‘rinishda berilishi. Algoritmning bunday ifodasidan ham ko‘p foydalanamiz. Masalan, maktabda qo‘llanib kelinayotgan to‘rt xonali matematik jadvallar yoki turli xil lotereyalar jadvali. Funksiyalarning grafiklarini chizishda ham algoritmlarning qiymatlari jadvali ko‘rinishlaridan foydalanamiz. Bu kabi jadvallardan foydalanish algoritmlari sodda bo‘lgani tufayli ularni o‘zlashtirib olish oson. Yuqorida ko‘rilgan algoritmlarni tasvirlash usullarining asosiy maqsadi, qo‘yilgan masalani yechish uchun zarur bo‘lgan amallar ketma-ketligining eng qulay holatini aniqlash va shu bilan inson tomonidan dastur yozishni yanada osonlashtirishdan iborat. Aslida, dastur ham algoritmning boshqa bir ko‘rinishi bo‘lib, u insonning kompyuter bilan muloqotini qulayroq amalga oshirish uchun mo‘ljallangan.
Hozirgi paytda o’nlik sanoq tizimida arifmetik amallarni bajarish usullari hisoblash algoritmlariga soddagina misol bo’la oladi xolos. Hozirgi zamon nuqtai nazaridan algoritm tushunchasi nimani ifodalaydi? Ma’lumki, inson kundalik turmushida turli-tuman ishlarni bajaradi. Har bir ishni bajarishda esa bir qancha elementar (mayda) ishlarni ketma-ket amalga oshirishga to’g’ri keladi. Mana shu ketma-ketlikning o’zi bajariladigan ishning algoritmidir. Ammo bu ketma-ketlikka e’tibor bersak, biz ijro etayotgan elementar ishlar ma’lum qoida bo’yicha bajarilishi kerak bo’lgan ketma-ketlikdan iborat ekanligini ko’ramiz. Agar bu ketma-ketlikdagi qoidani buzsak, maqsadga erishmasligimiz mumkin.
Masalan, shaxmat o’yinini boshlashda shohni yura olmaymiz, chunki bu o’yin algoritmida yurishni boshqa bir shaxmat donalaridan boshlash kerak yoki palov pishirish algoritmida birinchi navbatda qozonga suv solib ko’ringchi, osh qanday bo’lar ekan. Berilgan matematik ifodani soddalashtirishda amallarning bajarilish ketma-ketligiga e’tibor bermaslik noto’g’ri natijaga olib kelishi barchaga ma’lum.
Demak ishni, ya’ni qo’yilgan masalani bajarishga mayda elementar ishlarni muayyan ketma-ketlikda ijro etish orqali erishiladi. Bundan ko’rinib turibdiki, har bir ish qandaydir algoritmning bajarilishidan iboratdir. Algoritmni bajaruvchi algoritm ijrochisidir. Algoritmning ijrochisi masalaning qanday qo’yilishiga e’tibor bermagan holda natijaga erishishi mumkin. Buning uchun u faqat avvaldan ma’lum qoida va ko’rsatmalarni qat’iy bajarishi shart. Bu esa algoritmning juda muhim xususiyatlaridan biridir.
Umuman, ajgoritmlarni ikki guruhga ajratish mumkin. Birinchi guruh algoritmning ijrochisi faqat inson bo’lishi mumkin ( masalan palovni faqat inson pishira oladi), ikkinchi guruh algoritmlarning ijrochisi ham inson, ham EHM bo’lishi mumkin (faqat aqliy mehnat bilan bog’liq bo’lgan masalalar). Ikkinchi guruh algorimtlarning ijrochisini EHM zimmasiga yuklash mumkin. Buning uchun algoritmni EHM tushunadigan biror tilda yozib, uni mashina xotirasiga kiritish kifoya.
Shunday qilib, biz algoritm deganda, berilgan masalani yechish uchun ma’lum tartib bilan bajarilishi kerak bo’lgan chekli sondagi buyruqlar ketma-ketligini tushunamiz.
Biror sohaga tegishli masalani yechish algoritmini tuzish algoritm tuzuvchidan shu sohani mukammal bilgan holda, qo’yilgan masalani chuqur tahlil qilishni talab qiladi. Bunda masalani yechish uchun kerak bo’lgan ishlarning rejasini tuza bilish muhim ahamiyatga ega. Shuningdek, masalani yechishda ishtirok etadigan ob’ektlarning qaysilari boshlang’ich ma’lumot va qaysilari natijaligini aniqlash, ular o’rtasidagi o’zaro bog’lanishni aniq va to’la ko’rsata bilish, yoki dastur (programma) tuzuvchilar tili bilan aytganda, masalaning ma’lumotlar modelini berish lozim.
Berilgan masala algoritmini yozishning turli usullari mavjud bo’lib, ular qatoriga so’z bilan, bloktarh (bloksxema) shaklida, formulalar, operatorlar yordamida, algoritmik yoki dasturlash tillarida yozish va hokazolarni kiritish mumkin.
Endi biror usulda tuzilgan algoritmning ayrim xossalari va algoritmga qo’yilgan ba’zi bir talablarni ko’rib chiqaylik.
1. Algoritm har doim to’liq bir qiymatlidir, ya’ni uni bir xil boshlang’ich qiymatlar bilan ko’p marta qo’llash har doim bir xil natija beradi.
2. Algoritm birgina masalani yechish qoidasi bo’lib qolmay, balki turli-tuman boshlang’ich shartlar asosida ma’lum turdagi masalalar to’plamini yechish yo’lidir.
3. Algoritmni qo’llash natijasida chekli qadamdan keyin natijaga erishamiz yoki masalaning yechimga ega emasligi haqidagi ma’lumotga ega bo’lamiz.
Yuqorida keltirilgan xossalarni har bir ijrochi o’zi tuzgan biror masalaning algoritmidan foydalanib tekshirib ko’rishi mumkin. Masalan: