Reja: Ma’lumotlarni qidirish



Yüklə 61,37 Kb.
səhifə2/4
tarix26.06.2022
ölçüsü61,37 Kb.
#62357
1   2   3   4
Axborotlani izlash fani

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;
}

Ushbu maqolada men massivda biron bir elementni qidirish algoritmlari bilan qisqacha tanishtirishga harakat qilaman.


Aytaylik bizga massiv berilgan:
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
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:
func linearSearch(a []int, condidate int) int {
for i := 0; i < len(a); i++ {
if a[i] == condidate {
return i
}
}
return -1
}
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 - binar(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'zgaruvchilaridur:
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

  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:
func binarySearch(a []int, condidate int) int {
left := 0
right := len(a)

Yüklə 61,37 Kb.

Dostları ilə paylaş:
1   2   3   4




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin