O’ZBEKISTON RESPUBLIKASI AXBOROT TEXNOLOGIYALARI VA KOMMUNIKATSIYALARNI RIVOJLANTIRISH VAZIRLIGI MUHAMMAD AL–XORAZMIY NOMIDAGI TOSHKENT AXBOROT TEXNOLOGIYALAR UNIVERSITETI QARSHI FILIALI Kompyuter Injiniring Fakulteti 2-bosqich DI_11_21 guruh talabasining Algoritmlarni loyihalash fanidan tayyorlagan 4-AMALIY ISHI Bajardi: Omonboyev A. Qabul qildi : Andaqulov Sh. Mavzular: 1."Dag'al kuch" usuli."Xasis" algorittmlar "Ajrat va Hukmrinlik qil" prinsipi bo'yicha ishlaydigan algoritmlarni loyihalash. 2.Elementlar jamlanmasini biror belgi bo'yicha tartiblashtirish algoritmi. 3.Bog'langan graflarga marshrutlar, ularni narxi (masofasi) bo'yicha baholash. 4.Hasis algoritmlar.Eng qisqa marshrutni aniqlash algoritmi. Uni variantlar soni bo'yicha hajmini baholash. 5.Kruskal algoritmi.Prima algoritmi.Xoffman daraxtlari. "Dag'al kuch" usuli, graphtek uzluksiz modellar bo'yicha ajoyib algoritmlardan biridir. Ushbu usulda, bir tugmani topish uchun uzluksiz grafda qidiruv amalga oshiriladi. "Dag'al kuch" usuli joriy va ko'p qadamli variantlari mavjud. "Xasis" algoritm, "hamma yo'lining o'qini qattiq yotkazib, yo'lni ko'z o'ngida e'zozlash" degan iboralarga asoslangan, dinamik dastur ishlab chiqish uchun ajoyib usul hisoblanadi. Ushbu usulda, har bir tugma va uning o'quvchisi uchun qattiqlik (f, g, h) ko'rsatiladi va har bir o'quvchining butun va qoldiq dalasi aniqlanadi. Xuddi shuningdek, yana hammasi tugmalari qidiruvda o'zgartirilishi mumkin. "Ajrat va hukmrinlik qil" prinsipi, qidiruv algoritmlari uchun aniq bir doirasizlikni aniqlash usulidir. Ushbu usulda, bir algoritmning har bir qismi o'zo'zini ajratadi, tahlil qiladi va natijada aniqlangan doirasizlikni chetlab o'tkaziladi. Bu usul yaxshi qidiruv natijalari olish uchun yaxshi hisoblanadi, lekin qiyinchiliklar yuz bergan va sifatli natijalarni olish uchun ko'p vaqt va resurs talab qiladi. Bu prinsiplar, "Dag'al kuch" usuli, "Xasis" algoritmi va "Ajrat va Hukmrinlik qil" prinsipi, bir qancha algoritmlarning loyihalashida foydalaniladilar. Loyihalash jarayonida, algoritmning aniq maqsadi, dastlabki ma'lumotlar va so'nggi maqsadlarga erishish uchun kerakli yo'nalishlar ko'rsatiladi. Shu bilan birga, kompyuterdagi qulaylik va samarali ish yuritish uchun kerakli yo'nalishlarni aniqlash va ularga mos keluvchi algoritmlarni tanlash juda muhimdir. Elementlar jamlanmasini belgilangan belgi bo'yicha tartiblashtirish uchun bir nechta algoritmlar mavjud. Biz quyidagi algoritmni ko'rsatishimiz mumkin: 1. Elementlar to'plamini olish va belgilangan belgini topish. 2. Elementlarni belgilangan belgi bo'yicha ajratish. 3. Ajratilgan elementlar ichidan minimal qiymatni topish. 4. Minimal qiymatni saralash ketma-ketligiga joylashtirish. 5. Ajratilgan elementlar soni 1 ga teng bo'lguncha 2-4 qadamni takrorlash. Bu algoritmning yordamida belgilangan belgi bo'yicha tartiblangan jadval hosil qilinadi. Bu algoritm O(n^2) vaqt talab qilsa ham, ularning darajasi, shuningdek, qisqa ro'yxatlar uchun yaxshi ishlaydi. Quyidagi Python kodi yordamida ushbu algoritmni amalga oshirishingiz mumkin: ``` def selection_sort(arr, key): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j][key] < arr[min_idx][key]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr ``` Bu funksiya ro'yxatni va belgilangan belgini qabul qiladi va tartiblangan ro'yxatni qaytaradi. Misol uchun, quyidagi kabi 2 elementdan iborat ro'yxatni tartiblash uchun kodi ishlatishingiz mumkin: ``` my_list = [{'ism': 'Ali', 'yosh': 25}, {'ism': 'Vali', 'yosh': 20}] sorted_list = selection_sort(my_list, 'ism') print(sorted_list) ``` Konsolga chiqqanda quyidagi natija chiqadi: ``` [{'ism': 'Ali', 'yosh': 25}, {'ism': 'Vali', 'yosh': 20}] ``` Keyin esa ism bo'yicha tartiblangan ro'yxatni ko'rsatadi: ``` [{'ism': 'Ali', 'yosh': 25}, {'ism': 'Vali', 'yosh': 20}] ``` Bog'langan graflar bilan ishlashning bir nechta usullari mavjud, lekin uchta asosiy algoritm mavjud: Dijkstra algoritmi, Bellman-Ford algoritmi va FloydWarshall algoritmi. Bu usullardan Dijkstra algoritmi va Bellman-Ford algoritmi yagona manzilda ishlatiladigan algoritmlar hisoblanadi. Ular bir boshlang'ich qo'llanma yoki to'liq qo'llanma asosida tushuncha bilan tushuntirilgan. Shunday qilib, ular bog'liq graflarni ajratish va yaqin yo'llarni topish uchun qo'llanishadi. Bu algoritmlar bepul yo'llar, yo'l uzunligi va narxini topish uchun ishlatiladi. Floyd-Warshall algoritmi esa har bir uchta qo'shimcha bosqichli algoritmlarga mos keladi. Bu algoritmning asosiy maqsadi, qo'shimcha bo'shliqlarning bo'lgan graflarni ajratish va ularning orasidagi masofalarni topishdir. Bu algoritm qo'shimcha bo'shliqlarning masofalarni topish uchun xizmat qiladi va undan foydalanish uchun n^3 vaqt talab qiladi. Quyidagi Python kodi yordamida Dijkstra algoritmini ishlatib, bog'langan graflarda masofa bo'yicha narxni topish uchun ishlatishingiz mumkin: ``` import heapq def dijkstra(graph, start): distances = {vertex: float('infinity') for vertex in graph} distances[start] = 0 pq = [(0, start)] while pq: current_distance, current_vertex = heapq.heappop(pq) if current_distance > distances[current_vertex]: continue for neighbor, weight in graph[current_vertex].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(pq, (distance, neighbor)) return distances graph = { 'A': {'B': 5, 'C': 1}, 'B': {'A': 5, 'C': 2, 'D': 1}, 'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8}, 'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6}, 'E': {'C': 8, 'D': 3}, 'F': {'D': 6} } print(dijkstra(graph, 'A')) ``` Bu kod bizga grafdagi barcha yo'llarni topishga yordam beradi va quyidagi natijani chiqaradi: ``` {'A': 0, 'B': 3, 'C': 1, 'D': 4, 'E': 7, 'F': 10} ``` Natijada, A dan barcha boshqa nuktalarga eng yaqin yo'l va narx topildi. 1. Hasis algoritmlar: Hashing, qo'shma matn, matn yoki fayllarni hisoblash uchun ishlatiladigan eng oddiy va kuchli algoritmlardan biridir. Bu algoritm matnni yoki faylni (bu ularning bir to'plami) qo'shma sonlarga aylantiradi va qo'shma sonlarni boshqa, asosan kichik bo'lgan sonlarga aylantiradi, shu bilan birga, qo'shma sonlar keng o'zgaruvchilar to'plami sifatida saqlanadi. 2. Eng qisqa marshrutni aniqlash algoritmi: Bu algoritmni aniqlash uchun ikkita qadam bajariladi: 1. Barcha to'plamlarni qarshilik keladigan harakatni hisoblang. 2. Harakat qo'shish kerak bo'lgan to'plamni tanlang va uni amalga oshirish. 3. Uni variantlar soni bo'yicha hajmini baholash: Uni variantlar soni bo'yicha hajmini baholash (inversiyaga muvofiq) n(n-1)/2 formasida ifodalangan holda, shu yerda n - bu ko'plik elementlar soni hisoblanadi. 4. Kruskal algoritmi: Kruskal algoritmi, to'plamlarni bog'lash uchun eng yaxshi minimal jadvallarni aniqlash uchun ishlatiladi. Bu algoritm barcha to'plamlarni izohlash va eng kam uchraydigan qirralarni tanlashdan iboratdir. Shu bilan birga, Kruskal algoritmi barcha to'plamlarni eng kam uchraydigan qirralarga bog'lash uchun ishlatiladi. 5. Prima algoritmi: Prima algoritmi Kruskal algoritmidan farqli ravishda ishlaydi va graf uchun qisqa bosqichli minimal jadvalni aniqlash uchun ishlatiladi. Algoritmda, bir boshlang'ich to'plam tanlanadi, keyin u to'plamlar bilan bog'liq barcha qirralarning og'irligi aniqlanadi. Keyingi qadamda, eng kam og'irlikli qirral tanlanadi, u to'plamlarga qo'shiladi va eng kam og'irlikli qirralni aniqlash uchun qayta hisoblanadi. 6. Xoffman daraxtlari: Xoffman daraxtlari, ba'zi ma'lumotlarni yoki datalarni saqlash uchun ishlatiladigan kengaytma daraxtlari turlari hisoblanadi. Shu bilan birga, bu daraxtlarning boshqacha ishlatiladigan joylarda kengaytirilgan matnli ma'lumotlar uchun ham ishlatiladi. Xoffman daraxtlari, bir xil uzunlikdagi barcha kodlarni ishlatmay