Shiber-vishkin algoritmi
SHAROF RASHIDOV NOMIDAGI SAMARQAND DAVLAT UNIVERSITETI RAQAMLI TEXNOLOGIYALAR FAKULTETI - vishkin algoritmi Bajaruvchi: L.Xamidov Ilmiy rahbar : ______________ Kafedra mudiri : _____________ ishi Tarix kafedrasining 2022 - yil ___ ________ majlisida himoya qilindi va ______ foizga baholandi . Komissiya raisi :________________ _________________________ A :______________________ _________________________ Samarqand – 2022
2 Sharof Rashidov nomidagi Samarqand davlat universiteti Raqamli texnologiyalar fakulteti Amaliy matematika 202 -guruh talabasi Xamidov Jahongir ning « Shiber -Vishkin algoritmi » mavzusidagi kurs ishiga T A Q R I Z ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ _______________________________________________________ ____________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________ ________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ _______________________________ ____________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________ ________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ _______ ____________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ______________________________________________________________ _____ ___________________________________________________________________ ___________________________________________________________ ________ ___________________________________________________________________ __________________________________________________ _________ ________ ___________________________________________________________ ________ Ilmiy rahbar: __________________ o’qit. _____________
3 MUNDARIJA KIRISH ……………………………………………….…………………………. 4 I-BOB. ALGORITMNING G’OYASI HAQIDA KELTIRILGAN MA’LUMOTLAR 1.1. Algoritm g’oyasi ……………………………………………………………. 5 II -BOB. KOMPL’OS ALGORITMIDAN SHIBER VISHKIN ALGORITMIGA O’TISH. SHIBER -VISHKIN ALGORITMI 2.1 Kompl’os algoritmidan Shiber -vishkin algoritmiga o’tish……… …………… 9 2.2. Shiber -vishkin algoritmi……….……… ………………. …………………… 17 XULOSA…. .………………………………………………………………….…. 24 FOYDALANILGAN ADABIYOTLAR RO’YXATI …….…………………… 25 ILOVALAR ………………………………………………………………………26
4 KIRISH Muammoning dolzarbligi. Cho'qqilari va qirralari bilan yo'naltirilgan yoki yo'naltirilmagan vaznli grafik berilgan. Hammaning vazni qirralari manfiy emas. Ba'zi boshlang'ich uchlari ko'rsatilgan. Cho'qqidan eng qisqa yo'llarning uzunliklarini topish talab qilinadi boshqa barcha cho'qqilarga, s huningdek, eng qisqa yo'llarni o'zlari chiqarish yo'lini ta'minlaydi. Bu muammo bitta manbali eng qisqa yo'llar muammosi deb ataladi. Daraxtlardagi eng asosiy algoritmik muammolardan biri eng kichik umumiy ajdodni qanday topishdir. Har bir tugun o'z ota -on asiga ishora qiluvchi daraxt ma'lumotlar strukturasida v va w dan ildizgacha bo'lgan yo'llarning birinchi kesishishini topish orqali eng kichik umumiy ajdodni osongina aniqlash mumkin. Umuman olganda, ushbu algoritm uchun zarur bo'lgan hisoblash vaqti O (h ), bu erda h - daraxtning balandligi (bargdan ildizgacha bo'lgan eng uzun yo'lning uzunligi) hisoblanadi. Daraxt - N ta uchi va N -1 qirralari bo'lgan yo'naltirilmagan bog'langan grafik. Har qanday cho'qqidan boshqasiga bitta oddiy yo'l bor.Daraxtning ildi zi cho'qqi deb ataladi, undan o'tayotganda daraxt bo'ylab harakat yo'nalishi ko'rsatilgan. Ikki u va v cho'qqilarning eng kichik umumiy ajdodi ildizdan v cho'qqigacha va u cho'qqigacha bo'lgan yo'lda, shuningdek, undan eng uzoqda joylashgan p uchi deb atal adi. Ma'lumotlarni kiritish: Kirish daraxt haqida ma'lumot oladi: N - uchlari soni, chekka bilan bog'langan N -1 juft uchlari va M - so'rovlar soni. Keyin dastur so'rovlarni qabul qiladi: ikkita u va v uchlari, buning uchun ularning eng kichik umumiy ajdodi ni topish talab qilinadi.
5 I-BOB. ALGORITMNING G’OYASI HAQIDA KELTIRILGAN MA’LUMOTLAR 1.1. Algoritm g’oyasi Biz har bir cho'qqi uchun ildizgacha bo'lgan masofani va biz unga kelgan oldingi cho'qqiga (ajdod) saqlaymiz. Keyin u va v cho'qqilaridan daraxtning ildizigacha ko'tarilamiz. Har bir qadamda biz ildizdan eng uzoq bo'lgan u yoki v cho'qqisini tanlaymiz va keyin uning o'rniga uning ajdodini ko'rib chiqamiz, toki boshlang'ich u va v dan hosil bo'lgan yo'llar bitta cho'qqi - ularning eng kichik umumiy ajdodiga olib boradi. Daraxtning turli xil variantlari bilan bunday yo'l N bosqichdan iborat bo'lishi mumkin, bu juda ko'p sonli tugunlar va so'rovlar bilan juda sekin ishlaydi. Ushbu dastur har bir so'rovni bajarish uchun O (N) vaqtini talab qiladi . Endi algoritmni yaxshilaymiz. Har bir cho'qqi uchun biz uzoq daraxtning ildizigacha bo'lgan masofani, uning bolalari sonini, shuningdek, biz unga oxirgi marta kelgan ajdodimizni (tanlash quyida aniqlanadi) va raqamni saqlaymiz. cheti ajdoddan chiqadigan cho'qqidan, bu cho'qqiga burilish yo'lida ... Kerakli o'zgaruvchilarni e'lon qilaylik, qulaylik uchun bu global xotirada amalga oshiriladi. const int SIZE = 100050; vector<int> v[SIZE]; // har bir cho'qqi uchun qirralarning ro'yxati bool vis[SIZE]; // o’t ish paytida cho’qqilarni ziyorat qilish haqida eslatmalar int kids[SIZE]; // Har bir tepalikdagi avlotlar soni int dist[SIZE]; // Tepadan ildizgacha bo’lgan masofa int last[SIZE]; // Oldingi cho’qqi raqami int turn[SIZE]; Endi har bir cho'qqi uchun rekurs iv funktsiyadan foydalanib (k_go (0) ga qo'ng'iroq qiling), biz uning avlodlari sonini hisoblaymiz: int k_go(int s) { int res = 0;