Bo’lib tashla va xukmronlik qil


Download 426.54 Kb.
bet3/3
Sana30.05.2020
Hajmi426.54 Kb.
#112104
1   2   3
Bog'liq
Laboratoriya 11-12 - AL Bulib tashla


Algoritm qadamlari
Ikkilik qidirish algoritmi to'g'ri ishlashi uchun massiv saralangan bo'lishi shart! Bizda n ta elementli saralangan massiv bor va biz undan elementni qidirmoqdamiz. Biz qidirish chegarasini belgilash uchun l (left) va r (right) ko'rsatkichlardan foydalanamiz. Ular massiv indekslarini ko'rsatib turadi. mid o'zgaruvchi bizda qidirilayotgan sohaning o'rtadagi elementi indeksini ko'rsatadi

  1. Avvaliga l = 0 va r=n-1 bo'ladi (butun boshli massiv)

  2. O'rtadagi element indeksi hisoblanadi: mid = (l + r)/2;

  3. O'rtadagi element indeksi bilan qidirilayotgan son solishtirib ko'riladi

  4. Agar son mos kelsa, algoritm shu joyida to'xtaydi.

  5. Agar o'rtadagi sondan katta bo'lsa, left ko'rsatkichni o'rtadan bitta keyingi elementga suramiz: l=mid + 1;

  6. Agar o'rtadagi sondan kichik bo'lsa, right ko'rsatkichni o'rtadan bitta oldingi elementga suramiz: r=mid — 1;

  7. 2-qadamga qaytiladi.

Ikkilik qidirish algoritmi har bir qadamda ni ikki baravarga kamaytirgani uchun algoritm ishlash tezligi O(logn) hisoblanadi. Solishtirish uchun Facebook misolidagi 1 mlrd login ichidan ikkilik qidirish algoritmi 30 ta (!) qadam bilan topishi mumkin. Oddiy qidirishdan tashqari bu algoritmni yana boshqa juda ko'p joyda qo'llash mumkin.

Algoritmining dasturiy tadbiqi

Aytaylik bizga tartiblangan n ta elementdan iborat arr[ ] massiv berilgan bo'lsin, va berilgan x ni arr[ ] ichidan qidirish funksiyasini tuzish sharti qo'yilsin. Bu holatda eng oson yo'l sifatida chiziqli qidiruvni misol keltirish mumkin. Ammo bu usulning vaqt davomiyligi O(n) ni tashkil qiladi. Xuddi shu vazifa uchun biz binar qidirish algoritmini ishlatsak bo'ladi(6-rasm).



6-rasm. Ikkilik qidirish algoritmining ishlash.

Qiyinlik darajasi: 5/10.

Eng zo'r ko'rsatkichi(vaqt): O(1).

Eng yomon ko'rsatkichi(vaqt): O(log n).

O'rtacha ko'rsatkichi(vaqt): O( log n).

Binar qidiruvning asosiy g'oyalaridan biri ketma-ket ikkiga bo'lishga asoslanadi, ya'ni berilgan x ni massivning o'rtadagi elementi bilan solishtiradi, agar katta bo'lsa oxiri va o'rtasi orasidagi massivni oladi, agar kichkina bo'lsa boshi va o'rtasi orasidagi massivni oladi, va har safar shu jarayon takrorlanib boradi toki x element solishtirilayotgan massivning elementga teng bo'lgunicha yoki massivning elementlari qolmaguncha.

Masalan(7-rasm).:



7-rasm. Ikkilik qidirish algoritmining sxemasi.

Biz bitta taqqoslashdan so'ng massivning yarim elementlarini hisobga olmasak ham bo'ladi.

1. x ni o'rtadagi element bilan solishtiramiz.

2. Agar rost bo'lsa, o'rtadagi elementni qaytaramiz.

3. Agar x katta bo'lsa, x ni massivni o'ng yarmini ichidan qidiramiz, yuqoridagi ketma-ketlikni bajargan holda.

4. Aks holda chap yarmi bilan binar qidiruvni amalga oshiramiz.

Quyida Binar qidiruvning rekursiya orqali amalga oshiramiz.

// C++ tilida rekursiyali Binar Qidiruv

#include

// Rekursiyali qidiruv funksiyasi. U massivdan

// x qaysi o'rinda turganini qaytaradi,

// yoki -1

int binarqidiruv(int arr[], int l, int r, int x)

{


if (r >= l)

{


int mid = l + (r - l)/2;

// Agar element x ga teng bo'lsa

// o'zi qaytadi

if (arr[mid] == x)

return mid;

// Agar element x dan katta bo'lsa,

// u faqat chap qismni oladi

if (arr[mid] > x)

return binarqidiruv(arr, l, mid-1, x);

// Yoki u faqat o'ng qismni oladi



return binarqidiruv(arr, mid+1, r, x);

}


// Bu yerga yetib keladi, qachonki

// x soni massiv ichidan topilmasa



return -1;

}


int main(void)

{


int arr[] = {2, 3, 4, 10, 40};

//massiv ni elementlar sonini topib olayabmiz



int n = sizeof(arr)/ sizeof(arr[0]);

int x = 10;

int natija = binarqidiruv(arr, 0, n-1, x);

(natija == -1)? printf("X soni massivni ichidan topilmadi.")

: printf("X soni massivning %d - elementi.",

natija);



return 0;

}

