|
Ajrat va xukmronlik qil” tamoyilidagi algoritmlar sinfi
|
bet | 3/4 | Sana | 15.05.2024 | Hajmi | 420,02 Kb. | | #235184 |
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 x 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
Avvaliga l = 0 va r=n-1 bo'ladi (butun boshli massiv)
O'rtadagi element indeksi hisoblanadi: mid = (l + r)/2;
O'rtadagi element indeksi bilan qidirilayotgan son x solishtirib ko'riladi
Agar son mos kelsa, algoritm shu joyida to'xtaydi.
Agar x o'rtadagi sondan katta bo'lsa, left ko'rsatkichni o'rtadan bitta keyingi elementga suramiz: l=mid + 1;
Agar x o'rtadagi sondan kichik bo'lsa, right ko'rsatkichni o'rtadan bitta oldingi elementga suramiz: r=mid — 1;
2-qadamga qaytiladi.
Ikkilik qidirish algoritmi har bir qadamda n 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
|
| |