O‘ZBEKISTON RESPUBLIKASI AXBOROT TEXNOLOGIYALARI VA KOMMUNIKATSIYALARINI RIVOJLANTIRISH VAZIRLIGI MUHAMMAD AL-XORAZMIY NOMIDAGI TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI Mustaqil ish Guruh: 512-22 Bajardi: Durdibayev Shamurat Oqituvchi: Matyakubov Marks Toshkent 2024 “Ajrat va xukmronlik qil” tilidagi algoritmlar . REJA: 1. Ajrat va hukmronlik qil usuli. 2. Kesh xotira bilan ishlash. 3. Qo’llanish muammolari. 4. Misollar . 5. Xulosa . Ajrat va hukmronlik qil usuli Dasturlashda, ajrat va hukmronlik qil — bu algoritmik paradigm bo’lib, bu paradigmaning asosiy g’oyasi algoritmik masalalarni bosh masalaga o’xshash kichik qismlarga ajratb, ularni rekursiv hal qilishdan iborat. Bu paradigmada masala qismlarga bo’linganligi sababli, qism masalalar bosh masalaga qaraganda kichikroq bo’lishi va bu bo’linish to’xtashi uchun asos holat bo’lishi kerak. Barcha turdagi ajrat va hukmronlik qil algoritmlari 3 ta bosqichdan iborat bo’ladi: Ajrat bosqichi. Bunda bosh masala huddi shu masalaga o’xshash kichikroq masalalarga bo’lib chiqiladi. Hukmronlik bosqichi. Asos holatimizga mos kelib qolgan qism masalalar huddi u kabi yechiladi. Birlashtirish bosqichi. Bu bosqichda yechilgan kichik qism masalalar qaytib birlashtirib chiqiladi va bu bosh masala yechimi bo’ladi. Shu sababli, ajrat hukmronlik qil paradigmasini 3 ta jumla bilan eslab qolish mumkin: Ajrat va hukmronlik qil paradigmasi dasturlashning mashhur algoritmlari asosini tashkil qiladi: Quick Sort Merge Sort Eng yaqin ikki nuqta (Closest two points) Strassen ko’paytirishi (Strassen multiplication) Karatsuba algoritmi (Karatsuba algorithm) Cooley-Tukey algoritmi (Cooley-Tukey Algorithm) qiyin masalalarni osonlik bilan yechishga imkon beradi Ajrat va hukmronlik qil paradigmasining afzalliklari bu paradigmaga asoslangan algoritmlar oddiy yechimlardan ko’ra tezroq ishlaydi. Masalan: oddiy saralash bo’lgan Bubble Sortning tezligi O(n²) bo’lsa, MergeSortniki O(n*logn) bunday algoritmlarni parallel hisoblovchi sistemalarda hech qanday o’zgarishsiz ishlatish mumkin bunday algoritmlarni qo’llashda xotira keshidan unumli foydalanish mumkin. Chunki masalalar bo’linish jarayonida shunday kichik qismlarga ajraladiki, ularni keshni o’zida turib yechish mumkin bo’ladi. haqiqiy sonlar uchun bunday algoritmlar aniqroq ishlaydi, chunki qism yechimlardagi haqiqiy sonlar ustidagi amallar aniqroq bajariladi (masalan, ko’paytirish algoritmlarida) Ajrat va hukmronlik qil paradigmasi kamchiliklari bunday paradigma asosida ishlaydigan algoritmlar rekursiyadan foydalanadi va bu ularni ishlashini ma’lum miqdorga sekinlashtiradi. Buning ustiga kichik bir xato yechimni cheksiz takrorlanishga tushirib qo’yishi mumkin. asosiy shartni tanlashda yo’l qo’yilgan xato barcha qism masalalarda xatolik va ortiqcha xotira ishlatilishiga olib keladi 2. Kesh xotira bilan ishlash Kesh - bu shaxsiy kompyuter protsessoridan tez-tez so'raladigan ma'lumotlarni ma'lum vaqt davomida saqlash uchun foydalanadigan yuqori tezlikda ishlaydigan xotira. Bu samaradorlikni sifat jihatidan oshiradi, chunki u protsessorga kerakli ma'lumotlarni qidirish va ma'lumotlarni eng tezkor ravishda qanday olish kerakligini ko'rsatib beradi. Kesh xotirasi turli xil operatsiyalar tezligiga bevosita ta'sir qiladi, chunki u oldindan kerakli ma'lumotlarni saqlaydi. Uning ishlash printsipini oddiy misol bilan tavsiflash mumkin. Ularning ishini optimallashtirish uchun har qanday kishi ish stolidagi narsalarni ma'lum mantiqiy tartibda tartibga solishga harakat qiladi. Ehtimol, ruchkalar, telefon, kerakli ma'lumotnomalar, joriy hujjatlar va boshqalar yaqin joyda joylashgan bo'lishi mumkin, chunki har safar kimdir besh yil oldin yillik hisobot ostida kerakli hujjatlarni yashirgan bo'lishi mumkin emas, chunki bu vaqt va kuch talab qiladi. Aynan shu printsip asosida kesh-xotira ishlaydi. Kompyuter darajasida bu nimani anglatadi? Aslida shunga o'xshash jarayon. Barcha ma'lumotlar shaxsiy kompyuterda ma'lum bir ierarxiyada mavjud. Agar ba'zi ma'lumot boshqalarga qaraganda tez-tez talab qilinadigan bo'lsa, ular mos ravishda yaqinroqdir. Protsessor ishlash uchun o‘z ma’lumotlarini operativ xotiradan oladi. Bunda mikrosxema ichida signallar juda katta chastotada (bir necha yuz MGts) ishlanadi, operativ xotiraga murojaatlarning hammasi esa bir necha marta kam chastotada sodir bo‘ladi. Chastotaning ichki ko‘paytirish koeffitsienti qanchalik yuqori bo‘lsa, protsessor, tashqarida saqlanayotgan ma’lumotlarga qaraganda, o‘zining ichida saqlanayotgan ma’lumotlar bilan shunchalik samaraliroq ishlaydi. Odatda protsessor o‘zining ichida deyarli hech narsani saqlamaydi. Unda ma’lumotlarga ishlov beriladigan yacheykalar (bu «ishchi» yacheykalar registrlar deb ataladi) juda kam. Shuning uchun protsessor ishini tezlatish uchun ancha oldin (4-avloddan boshlab) keshlash texnologiyasi taklif qilingan. Bugungi kunda kesh-xotira «piramidali» o‘rnatiladi. Tezligi bo‘yicha eng tezkor, lekin hajmi bo‘yicha eng kichik birinchi darajali kesh-xotira protsessor kristalli tarkibiga kiradi. Ularni protsessor registrlari tayyorlanadigan texnologiya bo‘yicha tayyorlashadi, natijada u juda qimmat, lekin juda tezkor va eng asosiysi ishonchli bo‘lib qoldi. Uning o‘lchami atigi bir necha o‘n Kbayt bilan o‘lchanadi, lekin u tez ishlov berishda juda katta ahamiyatga ega. Ikkinchi daraja kesh-xotirasi protsessorning o‘sha kristallining o‘zida joylashishi mumkin (bu holda u protsessori yadrosi chastotasida ishlaydi). Odatda ikkinchi daraja keshxotira hajmi yuzlab Kbaytda (128/256/512 Kbayt va h.k.) o‘lchanadi. Eng katta, lekin eng sekin kesh-xotira – bu uchinchi daraja keshidir. U protsessorga kirmaydi, chunki onalik platasida o‘rnatiladi va uning chastotasida ishlaydi. Uning o‘lchamlari 1-2 Mbaytga yetishi mumkin. Birinchi va ikkinchi daraja kesh-xotira o‘lchami protsessor narxiga juda katta ta’sir qiladi. Bir modelli va berilgan ishchi chastotali protsessorlar kesh-xotira hajmi bilan farqlanishi mumkin. Dasturlashda cache-oblivious algoritmlar protsessorning keshini (inglizcha kesh) kesh hajmiga (yoki kesh satrlarining uzunligiga) bog’lamasdan ishlatadigan tarzda yaratilgan algoritmlardir. Optimal cache-oblivious algoritm o'zgaruvchan omillarni hisobga olmagan holda asimptotik ma'noda keshni optimal ravishda ishlatadigan cache-oblivious algoritmdir. Bunday algoritmlar turli xil xotira darajalaridagi kesh hajmidan qat'iy nazar har xil mashinalarda samarali va modifikatsiyasiz ishlaydi. Oddiy cache-oblivious algoritmlar: matritsani ko'paytirish, tashqi tartiblash, matritsani transpozitsiyasi va boshqa ba'zi vazifalar. Odatda, cache-oblivious algoritmlar “ajrat va hukmronlik qil” usulidan foydalanadi, bunda vazifa kichik vazifalar va quyi qismlarga bo'linadi. Ajratish jarayonida biz kichik vazifalarga ega bo’lamiz. Bir muncha vaqt o'tganda, ushbu kichik vazifalar kesh hajmiga moslasha boshlaydi, biz ularning qachon moslashishini bilmaymiz, lekin eng kichik asos o'lchamlarga bo'lishda davom etamiz. Keyin kichik vazifa uchun samarali algoritmni qo'llaymiz. Shundan so’ng natijalarni asosiy vazifaning mohiyatiga qarab birlashtiramiz. Masalan, matritsani ko’paytirishning cache-oblivious algoritmi har bir matritsani to'rtta kichik matritsaga rekursiv ravishda bo'lish orqali hosil bo’ladi. Matritsa to’liq holda keshga joylashganda kichik masalalarga mo’ljallangan optimallashtirilgan algoritmdan foydalanamiz, keyinchalik funktsiyalar natijasini matritsaga qo'shamiz. 3. Qo’llanish muammolari Rekursiya Rekursiya deb shundаy kоnstruktsiyagа аytilаdiki, funktsiya o‘zini o‘zi chаqirаdi. To‘g‘ri vа nisbiy rekursiya аjrаtilаdi. Funktsiya to‘g‘ri rekursiv deyilаdi, аgаr tаnаsidа o‘zigа murоjааt bo‘lsа. Funktsiya bоshqа funktsiyani chаqirsа vа bu funktsiya o‘z nаvbаtidа birinchi funktsiyani chаqirsа, bundаy funktsiya nisbiy rekursiv deyilаdi. Quiksort – tez saralash algoritmi “ajrat va hukmronlik qil” tamoyilining yaqqol misolidir. Bu algotirm rekursiv bo’lib, o’rtacha N*log2N ta solishtirish natijasida saralaydi. Algoritm berilgan massivni saralash uchun uni 2 taga bo’lib oladi. Bo’lib olish uchun ixtiyoriy elementni tanlab undan 2 ta qismga ajratiladi. Lekin o’rtadagi elementni tanlab, massivning teng yarmidan 2 ga ajratgan ma’qul. Tanlangan kalit elementga nisbatan chapdagi va o’ngdagi har bir element solishtiriladi. Kalit elementdan kichiklar chapga, kattalar o„ng tomonga o’tkaziladi. Endi massivning har ikkala tomonida xuddi yuqoridagi amallar takrorlanadi. Ya’ni bu oraliqlarning o’rtasidagi elementlar kalit sifatida olinadi va h.k. Stek Stekning implementasiyasi ikki xil usulda bajarilishi mumkin. Zanjir(Linked) va Massiv. Zanjir yoki Linked Stek. Stekdagi barcha element o’zidan keyingi elementga bo’glangan bo’ladi va ushbu ketma-ketlik yordamida stekdagi “top” elementni aniqlab olamiz. Ushbu usulda yaratilga Stekning vaqt murakkabligi quyidagi jadvalda berilgan. Barcha amallarni asosini o’zlashtirish amali tashkil qilgani sababi barcha metodlar \(O(1)\) vaqtda bajariladi. Massivga asoslangan Stek. Massivning qulayliklaridan biri bu indeks orqali massivda joylashgan elementni vaqtda qaytara olishdir. Lekin massivdagi elementlar soni ko’payib ketsa qimmatbaho amal – hajmni kengaytirish lozim bo’ladi. O’z hajmini o’zi o’zgartira oladigan massiv dinamik massiv deyiladi. Nazariyaga ko’ra Push(T value) O(n) bu eng yomon holatdur, lekin Resize()ning chaqirilish ehtimolligi har chaqirilgandan so’ng pasayib boradi. Natijada, yuqoridagi metodni vaqt murakkablikka ega deb qabul qilishimiz mumkin. 4. Misollar Merge Sort algoritmi va uning ishlash prinsipi "Ajrat va hukmronlik qil" usulining eng mashhur saralash algoritmlaridan biri Merge Sort (Birlashtirib saralash)dir. Merge Sort algoritmi bu saralanmagan massivni taqqoslashga asoslangan holda saralovchi algoritm bo'lib, uning ishlash printsipida to'liq ajrat va hukmronlik qil g'oyasini uchratish mumkin. Demak, merge sort algoritmi asosiy ikkita qismdan iborat: Berilgan massivni rekursiv holda teng ikkita qismlarga bo'lib chiqish. Bu qadam, qism massivlar uzunligi 1 ga (yoki undan kichik) teng bo'lib qolguncha davom etadi. Hosil bo'lgan massivlarni qaytib birlashtirib chiqish va bir vaqtning o'zida hosil bo'luvchi massiv saralangan bo'lishini ta'minlash. Merge sort algoritmi qanday ishlashini vizual tasavvur qilish uchun quyidagi rasmga e'tibor bering. Unda amallar tartibi ham ko'rsatib qo'yilgan. Ko'rib turganingizdek algoritm ishlash prinsipini tushunish uchun unchalik ham murakkab emas. Va yana e'tibor bergan bo'lsangiz, birinchi bo'linishdan keyingi massivning chap va o'ng qismlarida asosiy massiv bilan bir xil amal profiliga kirmoqchi. Bunda Facebook foydalanuvchi loginini chiziqli qidirishdan foydalanib tekshiradigan bo'lsa va bunda kompyuter sekundiga 10⁶ ta loginni tekshirgan taqdirda ham, o'sha foydalanuvchi profiliga kirishi uchun 1000 soniya (16.6 daqiqa) kutishi kerak bo'lardi. Shu sababli ham bunday holatlar uchun bizga samaraliroq algoritmlar kerak bo'ladi. Ikkilik qidirish algoritmining ishlash prinsipi Ikkilik qidirish algoritmini ishlash prinsipini tushunish uchun keling kompyuter bilan o'yin o'ynab ko'ramiz. O'yin shartlari quyidagicha: 1. Kompyuter 1 dan 100 gacha ixtiyoriy son tanlaydi. Sizning vazifangiz shu sonni iloji boricha kam taxmin ishlatgan holda topish. 2. Har bir taxmindan keyin kompyuter sizga sizning taxminingiz kompyuter o'ylagan sondan katta yoki kichikligini aytadi. 3. Agar sizning taxminingiz kompyuter o'ylagan son bilan bir xil bo'lsa, o'yin tugaydi. Xo'sh, bunda kamroq yo'l tutish uchun nima qilgan bo'lar edingiz? Albatta, birinchi navbatda o'rtadagi sonni taxmin qilib ko'ramiz, ya'ni 50 ni Aytaylik kompyuter bizga taxminimiz o'ylangan sondan kichikroq ekanligini aytdi. Demak, endi biz 50 va undan kichik barcha son o'ylangan sondan kichik ekanligini bilamiz. Shunday qilib, bizning qidirish sohamiz ikki baravarga qisqaradi (50 ta son). Huddi shu tarzda davom etamiz. Endi 51 dan 100 gacha sonlar o'rtasidagi sonni olamiz, ya'ni 75 ni(6.5-rasm). Kompyuter bizga 75 o'ylangan sondan katta ekanligini aytdi. Demak, 75 dan katta barcha sonlar ham o'ylangan sondan katta ekan. Shunday qilib, bizdagi qidirish sohasi yana ikki baravarga qisqardi (25 ta son). Huddi shunday davom etib, biz o'ylangan sonni topishimiz mumkin(6.6-rasm). Sonlar 100 ta bo'lgan holatda, biz har qanday tahminni ko'pi bilan 7 ta qadamda topishimiz mumkin bo'ladi. Ikkilik qidirish algoritmi ham huddi shunday prinsipda ishlaydi! Algoritm qadamlari Ikkilik qidirish algoritmi to'g'ri ishlashi uchun massiv saralangan bo'lishi shart! Bizda n ta elementli saralangan massiv bor va biz undan x elementni qidirmoqdamiz. Biz qidirish chegarasini belgilash uchun l (left) va r (right) ko'rsatkichlardan foydalanamiz. Ular massiv indekslarini ko'rsatib turadi. mid o'zgaruvchi bizda qidirilayotgan sohaning o'rtadagi elementi indeksini ko'rsatadi 1. Avvaliga l = 0 va r=n-1 bo'ladi (butun boshli massiv) 2. O'rtadagi element indeksi hisoblanadi: mid = (l + r)/2; 3. O'rtadagi element indeksi bilan qidirilayotgan son x solishtirib ko'riladi 4. Agar son mos kelsa, algoritm shu joyida to'xtaydi. 5. Agar x o'rtadagi sondan katta bo'lsa, left ko'rsatkichni o'rtadan bitta keyingi elementga suramiz: l=mid + 1; 6. Agar x o'rtadagi sondan kichik bo'lsa, right ko'rsatkichni o'rtadan bitta oldingi elementga suramiz: r=mid — 1; 7. 2-qadamga qaytiladi. Ikkilik qidirish algoritmi har bir qadamda n ni ikki baravarga kamaytirgani uchun algoritm ishlash tezligi O(logn) hisoblanadi. Solishtirish uchun Facebook misolidagi 1 mlrd login ichidan ikkilik qidirish algoritmi 30 ta (!) qadam bilan topishi mumkin. Oddiy qidirishdan tashqari bu algoritmni yana boshqa juda ko'p joyda qo'llash mumkin. Xulosa Xulosa qilib aytganda , bugungi kunda kesh-xotira «piramidali» o‘rnatiladi. Tezligi bo‘yicha eng tezkor, lekin hajmi bo‘yicha eng kichik birinchi darajali keshxotira protsessor kristalli tarkibiga kiradi. Ularni protsessor registrlari tayyorlanadigan texnologiya bo‘yicha tayyorlashadi, natijada u juda qimmat, lekin juda tezkor va eng asosiysi ishonchli bo‘lib qoldi. Uning o‘lchami atigi bir necha o‘n Kbayt bilan o‘lchanadi, lekin u tez ishlov berishda juda katta ahamiyatga ega. Ikkinchi daraja kesh-xotirasi protsessorning o‘sha kristallining o‘zida joylashishi mumkin . Foydalanilgan adabiyotlar 1. Кленберг Дж.,Тардос Е.”Алгоритмы.Разработка и применение”.2016г. 2. Кормен Т.,Лейзерсон Ч.,Ривест Р.«Алгоритмы.Построение и анализ»,2013г. 3. Колдаев. Основы_алгоритмизации_и программирования. 2013 г. 4. Г.Уоррен «Алгоритмические трюки для программистов», 2014 г.