Dastur ishlaganda " X soni massivning 3 - elementi." degan yozuvni qaytaradi. Sababi massiv elementlari 0 dan boshlanadi.



Topshiriq variantlari:

1. Binar qidiruvdan foydalanib elementlarni tasodifiy ravishda toping.

2. Mashina raqamlari ro’yhati berilgan: 345, 368, 876, 945, 564, 387, 230. Binar qidiruvdan foydalanib berilgan raqamli mashina qaysi joyda turganini toping.

3. Binarqidiruv usulidan foydalanib ro’yhatda har ikkinchi elementni qidiring va taqqoslashlar sonini aniqlang.

4. Binar qidiruvdan foydalanib massivdan berilgan kalitga karrali kalitli elementni va solishtirishlar sonini toping.

5. Binarqidiruv usulidan foydalanib, ro’yhat eng kichik elementini toping.

6. Binarqidiruv usulidan foydalanib, ro’yhatda berilgan kalitdan katta elementlarni toping.

7. Binarqidiruv usulidan foydalanib, ro’yhat eng kichik elementini toping.

8. Binar qidiruv usulidan foydalanib, A massivdan elementni va taqqoslashlar sonini toping.

9. Boshiga qo’yish va transpozitsiya usulidan foydalanib massiv eng katta elementi topilsin.

10. Boshiga qo’yish usulidan foydalanib ro’yhatda 11 ga butun bo’linuvchi eng katta sonni toping (agar bunday sonlar ko’p bo’lsa, u holda ularning eng kattasini toping; agar bunday son mavjud bo’lmasa – shunga mos ma’lumot chiqaring).

11. Transpozitsiya usulidan foydalanib ro’yhatda 11 ga butun bo’linuvchi eng katta sonni toping (agar bunday sonlar ko’p bo’lsa, u holda ularning eng kichigini toping; agar bunday son mavjud bo’lmasa – shunga mos ma’lumot chiqaring).

12. Boshiga qo’yish usulidan foydalanib ro’yhatda qo’shni elementlari ayrimasi 72 dan kichik bo’lgan elementni toping. Agar bunday elementlar ko’p bo’lsa, u holda ularning eng kattasini toping; agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

13. Transpozitsiya usulidan foydalanib ro’yhatda qo’shni elementlari bo’linmasi

juft son bo’lgan elementni toping. Agar bunday elementlar ko’p bo’lsa, u holdaularning eng kattasi yoki eng kichigini toping; agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

14. Boshiga qo’yish usulidan foydalanib ro’yhatda qo’shni elementlar ayrimasi juft bo’lgan elementni toping. Agar bunday elementlar ko’p bo’lsa, u holda ularning eng kattasi yoki eng kichigini toping; agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

15. Transpozitsiya usulidan foydalanib ro’yhatda kerakli elementgacha bo’lgan elementlarning o’rta arifmetigi 12 ga teng bo’lgan element topilsin. Agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

16. Boshiga qo’yish usulidan foydalanib ro’yhatda 10 ga bo’linuvchi maksimal elementni toping. Agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

17. Boshiga qo’yish va transpozitsiya usulidan foydalanib massiv eng kichik elementi topilsin.

18. Transpozitsiya usulidan foydalanib ro’yhatda qo’shni elementlari ayirmasi juft va 3 ga bo’linadigan elementni toping. Agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

19. Boshiga qo’yish usulidan foydalanib ro’yhatda kerakli elementdan keying elementlarning o’rtacha kvadratik qiymati 10 dan kichik bo’lgan elementni toping. Agar bunday elementlar ko’p bo’lsa, u holda ularning eng kattasini toping; agar bunday element mavjud bo’lmasa – shunga mos ma’lumot chiqaring.

20. Transpozitsiya usulidan foydalanib har bir x element uchun tg(x) qiymatini aniqlang va eng katta qiymatga ega bo’lgan elementni 1-o’ringa qo’ying.

21. Berilgan ro’yhatda qidirilayotgan element transpozitsiya usuli bilan qancha murojaatda ro’yhat boshiga kelishini aniqlash dasturini tuzing.

22. Massivdan boshiga qo’yish usuli yordamida key kalitli elementni izlash dasturini tuzing.

23. Binar qidiruv usuli yordamida massivga yangi elementni kiriting.

24. Binar qidiruv usuli yordamida massivning key kalitli elementini o’chiring.25. Ro’yhatda transpozitsiya usuli yordamida toq elementlarni topish dasturini tuzing.

26. Berilgan massivda key kalitli elementni binar qidiruv usullari yordamida izlang va qaysi usul ushbu qidiruv holatida samara berganligini aniqlash dasturini keltiring.

27. Talabalar ismi va umumiy ballaridan iborat jadvaldan binarqidiruv usuli bilan balli maksimal bo’lgan talabani toping.

28. Talabalar ismi va umumiy ballaridan iborat jadvaldan binar qidiruv usuli yordamida so’ralgan talabaning umumiy balini chiqarish dasturini tuzing.

29. Boshiga qo’yish usuli yordamida talabalar ismlaridan iborat massiv elementlariga ko’p marta murojaat qilib massivni qayta tartiblang.



30. Transpozisiya usuli yordamida talabalar ismlaridan iborat ro’yhat elementlariga ko’p marta murojaat qilib massivni qayta tartiblang.
Download 426.54 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling