Uploaded by umahmudov556

Qambarov Hojiakbar

advertisement
O‘ZBEKISTON RESPUBLIKASI
RAQAMLI TEXNOLOGIYALAR VAZIRLIGI
MUHAMMAD AL – XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
FARG‘ONA FILIALI
“Kompyuter injiniringi” fakulteti
Kompyuter injiniringi yo‘nalishi
710-21 – guruh talabasi
Qambarov Hojiakbarning
“MA’LUMOTLAR TUZILMASI VA ALGORITMLAR”
fanidan tayyorlagan
AMALIY ISH TOPSHIRIQLARI
Topshirdi:
H.Qambarov
Qabul qildi:
O.I.Ergashev
Farg‘ona 2022
1
1 – Amaliy mashg‘ulot: Ma’lumotlarning har xil turlarini qayta ishlash
dasturlarini tuzish. Algoritmlaming turlari, Umumiy ko‘rinishdagi ma’lumotlar
tuzilmalarini hosil qilish, Rekursiv misollarni tahlil qilish, Rekursiv
algoritmlarning dasturlarini ishlab chiqish.
Ishdan maqsad: Umumiy ko‘rinishdagi ma’lumotlar tuzilmasini hosil qilishni
o‘rganish.
Qo‘yilgan masala: Umumiy ko‘rinishdagi ma’lumotlar tuzilmasini hosil qilish
algoritmlarini ishlab chiqish.
Ish tartibi:
1. Tajriba ishi nazariy ma’lumotlarini o‘rganish;
2. Berilgan topshiriqning algoritmini ishlab chiqish;
3. C++ dasturlash muhitida dasturni yaratish;
4. Natijalarni tekshirish;
5. Hisobotni tayyorlash va topshirish.
Ma’lumotlar turli turdagi ob’ektlardan iborat bo‘lishi mumkin. Ma’lumotlarni
quyidagi turkumlarda klassifikatsiyalash mumkin:
1. Massivlar: Massiv, bir nechta elementlarni biror tartibda saqlaydigan turdagi
ma’lumotlardir. Massivlar tezkor qidirish va elementlarni tartiblab yuklash uchun
foydalaniladi.
2. Vektorlar: Vektorlar, biror fizikavi o‘zgaruvchini yoki ko‘rsatkichni ifodalovchi
ma’lumotlardir. Vektorlar, o‘z x, y, va z koordinatalari bo‘yicha ma’lumotlarni
saqlaydigan turdagi ob’ektlardir.
3. Yozuvlar: Yozuvlar matn ma’lumotlarini ifodalovchi turdagi ob’ektlardir. Bu
turdagi ma’lumotlar matnlar, matn qatorlari, fayllar yoki boshqa yozuvlardan iborat
bo‘lishi mumkin.
4. To‘plamlar: To‘plamlar, bir qator ma’lumotlarni biror maqsad uchun
birlashtiruvchi turdagi ma’lumotlardir. Ko‘p xil turdagi to‘plamlar mavjud bo‘lishi
mumkin, masalan, listlar, ro‘yxatlar, ko‘p to‘plamlar, va boshqalar.
2
5. Ko‘rsatkichli turlar: Ko‘rsatkichli turlar ma’lumotlarni qayd etish, ifodalash
yoki boshqa ko‘rsatkichliklar uchun foydalaniladigan turdagi ob’ektlardir. Bu,
ma’lumotlarni biror bir turi yoki klassi bilan bog‘liqlash uchun foydalaniladi.
C++ dasturlash tilida massivlar va vektorlar (vectorlar) yaratish, ularga ma’lumot
qo‘shish, ma’lumotni olish va ma’lumotlar bilan ishlash uchun ko‘p qo‘llaniladigan
konseptlardir. Bu konseptlarni quyidagi misollarda o‘rganishingiz mumkin:
Massivlar (Arrays):
1. Massiv yaratish va o‘zgaruvchilarni unda saqlash:
Massiv yaratish uchun o‘lchami belli bo‘lgan o‘zgaruvchilar tuzish kerak.
Massivning o‘lchami, o‘lchamlar soni va turi bo‘lishi mumkin.
int myArray[5]; // 5 ta butun sonlarni o‘z ichiga olgan massiv
double doubleArray[10]; // 10 ta haqiqiy sonlarni o‘z ichiga olgan massiv
2. Massivga ma’lumotlarni qo‘shish va olish:
Massivga ma’lumot qo‘shish va olish uchun indekslar yordamida foydalaniladi.
Massivning indeksi 0 dan boshlanadi.
myArray[0] = 42; // Massivning birinchi elementiga qiymatni o‘rnating
int value = myArray[2]; // Massivning ikkinchi elementini olish
Vektorlar (Vectors):
Vektorlar, dinamik massivlar sifatida ishlaydigan STL (Standard Template Library)
qisqichda, C++-da mavjud. Ularni ishlatish uchun quyidagi amallarni bajarishingiz kerak:
1. Vector kutubxonasini (library) qo‘shish:
#include <vector>
2. Vector yaratish va ma’lumot qo‘shish:
std::vector<int> myVector; // Bo‘sh vektor yaratish
myVector.push_back(10); // Ma’lumotni vektorga qo‘shish
myVector.push_back(20);
3. Vektordan ma’lumot olish:
int value = myVector[0]; // Vektordan ma’lumot olish
4. Vektorning o‘lchamini aniqlash:
int size = myVector.size(); // Vektorning o‘lchamini aniqlash
3
Vektorlar massivlarga nisbatan ko‘p maqbul, chunki ularga o‘lchamni dinamik
ravishda o‘zgartirish imkoniyati mavjud. Massivlar esa o‘lchamini e’lon qilish va
o‘zgartirish uchun joriy e’lon qilinishi kerak bo‘ladi.
Amaliy mashg‘ulot ishlari uchun topshiriqlar:
10. Masssivdagi x elementlar sonini qiymat sifatida qaytaruvchi dastur algoritmini
tuzing.
Javobi:
4
2 – Amaliy mashg‘ulot : Ma’lumotlarni qidirish algoritmlari va dasturlarini ishlab
chiqish, Ma’lumotlar tuzilmalarini xeshlash algoritmlari yordamida hosil qilish.
Ma’lumotlarni saralash algoritmlari va dasturlarini ishlab chiqish, Chiziqli
ma’lumotlar tuzilmalarini qayta ishlash algoritmlari va dasturlarini tuzish.
Ishdan maqsad: Ushbu amaliyot ishining maqsadi talabalar qanday qidirish usullari
va algoritmlari mavjudligini va ularning samaradorliklarini baholashni o‘rganishlari
kerak. Shu asosda qidirish usullarini qiyosiy tahlil qilishlari, C++ dasturlash tilida
qidirish bilan islashni va ularga oid dasturlar tuzishni o‘zlashtirishlari kerak.
Qo‘yilgan masala: Talabalar topshiriq variantiga mos qidirish usuli yordamida
masalani yechish dasturini yaratish ko‘nikmasiga ega bo‘lishlari kerak.
Ish tartibi:
1. Tajriba ishi nazariy ma’lumotlarini o‘rganish;
2. Berilgan topshiriqning algoritmini ishlab chiqish;
3. C++ dasturlash muhitida dasturni yaratish;
4. Natijalarni tekshirish;
5. Hisobotni tayyorlash va topshirish.
Aytaylik bizga massiv berilgan: a [] ={15, 23, 7, 45, 87, 16};
Bizga ushbu massivda biron bir element bor yoki yo‘qligini tekshira oladigan
dastur tuzish sharti qo‘yilgan. Ushbu masalani yechishda eng birinchi xayolga keladigan
usul - bu massivni ketma-ket har bir elementini solishtirib chiqish va bu usul:
Chiziqli qidiruv - Linear Search deb ataladi, va bu usul kodi quyidagi ko‘rinishda:
#include <iostream>
usingnamespace std;
int linearSearch(int array[], int size, int searchValue)
{ for(int i =0; i < size; i++)
{ if(searchValue == array[i])
{ return i; }}
return-1;
5
} int main()
{ int a[]={15, 23, 7, 45, 87, 16};
int userValue;
cout<<"Enter an integer: "<< endl;
cin>> userValue;
int result = linearSearch(a, 6, userValue);
if(result >=0)
{ cout<<"The number "<< a[result]<<" was found at the"
" element with index "<< result << endl;
} else {
cout<<"The number "<< userValue <<" was not found. "<< endl; } }
Ko‘rib turganingizdek, funksiyamiz 2 ta parametr qabul qiladi, birinchisi massivni
o‘zi, ikkinchisi esa biz qidirayotgan element. Agar uni topa olmasak, “-1” qiymatni
qaytaramiz.
Endi bundan optimal bo‘lgan usul – binary (ikkilik) qidiruvni ko‘rib chiqsak. Bu
usulda ham funksiyaga 2 ta parametr, birinchisi massiv o‘zi keyin esa biz qidirayotgan
elementni parametr sifatida beriladi. Qidiruv esa quyidagicha: Dastlab biz massiv boshi
va oxirini o‘zimiz uchun o‘zgaruvchilarda belgilab olamiz, mening kodimda bu left va
right o‘zgaruvchilaridir:
left := 0 right := len(a)
so‘ngra quyidagi shart bajarilgan holda
left< right
quyidagi ketma-ket operatsiyalarni amalga oshiramiz
1. left va right index lari markazidagi elementni topamiz (left + right) / 2
2. topilgan elementimiz biz qidirayotgan elementga teng bo‘lsa unda mid elementni
javob sifatida qaytaramiz
6
3. agar a[mid] elementimiz biz qidirayotgan elementdan kichkina bo‘lsa biz left =
mid deb belgilaymiz va shunda a[mid:right] bo‘lagida qidiruv davom etadi.
4. agar a[mid] elementimiz biz qidirayotgan elementdan katta bo‘lsa demak right =
mid deb belgilaymiz shunda qidiruv a[left:mid] bo‘lagida qidiruv davom etadi.
Shu zaylda qidiruv left < right shart bajarilmagunicha davom etadi, agar bu jarayonda
biz qidirgan element topilmasa u xolda -1 javob qaytariladi, quyida dastur kodi
keltirilgan:
#include <iostream>
Using namespace std;
int binarySearch(int array[], int size, int searchValue)
{ int low =0;
int high = size -1;
int mid;
while(low <= high)
{ mid =(low + high)/2;
if(searchValue == array[mid])
{ return mid;
} elseif(searchValue > array[mid])
{ low = mid +1; }
else
{ high = mid -1; } }
return-1; }
int main()
{ int a[]={12, 22, 34, 47, 55, 67, 82, 98};
int userValue;
cout<<"Enter an integer: "<< endl;
cin>> userValue;
int result = binarySearch(a, 8, userValue);
if(result >=0)
7
{ cout<<"The number "<< a[result]<<" was found at the"
" element with index "<< result << endl;
} else { cout<<"The number "<< userValue <<" was not found. "<< endl; }}
Bu usul binar qidiruvni iterativ usuli deyiladi, shuningdek bu algoritmni rekursiya
usulida ham yozish mumkin, rekursiv usulni erinmasangiz o‘zingiz yozib ko‘ring. Bitta
urinishda ko‘pchilik dasturchilar bu narsani to‘g‘ri yoza olishmaydi va bu normal holat,
chunki xato bor joyda o‘z ustida ishlash uchun imkoniyat bo‘ladi.
Endi bu qidiruv usullarini ayrim jihatlarini keltirib o‘tamiz:
1. funksiyaga berilayotgan massiv Binar qidiruv uchun albatta o‘sish tartibida bo‘lishi
talab qilinadi, chiziqli qidiruv uchun esa berilayotgan massiv qay tartibda bo‘lishini
ahamiyati yo‘q
2. chiziqli qidiruvda elementlarni bittalab har birini tekshiriladi, binarda esa
algoritmidan kelib chiqib chiziqliga nisbatan ancha kam solishtirish amali bajariladi,
chiziqli qidiruvning ishlash vaqti ko‘pi bilan O(n) va binar qidiruvniki ko‘pi bilan O(log
n)
Xeshlash – bu ma’lum bir turdagi va ixtiyoriy uzunlikdagi kirish ma’lumotlari
massivini fiksirlangan uzunlikdagi chiquvchi bitlar qatoriga (butun son) aylantirish.
Bunday akslantirish (aylantirish) xesh-funksiya deb ham ataladi. Xesh-funksiya – bu
kirish ma’lumotlarini sonlarga aylantiruvchi funksiya bo‘lib, bir xil ma’lumotlar to‘plami
hamma vaqt bir xil natija beradi. Xesh-jadval – bu elementlari “kalit-qiymat” juftliklari
bo‘lgan assotsiativ massiv shaklidagi ma’lumotlar tuzilmasi.
8
Xeshlash assotsiativ massivlarni tashkil qilish uchun qo‘llaniladi, bunda indekslari
sonlar emas, balki ixtiyoriy qiymatlar bo‘ladi. Xeshlashdan odatda matnlardan
nusxalarning takrorlanishini qidirishda, ya’ni xesh-funksiyalarining bir xil qiymatiga ega
bo‘laklarni qidirishda foydalaniladi. Bundan tashqari, xeshlash ko‘pincha parollarni
saqlash uchun ishlatiladi; shu bilan birgalikda noyob identifikatorlarni yaratish uchun,
masalan, agar fayl o‘ziga xos nomni talab qilsa, siz ushbu faylni xeshlash natijasini
hisoblab chiqishingiz va natijani faylga nom sifatida ishlatishingiz mumkin. Shuningdek,
bu matnlarning nazorat summasini hisoblash uchun juda muhimdir. Aytaylik,
foydalanuvchi tarmoq orqali bir nechta matn yuborishi kerak. Tekshirish summasi matn
bilan birga uzatiladi, olinganidan keyin asl nusxasi bilan tekshiriladi. Agar summasi mos
kelmasa, demak matnni uzatishda qandaydir xatolik bo‘lganligi haqida xulosa qilish
mumkin bo‘ladi. Xesh-jadval – assotsiativ massivni tatbiq etish uchun qo‘llaniladigan
interfeys hisoblanadi. Unda kalitlar va xeshlangan kalitlardan tashkil topgan juftliklar
saqlanadi. Xesh-jadval unga yangi juftlik qo‘shish, kaliti bo‘yicha juftliklarni qidirish va
o‘chirish imkonini beradi. Xesh-jadval xesh-funksiya tomonidan ma’lum bir tartibda
shakllanadi.Xesh-jadvallari ko‘pincha ma’lumotlar bazalarida, ayniqsa, kompilyatorlar
va assemblerlar kabi til protsessorlarida qo‘llaniladi, bu yerda ular identifikatorlar
jadvalini qayta ishlash tezligini oshiradi.
Xesh-jadvallarni tatbiq qilish va xesh-funksiyani tanlash
Xesh-jadvallar quyidagi xossalarga mos kelishi shart:
9
Xesh-jadvalida amallarni bajarishdan oldin, kalitning xesh-funksiyasi hisoblanadi,
natijada kirish massivdagi indeks hosil bo‘ladi. Xesh jadvalini to‘ldirish koefitsienti - bu
saqlanadigan massiv elementlari soni, xesh funksiyasining mumkin bo‘lgan qiymatlari
soniga bo‘linadi. Bu operatsiyalarning o‘rtacha bajarilish vaqti bog‘liq bo‘lgan muhim
parametr hisoblanadi.Odatda yaxshi xesh-funksiya quyidagi shartlarni qonatlantiradigan
funksiya ekanligi qabul qilinadi. Funktsiya: hisoblash nuqtai nazaridan sodda bo‘lishi
kerak (bu kompyuterning xususiyatlariga bog‘liq), xesh jadvalga kalitlar iloji boricha
teng taqsimlanishi (ma’lumotlar qiymatiga qarab), kolliziyalar sonini kamaytirishga
harakat qilishi kerak. Funksiya asosiy kalitlar qiymatlari orasidagi bog‘liqlikni manzil
qiymatlari o‘rtasidagi munosabat bilan taqqoslamasligi kerak.
Xeshlash funksiyasini hosil qilishga misollar
Xeshlash uchun matn berilgan bo‘lsin. U belgilar ketma-ketligidan iborat va
berilgan matn uchun unikal (yagona) natija beruvchi xesh-funksiyani ishlab chiqish talab
qilingan bo‘lsin.
Soddalik uchun 3-rasmda berilganidek bir nechta belgilar ketma-ketligini olamiz.
Har bir belgining ost qismida ASCII jadvali bo‘yicha mos kodi berilgan.
Ushbu ketma-ketlikdagi har bir belgining sonli qiymatlari bo‘yicha xeshfunksiyaning qiymatlarini tashkil qilish kerak. Bu qiymatlarni hosil qilish bilan yuelgilar
to‘plamini qayta ishlash mexanizmini o‘ylash kerak bo‘lgan xesh-funksiya shug‘ullanadi.
Yoddan chiqarmaslik kerakki, xeshlangan kalit fiksirlangan uzunlikka ega bo‘ladi,
imkoni boricha kichik bo‘lishi kerak. Xeshlashdan keyin kalit 8 razryaddan tashkil topgan
bo‘lsin, ya’ni 0 yoki 1 qiymatni qabul qiluvchi 8 bit uzunlikka ega deb olamiz. Shunga
mos ravishda xesh-funksiyaning turli xil qiymatlari soni 28=256 ta (0 dan 255 gacha)
10
variantda bo‘lishi mumkin. 4-rasmda sakkiz razryadli xesh-funksiyaning umumiy
ko‘rinishi tasvirlangan.
Amaliy mashg‘ulot ishlari uchun topshiriqlar:
10. Butun sonlar orqali berilgan 1 dan 55 gacha bo’lganlari ichida ekranga 28
raqami chiquvchi chiziqli qidiruv algoritmi tuzilsin va natijalar taxlil qilinsin.
Javob:
11
3 – Amaliy mashg‘ulot: Chiziqli bog‘langan ro‘yhatlar bilan ishlash algoritmlari
va dasturlarini tuzish, Daraxtsimon ma’lumotlar tuzilmalarini qayta ishlash
algoritmlari va dasturlarini tuzish, Heap tree ko‘rinishidagi binar daraxtlar bilan
ishlash algoritmlari, Graflarni ko‘ruv algoritmlarini ishlab chiqish, Graflarda eng
qisqa yo‘lni aniqlash algoritmlari va dasturlarini tuzish.
Graflar, bir nechta ob’ektlar yoki elementlarning aloqadorliklarini ifodalaydigan
tuzilmagan ma’lumotlarni tasvirlash uchun keng foydalaniladigan ma’lumotlarni
ifodalaydigan turlaridan biridir. Graflarni mantiqiy tasvirlash uchun quyidagi usullar
o‘rin oladi:
1. Grafik: Grafik tasvirlash usuli ob’ektlar yoki elementlarni ko‘rsatish uchun
grafiklarni (chiziq, nuqtalar, ko‘rsatkichlar) ishlatadi. Bu usulni foydalanish bilan,
graflarni ko‘rish oson va o‘qituvchi bo‘ladi. Grafiklar orqali grafiklarni tushunish va tahlil
qilish oson bo‘ladi.
2. Matritsa: Grafni matritsa yordamida tasvirlash usuli, grafni yagona matritsa
ichida ifodalaydi. Ushbu matritsada elementlar (qatlar) va ularning aloqadorliklari
(to‘plamlar) ko‘rsatiladi. Bu usul tahlil qilish uchun qulay bo‘lib, matritsalar orqali grafni
aniqlash, algoritmlarni yaratish, va grafni tushuntirish osonlashadi.
3. Ro‘yxatlar: Grafni ro‘yxatlar yordamida tasvirlash usuli, grafdagi elementlarni
ro‘yxatlarda saqlash va ularning aloqadorliklarini ko‘rsatishni o‘z ichiga oladi.
Elementlar o‘zgaruvchilar yoki ob’ekt bo‘lishi mumkin. Ushbu usulni foydalanish oson
va tuzilishi sodda bo‘ladi.
4. Grafiklar: Tasvirlash uchun grafiklar (chiziq, nuqta, liniyalar, ranglar)
foydalanish oson va ehtimoliy tushunarli bo‘lib, tahlil qilishni osonlashtiradi. Grafiklar
orqali grafiklarni tushuntirish va tahlil qilish oson va yaxshi ko‘rinadi.
5. Tarmoq shemalari: Tarmoq shemalari, graflarni tarmoq shemasi ko‘rinishida
tasvirlash uchun ishlatiladi. Ushbu usulga ob’ektlarni tarmoqning yagona nuqtalariga
bog‘lash orqali aloqadorliklarini ko‘rsatish mumkin.
6. Axborotlar modelli: Axborotlar modellari tasvirlash usuli graflarni axborotlarni
tizimlashtirish va aloqadorliklarini ifodalovchi usulga aylantiradi. Ushbu usulga
ma’lumotlar bazalarda, tizimlarda, va boshqa axborotlarning saqlash va tashqariga olib
12
chiqish qo‘llaniladi. Bu mantiqiy tasvirlash usullari graflarni, ma’lumotlarni, tizimlarni,
va boshqa ob’ektlarni tushunish va aniqlash uchun foydalaniladi. Har bir usulning o‘ziga
xos afzalliklari va chegaralari mavjud bo‘lib, qaysi usulni tanlash o‘z Amaliy mashg‘ulot
siga bog‘liq. Masalan, quyidagi yo‘naltirilmagan grafik tasvirini ko‘rib chiqing
Yo‘naltirilgan graf
Graflarda eng qisqa yo‘lni aniqlash (shortest path problem) algoritmlari va
dasturlari ma’lumotlar tarmoqida eng qisqa yo‘lni topish uchun ishlatiladi. Bu algoritm
va dasturlar, aloqadorliklarni tahlil qilish, tarmoqni tuzish, va boshqalar kabi turli
sabablarni muvaffaqiyatli yechish uchun ishlatiladi. Quyidagi ikkita eng mashhur yo‘lni
aniqlash algoritmi bilan tanishasiz:
1. Dijkstra algoritmi:
Dijkstra algoritmi grafdagi eng qisqa yo‘lni aniqlash uchun ishlatiladi. Bu
algoritm aloqadorliklar va ularga bo‘lgan masofalarni hisoblash orqali eng qisqa yo‘lni
topadi. Algoritm boshlanishi tug‘ilgan tug‘ilgan nuqta va qo‘ng‘iroqning saqlanishi yoki
uni qiyoslash bilan boshlanadi. Algoritmi dasturiy til bilan tuzish mumkin.
2. Bellman-Ford algoritmi:
13
Bellman-Ford algoritmi ham grafdagi eng qisqa yo‘lni aniqlash uchun ishlatiladi.
Bu algoritm negativ massivlarga (masofalarga) ega bo‘lgan graflarni ham qo‘llaydi. Bu
algoritm odatda negativ massivlarga ega graflar uchun ishlatiladi.
Amaliy mashg’ulot ishlari uchun topshiriqlar.
10.
b-f tugunlari orasidagi eng qisqs masofani toping.
Javob:
Nazorat savollari:
1. Dijkstra algoritmi va Bellman-Ford algoritmi orasidagi farq nima?
2. Graflar qanday turlarda aniqlanadi?
3. Graflarni tasvirlash va yaratish uchun qanday dastur tuzish mumkin?
Hulosa
Men bu amaliy mashgulotlarda pyhton dasturida va grafiklar ishlashni o’rgandim va bular
asosida amaliy mashgulotlar bajardim
14
Download