Reja: Massiv elementlarini saralash va qidiruv algoritmlari
Download 13,7 Kb.
|
1 Massiv elementlarini saralash algoritmlari, qidiruv algoritmlari
Massiv elementlarini saralash algoritmlari, qidiruv algoritmlari Reja:
Qidiruv algoritmlari Dasturlashda eng ko‘p qo‘llaniladigan amallardan biri bu – ma’lumotlarni qidirishdir. Qidiruv masalasini hal etishga mo‘ljallangan algoritmga qidiruv algoritmi deyiladi. Qidiruv algoritmlari ma’lum bir ma’lumotlar tuzilmasida saqlanayotgan ma’lumotni olish uchun ishlatiladi. Bunga, muayyan ro‘yxatdan yoki u saqlanadigan har qanday ma’lumotlar strukturasidan ma’lum bir elementni topish masalasini misol qilish mumkin. Qidiruv jarayonining turiga qarab, ushbu algoritmlar odatda ikkita toifaga bo'linadi:
Linear Search (Chiziqli qidiruv) Chiziqli qidiruv yondashuvida asosiy element kalitini massivdagi har bir element bilan ketma-ket taqqoslanadi. Kalit massivdagi elementga to‘g‘ri kelmaguncha yoki massiv tugamaguncha jarayon davom etadi. Agar mos kelsa, chiziqli qidiruv massivdagi kalitga mos keladigan element indeksini qaytaradi. Aks holda, qidiruv -1 ni qaytaradi. N ta elementdan iborat arr[] massivi berilgan bo‘lsa, ma’lum x elementni arr[] dan qidirish kerak. Bu quyidagicha amalga oshiriladi:
Masalan: Berilgan: arr[] = {20, 34, 51, 27, 19, 21, 31}, x = 27 Natija: 3 Izoh: qidirilayotgan x element 3-o‘rinda joylashgan. Berilgan: arr[] = {20, 34, 51, 27, 19, 21, 31}, x = 35 Natija: -1 Izoh: qidirilayotgan x element arr[] mavjud emas. Misol. Bizga quyidagi ro‘yxat berilgan. Ro‘yxatdan 27 elementini topishni chiziqli qidiruv algoritmi yordamida ko‘rib chiqamiz.
Qidiruv quyidagicha amalga oshiriladi. Birinchi elementni olamiz va tekshiramiz.
20 < 27, biz qidirayotgan element bu emas. Demak, keyingi elementga o‘tamiz.
32 > 27, biz qidirayotgan element bu emas. Demak, keyingi elementga o‘tamiz.
58 > 27, biz qidirayotgan element bu emas. Demak, keyingi elementga o‘tamiz.
27 = 27, biz qidirayotgan element shu. “Uchinchi indeksli yacheykada joylashgan element biz qidirayotgan elementga teng” natijasi qaytariladi. Algoritm yakunlandi. Quyida yuqoridagi yondashuvni C++ da amalga oshirish dasturi ko‘rsatilgan: #include using namespace std; int main() { int arr[] = { 2, 3, 4, 10, 40 }; int x = 1; int N = sizeof(arr) / sizeof(arr[0]); int result = -1; int i; for (i = 0; i < N; i++) if (arr[i] == x) result = i; (result == -1) ? cout << "Ushbu element massivda mavjud emas" : cout << "Ushbu element " << result<<" indeksli yacheykada joylashgan"; return 0; } Chiziqli qidiruv funksiyasi kalitni massivdagi har bir element bilan taqqoslaydi. Massivdagi elementlar har qanday tartibda bo‘lishi mumkin. Chiziqli qidiruvning bajarilish vaqti massiv elementlari soni ortishi bilan chiziqli ravishda oshib borgani uchun katta massiv uchun chiziqli qidiruv samarasiz. Binary Search (Ikkilik qidiruv) Ikkilik qidiruv - bu ro‘yxatdan element qidirishning boshqa keng tarqalgan usuli. Bu algoritm uchun massiv elementlari tartiblangan (saralangan) bo‘lishi lozim. Massiv o‘sish tartibida deb faraz qilsak. Ikkilik qidiruv birinchi navbatda kalitni massivning o‘rtasida joylashgan element bilan taqqoslaydi. Quyidagi holatlarni ko‘rib chiqing:
Shubhasiz, ikkilik qidiruv funksiyasi har bir taqqoslashdan keyin massivning kamida yarmini yo‘q qiladi. N ta elementdan iborat tartiblangan arr[] massivi berilgan bo‘lsa, ma’lum x elementni arr[] dan qidirish kerak. Bu quyidagicha amalga oshiriladi:
Masalan: Berilgan: arr[] = {19, 20, 21, 27, 31, 34, 51}, x = 21 Natija: 2 Izoh: qidirilayotgan x element 2-o‘rinda joylashgan. Berilgan: arr[] = {19, 20, 21, 27, 31, 34, 51}, x = 35 Natija: -1 Izoh: qidirilayotgan x element arr[] mavjud emas. Misol. Bizga quyidagi tartiblangan ro‘yxat berilgan. Ro‘yxatdan 21 elementini topishni ikkilik qidiruv algoritmi yordamida ko‘rib chiqamiz.
Qidiruv quyidagicha amalga oshiriladi. Massivning o‘rtasidagi elementni olamiz va tekshiramiz.
21 < 27, biz qidirayotgan element bu emas va u 27 dan kichik. Demak, massivning 27 dan kichik elementlari joylashgan chap tomonini tekshiramiz va o‘ng tomonini esa tekshirmaymiz.
Chap tomonidagi elementlardan ham o‘rtadagini tanlab olamiz
21 > 20, biz qidirayotgan element bu emas va u 20 dan katta. Demak, massivning 20 dan katta elementlari joylashgan o‘ng tomonini tekshiramiz va chap tomonini esa tekshirmaymiz.
Bu holda ham, qolgan elementlarning o‘rtanchasini tanlab olish kerak edi, ammo bizda bittagina element qoldi. Shuning uchun uni tekshiramiz.
21 = 21, biz qidirayotgan element shu. “Uchinchi indeksli yacheykada joylashgan element biz qidirayotgan elementga teng” natijasi qaytariladi. Algoritm yakunlandi. Quyida yuqoridagi yondashuvni C++ da amalga oshirish dasturi ko‘rsatilgan: #include using namespace std; int main() { int arr[] = { 2, 3, 4, 10, 40 }; int x = 10; int n = sizeof(arr) / sizeof(arr[0]); int result = -1; int l = 0; int r = n - 1; while (l <= r) { int m = l + (r - l) / 2; if (arr[m] == x) result = m; if (arr[m] < x) l = m + 1; else r = m - 1; } (result == -1) ? cout << "Ushbu element massivda mavjud emas" : cout << "Ushbu element " << result<<" indeksli yacheykada joylashgan"; return 0; } Chiziqli qidiruv kichik massiv yoki tartiblanmagan massivdagi elementni topish uchun foydali, lekin katta massivlar uchun u samarasiz ekanini yuqorida ta’kidladik. Ikkilik qidiruv esa oldindan saralangan katta massivlar uchun samaraliroq. Saralash
Download 13,7 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling