Uploaded by Shoxrux Umarov

Algoritmlar Umarov

advertisement
O’zbekiston Respublikasi Axborot Texnologiyalari
va Kommunikatsiyalarini Rivojlantirish Vazirligi
Muhammad Al-Xorazmiy nomidagi
Toshkent Axborot Texnologiyalari Universiteti
MUSTAQIL ISH
Mavzu: Dastulashda ma’lumotlar tuzilmasining o’rni va
ahamiyati. C++ dastulash tilida ma’lumotlar turlari, ularni e’lon
qilish va tasvirlash tushunchalari. Vektorlar va ularning
xossalari.
Guruh: ________
Bajardi: _____________
Tekshirdi: ____________
Toshkent 2022
Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati. C++
dastulash tilida ma’lumotlar turlari, ularni e’lon qilish va
tasvirlash tushunchalari. Vektorlar va ularning xossalari.
Reja:
1. Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati.
2. C++ dastulash tilida ma’lumotlar.
3. Vektorlar va ularning xossalari.
Dastulashda ma’lumotlar tuzilmasining o’rni va ahamiyati.
Barcha dastur yoki dasturiy mahsulotning asosida ikkita birlik
yotadi: ma’lumotlar va ular ustida qandaydir amallar bajaradigan
algoritmlar. Algoritmlar ma’lumotlarni biz yoki dastur uchun foydali
bo’lgan axborot ko’rinishiga keltirib beradi. Algoritmlar shu
ma’lumotlar ustida amallarni (o’qish, yozish, yangilash, o’chirish)
samarali va tez bajara olishi uchun biz shu ma’lumotlarni ma’lum bir
strukturaga solgan holda saqlashimiz kerak bo’ladi. Demak shunday
qilib,
Ma’lumotlar tuzilmasi — bu ma’lumotlarni samarali o’qish va
o’zgartirish imkonini beruvchi, ma’lumotlarni saqlash va
boshqarishning bir formatga solingan shaklidir.
Soddaroq qilib aytganda, ma’lumotlar tuzilmasi — bu
ma’lumotlarning ma’lum bir strukturaga solingan, ular o’rtasida
ma’lum bir bog’lanishlar yaratilgan va ular ustida ma’lum amallar
bajaruvchi funksiyalardan tashkil topgan guruh. Eng sodda
ma’lumotlar tuzilmasiga misol qilib massiv (array)ni ko’rsatishimiz
mumkin.
Asosiy ma’lumotlar tuzilmalari
Quyida keltirilgan ma’lumotlar tuzilmalari dasturlashda eng ko’p
qo’llaniladigan tuzilmalardir. Ularga:
1. Massiv (Array)
2. Bog’langan ro’yhat (Linked List)
3. Navbat (Queue)
4. Stek (Stack)
5. Hash jadvallar (Hash tables)
6. Daraxtlar (Trees)
7. Graflar (Graph)
kiradi. Biz bu bo’limda boshidagi 5 ta tuzilma bilan yaqindan
tanishib, ularning kuchli va kuchsiz tomonlari va ularni qanday
holatlarda ishlatish ma’qulligi haqida gaplashib o’tamiz. Qolgan ikkita
tuzilma murakkabroq bo’lib ular o’z ichida yana ko’plab turlarga
bo’linib ketadi. Shuning uchun ularni keyinroqqa qoldiramiz.
Bundan tashqari barcha tuzilmalarning hamma joyda ingliz
tilidagi nomi ishlatilgani va ularning nomi odatda tarjima
qilinmaganligi sababli keyingi o’rinlarda men ularning asosan ingliz
tilidagi nomlarini ishlataman.
Turli xildagi ma’lumotlar tuzilmalari nima uchun kerak?
Ma’lumotlar tuzilmalari nimaligi haqida qisman tasavvurga ega
bo’ldingiz va ularning asosiy turlari bilan ham tanishib oldingiz. Lekin,
shu joyga kelib agar sizda “Nima uchun ma’lumotlarning turli xil
tuzilmalari kerak?” “Nima uchun bir turdagi universal ma’lumotlar
tuzilmalaridan foydalanib qo’ya qolsa bo’lmaydi?” degan savol
tug’ilmagan bo’lsa, bu yaxshi emas.) Keling endi shu savolga javob
topishga harakat qilamiz.
Undan oldin ma’lumotlar tuzilmalari ustida asosiy bajarilishi
mumkin bo’lgan amallarni ko’rib chiqaylik. Bularga ma’lumotlarni
Ko’rib chiqish (Traversing)
O’qib olish (Retrieving)
Kiritish (Insertion)
O’chirish (Deletion)
Qidirish (Search)
Saralash (Sorting)
Birlashtirish (Merging)lar kiradi.
Turli xildagi ma’lumotlar tuzilmalarida esa yuqoridagi amallar
turlicha tezlikda amalga oshadi.
Masalan oddiyroq misol olaylik, array uchun ma’lumotni o’qib
olish uchun O(1) vaqt sarflansa, uni kiritish yoki o’chirish uchun O(n)
vaqt sarflanadi. Linked listda esa bular aksincha. Shuning uchun,
masalan, sizning dasturingizda ma’lumotlar ko’p kiritilib, o’chirilsayu
lekin kam o’qilsa, bunda ma’lumotlarni saqlashda arraydan
foydalangandan ko’ra linked list qulayroq hisoblanadi. Lekin,
ko’pincha holatda bir necha ma’lumotlar tuzilmalarini o’zini
birlashtirgan gibrid ma’lumotlar tuzilmalaridan ham foydalaniladi.
Array (Massiv)
Array eng oddiy va eng keng qo’llaniladigan chiziqli ma’lumot
tuzilmasi. Ko’p holatlarda array o’lchami oldindan aniqlangan va
undagi ma’lumotlar bitta tipga tegishli bo’ladi (int, string, Student,
Employee…). Arrayni ishlatishdan oldin quyidagi terminlarni
tushunish kerak bo’ladi:
Element — arraydagi saqlanayotgan narsalar element deb ataladi
Index — elementlarning arraydagi joylashgan tartib raqami
Ko’plab dasturlash tillarida indeksatsiya 0 dan boshlanadi va
oxirgi element indeksi array hajmidan 1 taga kichik bo’ladi. Bundan
tashqari array bir o’lchamli (one dimensional) va ko’p o’lchamli (multi
dimensional) bo’lishi mumkin.
Yuqoridagilar biroz rasmiyroq ma’lumotlar edi. Endi oddiyroq
tilda tushuntirishga harakat qilaman. Biz dasturda array e’lon qilgan
paytimiz kompyuter uning uzunligi va bitta element hajmiga qarab
xotiradan ketma-ket kelgan joyni ajratadi va elementlarni shu joylarga
tartib bilan joylashtiradi. Taxminan quyidagi ko’rinishda
Aynan shunday joylashish sababli, dastur faqat birinchi
elementning xotiradagi adressini eslab qolsa bo’lgani qolgan istalgan
element indeksini bilgan holda uning xotiradagi adressini dastur
osongina hisoblab oladi. Shu sababli arrayda ma’lumotni o’qib olish
tez amalga oshadi.
Lekin, agar bizga birinchi aytilgandan ko’proq element qo’shish
kerak bo’lib qolsa, muammo kelib chiqadi. Chunki biz hamma
elementlarni boshqa ketma-ket kelgan joyga ko’chirishimiz kerak
bo’ladi. Yoki xuddi shuningdek, agar biz array boshiga element
qo’shishimiz kerak bo’lib qolsa ham biz hamma elementlarni surib
chiqishimiz kerak bo’ladi. Biz birinchi elementning xotiradagi
adressini o’zgartira olmaymiz. Shuning uchun, arrayda ma’lumot
qo’shish va o’chirish sekin amalga oshadi.
C++ dastulash tilida ma’lumotlar.
C++ da ma’lumot turlari ikki kategoriyaga bo’linadi: fundamental
va murakkab ma’lumot turlari.
Quyidagi ma’lumot turlari fundamental turlar hisoblanadi:
<void>, Bu tur tugallanmaydigan (ya’ni, bu tur bilan obyekt, massiv va
adres (reference, ссылка) lar e’lon qilinmaydi va aniqlanmaydi)
ma’lumot turi hisoblanib hech qanday qiymat qabul qilmaydi. Lekin bu
tur bilan ko’rsatgichlar e’lon qilinishi va aniqlanishi mumkin. Bundan
tashqari bu tur qiymat hosil qilmaydigan funksiyalarni e’lon qilish va
aniqlashda foydalanilishi mumkin. Masalan, quyidagilar to’g’ri
hisoblanadi:
std::nullptr_t (C++ 11 dan boshlab). Bu tur nol ko’rsatgich nullptr ning
turi hisoblanadi, ya’ni nullptr std::nullptr_t ma’lumot turiga ega. 0 yoki
nullptr qiymatlarini qabul qiladi. Hajmi sizeof(void*) ga teng. Misol:
<bool> Mantiqiy ma’lumotlar, o’zgaruvchilar turi. Faqat true va false
qiymatlarini qabul qiladi. Hajmi kompillyatorga bo’g’liq, lekin kamida
1 bayt. Misol:
char, signed char, unsigned char. Bular belgilar turlari bo’lib,
uchchalasi alohida turlar hisoblanadi. Uchchalasi bir xil hajmga ega va
1 baytga teng. char asosan belgilar to’plami, satrlar hosil qilishda
foydalaniladi. U kompillyatorga bog’liq ravishda signed char yoki
unsigned char bilan aynan bir xil bo’ladi. Shuning uchun -128 dan 127
gacha yoki 0 dan 255 gacha bo’lgan qiymatlarni qabul qiladi. signed
char kichik hajmli, ishorali butun sonlar talab qilinganda foydalanilishi
mumkin va -128 dan 127 gacha bo’lgan qiymatlarni qabul qiladi.
unsigned char kichik hajmli, ishorasiz butun sonlar talab qilinganda
foydalanilishi mumkin va 0 dan 255 gacha bo’lgan qiymatlarni qabul
qiladi. Misol:
char16_t (C++ 11 dan boshlab). Unicode formatidagi belgilar uchun
ishlatiladi. Qiymatlari uchun UTF-16 belgilar to’plami foydalaniladi.
Hajmi kompillyatorga bog’liq, lekin kamida 2 bayt. Misol:
char32_t (C++ 11 dan boshlab). Unicode formatidagi belgilar uchun
ishlatiladi va UTF-32 belgilar to’plami foydalaniladi. Hajmi
kompillyatorga bog’liq, lekin kamida 4 bayt. Misol:
wchar_t. Unicode formatidagi belgilar uchun ishlatiladi va UTF-16
yoki UTF-32 belgilar to’plami foydalaniladi. Hajmi kompillyatorga,
ya’ni foydalanilgan belgilar to’plamiga bo’g’liq. Misol:
int. Butun sonlarning asosiy (базовый) turi hisoblanadi. Uning hajmi
kamida 2 baytga teng. Lekin 32/64 bit arxitekturali tizimlarda uning
hajmi kamida 4 bayt. Bu tur o’zgartirgich (модификатор) lar bilan
birga ishlatilishi mumkin. Quyidagi o’zgartirgichlar mavjud: signed,
unsigned (ishorasini belgilaydi) va short, long, long long (hajmini
belgilaydi). Demak, short, short int, signed short, signed short int lar
aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi
kamida 2 bayt va -32768 dan 32767 gacha bo’lgan sonlarni qabul
qiladi.
unsigned short, unsigned short int lar aynan bir xil bo’lib, ishorasiz
butun sonlar turi hisoblanadi. Hajmi kamida 2 bayt va 0 dan 65535
gacha bo’lgan sonlarni qabul qiladi.
signed, signed int, int lar aynan bir xil bo’lib, ishorali butun sonlar turi
hisoblanadi. Hajmi kamida 4 bayt va -2147483648 dan 2147483647
gacha bo’lgan sonlarni qabul qiladi. Ba’zi 16 bitli tizimlarda uning
hajmi 2 bayt (short variantidek).
unsigned, unsigned int lar aynan bir xil bo’lib, ishorasiz butun sonlar
turi hisoblanadi. Hajmi kamida 4 bayt va 0 dan 4294967295 gacha
bo’lgan sonlarni qabul qiladi. Ba’zi 16 bitli tizimlarda uning hajmi 2
bayt (short variantidek).
long, long int, signed long , signed long int lar aynan bir xil bo’lib,
ishorali butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va 2147483648 dan 2147483647 gacha bo’lgan sonlarni qabul qiladi.
Ba’zi 64 bitli tizimlarda uning hajmi kamida 8 bayt va 9223372036854775808 dan 9223372036854775807 gacha bo’lgan
sonlarni qabul qiladi.
unsigned long, unsigned long int lar aynan bir xil bo’lib, ishorasiz
butun sonlar turi hisoblanadi. Hajmi kamida 4 bayt va 0 dan
4294967295 gacha bo’lgan sonlarni qabul qiladi. Ba’zi 64 bitli
tizimlarda buning hajmi kamida 8 bayt va 0 dan
18446744073709551615 gacha bo’lgan sonlarni qabul qiladi.
long long, long long int, signed long long, signed long long int lar
aynan bir xil bo’lib, ishorali butun sonlar turi hisoblanadi. Hajmi
kamida 8 bayt va -9223372036854775808 dan 9223372036854775807
gacha bo’lgan sonlarni qabul qiladi.
unsigned long long, unsigned long long int lar aynan bir xil bo’lib,
ishorasiz butun sonlar turi hisoblanadi. Hajmi kamida 8 bayt va 0 dan
18446744073709551615 gacha bo’lgan sonlarni qabul qiladi.
float. Yagona aniqlikga ega bo’lgan haqiqiy sonlar turi hisoblanadi.
Bunday aniqlikga ega sonlar odatda 4 bayt hajmga ega va 1.17E-38 dan
3.4E38 gacha bo’lgan sonlarni qabul qiladi.
double. float ga nisbatan ikki karra yuqori aniqlikga ega bo’lgan
haqiqiy sonlar turi va odatda 8 bayt hajmga ega. 2.23E-308 dan
1.79E308 gacha bo’lgan sonlarni qabul qiladi.
long double. Kengaytirilgan aniqlikga ega bo’lgan haqiqiy sonlar turi
va odatda 10 yoki 16 bayt (kompillyatorga bog’liq) hajmga ega. 3.36E4932 dan 1.18E4932 gacha bo’lgan sonlarni qabul qiladi.
Quyidagilar murakkab turlar hisoblanadi:
Massiv. Misol:
Funksiyalar. Funksiyalarning e’lon qilinishi ularning nomi va turini
ko’rsatib beradi. Funksiyalarning aniqlanishi esa ularning nomi, turi va
“tanasi” ni ko’rsatib beradi. Misol:
void, obyekt yoki funksiyalar uchun ko’rsatgichlar (sinflarning statik
a’zolari uchun ham). Misol:
Obyekt yoki funksiyalar uchun adreslar (reference, ссылка). Ikki
turdagi adreslar mavjud: l-ifoda adreslari va r-ifoda adreslari. r-ifoda
adres tushunchasi C++ 11 dan boshlab kiritilgan. Misol:
Vektorlar va ularning xossalari.
Juda oddiy namuna yordamida vector sinfining izchil
rivojlanishini tashkil etamiz
Guvohi bo’lganingizdek ushbu kod double tipli 4 ta elementdan
iborat vector sinf obyektini yaratadi va 0.33, 22.0, 27.2 va 54.2
qiymatlarni o’zlashtirmoqda. Bu to’rt element 0, 1, 2 va 3 tartibi
bilan raqamlanadi. C++ standart konteynerlarida elementlarni
raqamlash doimo 0 (nol) dan boshlanadi. 0 dan boshlab
raqamlash C++ tilida dastur tuzuvchilar o’rtasida universal
kelishuv bo’lib, doimo ishlatidi 16. vector obyekt sinfidagi
elementlar soni uning o’lchami deb ataladi. Shunday qilib, age
vektorining o’lchami 4 ga teng. Vektor elemetlari 0 dan size-1
gacha raqamlanadi (indekslanadi). Masalan age vektori elementlari
0 dan age.size()–1 gacha raqamlanadi. age vektorini quyidagicha
tasvirlashimiz mumkin:
Ushbu sxemani kompyuter xotirasida qanday amalga oshirish
mumkin? Qiymatlarni qanday saqlaymiz va ularga ruxsatni
qanday amalga oshiramiz? Shubhasiz, biz sinfni tanlashimiz va
uni vector deb nomlashimiz lozim. Shundan so’ng, vektor
o’lchamini va elementlarini saqlash uchun bizga alohida-alohida
sinf a‘zosi kerak bo’ladi. Elementlar majmuini qanday taqdim
qiladi, ularning sonini o’zgartirish mumkinmi? Buni vector
standart sinfinidan foydalanib amalga oshirish mumkin, lekin, bu
doirada u firibgarlik bo’ladi: biz aynan shu sinfni ishlab
chiыaramiz. Shunday qilib, rasmdagi tasvirga o’qni qanday
qaratamiz? O’zimizni u emas deb ishontiramiz. Biz shunda
ma‘lumotlar tuzulmasining fiksirlangan o’lchamini belgilashimiz
mumkin.
Quyidagi tasvir kabi belgilarga bog’liq ayrim detallarni hisobga
olmasdan xech narsaga erisha olmaymiz
Bu oddiy va chiroyli, lekin, faqatgina qiyin vaziyatda
push_back() funksiyasi yordamida element qoshishga urinishni
amalga oshirishimiz mumkin: Biz element qosha olmaymiz,
elementlar soni belgilangan va u to’rtga teng. Bizga fiksirlangan
elementlar sonini saqlaydigan ma‘lumotlar tuzilmasiga nisbatan
koproq narsalar kerak. vector sinfi obyektida elementlar sonini
o’zgartiruvchi push_back() amallarini, agar vector sinfida
elementlar soni fiksirlangan bolsa, amalga oshirish mumkin emas.
Bizga birinchi elementning manzili kerak. C++ tili ma‘lumotlar
toifasining manzilini saqlash qobiliyati ko’rsatkich deb ataladi
(pointer). Sintaksik jihatdan u suffiksi bilan belgilanadi, ya‘ni
double double tipli obyektga korsatkichni bildiradi. Endi vector
sinfining birinchi variantini aniqlashimiz mumkin.
Shunday vektorlar biridan nusxa olamiz
Nazariy jixatdan v2 obyekt v obyektning nusxasi bo’lishi
kerak, boshqacha aytganda barcha i lar [0:v.size()) diapazondagi
v2.size()==v.size() va v2[i]==v[i] shartlarni bajarishi kerak. Dastur
funksii f() dan chiqqanda barcha foydalanilgan xotira bo’shatilgan
bo’lishi kerak. Ammo bu ishni standart kutubxonaga tegishli vector
sinfi amlga oshiradi, bizning sinf vector emas. Biznig maqsad
vector sinfini mukammallashtirishdan iborat, yuqorida ko’rsatilgan
masalalarni to’g’ri yechishi uchun, oldin bu sinfimiz o’zi qanday
ishlashi bilan tanishib chiqamiz.Xatolik nimada nima uchun
noto’g’ri ishlaydi? Agar buni tushuna olsak, xatolikni to’g’rilay
olamiz.Eng muximi shundaki biz bu va shunga o’xshagan
muammolarni aniqlay bila olishimiz va shuni amalda boshqa
vaziyatlarda xam tatbiq qila olishimizdir. Odatda sinflarda nusxa
olish degani sinfning barcha berilgan a‘zolaridan nusxa olishni
bildiradi. Masalan Point sinf obyektidan nusxa olish degani
nuqtaning koordinatalaridan nusxa olishni bildiradi.Agar sinf
a‘zolaridan nusxa olayotganda ko’rsatkich ega obyektlar bo’lsa,
ba‘zi muammolar chiqishi mumkin. Xususan vektorlar uchun
bizning misoldagi v.sz==v2.sz va v.elem==v2.elem shartlar
bajarilsa,
vektorlar
quyidagicha
ko’rinishda
bo’ladi:
Boshqacha aytganda v2 obyekt v obyektning elementlari
nusxasini o’zida ifoda etmagan, ikkalasi xam birgalikda v
obyektdan foydalanayapti. Biz boshqa kod yozishimiz mumkin:
Xulosa
Menga berilgan Dastulashda ma’lumotlar tuzilmasining o’rni va
ahamiyati. C++ dastulash tilida ma’lumotlar turlari, ularni e’lon qilish
va tasvirlash tushunchalari. Vektorlar va ularning xossalari
mavzusidagi topshiriqdan shuni xulosa qilib aytishim mumkinki
Ma’lumotlar tuzilmasi — bu ma’lumotlarni samarali o’qish va
o’zgartirish imkonini beruvchi, ma’lumotlarni saqlash va
boshqarishning bir formatga solingan shaklidir. Shubhasiz, biz sinfni
tanlashimiz va uni vector deb nomlashimiz lozim. Shundan so’ng,
vektor o’lchamini va elementlarini saqlash uchun bizga alohidaalohida sinf a‘zosi kerak bo’lishi haqida bilimlarimni
mustahkamladim.
Foydalanilgan adabiyotlar
Алфред В. Ахо., Джон Э. Хопкрофт, Джефри Д. Ульман.
Структура данных и алгоритмы//Учеб.пос., М. : Изд.дом:
"Вильямс", 2000, — 384 с.
Бакнелл Джулиан М. Фундаментальные алгоритмы и структуры
данных в Delphi//СПб: ООО «ДиаСофтЮП», 2003. 560с.
Роберт Седжвик. Фундаментальные алгоритмы на C++. Анализ,
Структуры данных, Сортировка, Поиск//К.: Изд. «ДиаСофт»,
2001.- 688 с.
Динман М.И. С++. Освой на примерах//СПБ.:БХВ-Петербург,
2006, 384.
Шилдт, Герберт. Полный справочник по С#//М. : Изд. дом
"Вильямc", 2004, 752 с.
Вирт Н. Алгоритмы и структуры программы//М., Мир, 1985.
Download