Uploaded by Asiljon Omonboyev

4-amaliy

advertisement
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
Download