İkilik (Binar) və ya yarıya bölməklə axtarış (ing. Binary search) — Sıralanmış massivdə müəyyən qiymətin axtarılması alqoritmidir. Xətti axtarışdan fərqli olaraq Binar axtarış sıralanmış massivlər üzərində daha tez axtarış aparmağa imkan verir. Xüsusilə böyük həcmli verilənlər bazasına sahib proqramlarda xətti axtarış texniki olaraq çox vaxt tələb etdiyindən yaramır.
İşləmə prinsipi
Alqorimtin işləməsi üçün ilk öncə massiv sıralanmış olmalıdır. Bu üsul ilə axtarış zamanı axtarılan məlumat massivin ortadakı elementi ilə müqayisə edilir. Əgər axtarılan ədəd ortadakı elementdən böyükdürsə o zaman, həmin ədəddən kiçik hissələr unudulur və axtarış böyük olan hissədə aparılır və ya əksinə. Hər belə müqayisədə axtarış yarıya endirilir.
Nümunə
a = axtarılan ədəd, M = massiv
a = 4, M = 1 3 4 6 8 9 11
a ilə 6-ı müqayisə et. Kiçikdir. Axtarışı M = 1 3 4 ilə apar.
a ilə 3-ü müqayisə et. Böyükdür. Axtarışı M = 4 ilə apar.
a ilə 4-ü müqayisə et. Bərabərdir. Axtarış tamamlandı, a tapıldı.
C proqramlaşdırma dilində təsviri
#include <stdlib.h>/*srand(), rand(), RAND_MAX*/ #include <stdio.h>/*printf(), scanf()*/ #include <time.h>/*time()*/ #include <locale.h>/*setlocale()*/ #define FALSE 0 #define TRUE 1 #define n 12/* Massivin ölçüsü */ /* Artan sıra ilə düzülmüş massivdə ikilik axtarış funksiyasına nümunə */ int YariYariyaAxtarma(int massiv[], int say, int axtarilan) { /* Trivial halları elə yerindəcə cavablandıra bilərik */ //if (massiv[0] > axtarilan || massiv[say - 1] < axtarilan) //return -1; int bas = 0; int son = say - 1; while (bas <= son) { int orta = (bas + son) / 2; if (massiv[orta] == axtarilan) return orta; if (massiv[orta] > axtarilan) son = orta - 1; else bas = orta + 1; } return -1; } /* Massivi sıralamaq üçün tələb olunan müqaisə funksiyası.*/ /* Bu funksiya massivi artan sıra ilə düzür.*/ int compare(const void* elem1, const void* elem2) { if (*((int*)elem1) > *((int*)elem2)) return 1; if (*((int*)elem1) < *((int*)elem2)) return -1; return 0; } /* Alqoritminin istifadəsinə nümunə */ int main() { int massiv[n]; int i; setlocale(LC_ALL, ".utf8"); srand((unsigned)time(NULL)); printf("Massivdəki ədədlərin ilkin təsadüfi sırası:\t"); for (i = 0; i < n; i++) { massiv[i] = 100.0 * rand() / (RAND_MAX + 1); printf("%d ", massiv[i]); } printf("\n"); /* ikilik axtarış üçün massivin, axtarışın istiqamətindən asılı olaraq sıralanması mütləqdir */ qsort(massiv, n, sizeof(int), compare); printf("Massivdəki ədədlər sıralandıqdan sonra:\t\t"); for (i = 0; i < n; i++) printf("%d ", massiv[i]); printf("\n"); while (TRUE) { int axtarilan; printf("\nProqramdan çıxmaq üçün mənfi, sırasının tapilması üçün isə hər hansı bir digər ədəd daxil edin: "); scanf("%d", &axtarilan); if (axtarilan < 0) break; int cavab = YariYariyaAxtarma(massiv, n, axtarilan); if (cavab < 0) printf("Cavab tapilmadi.\n"); else printf("Sıra N=: %d.\n", cavab + 1); } }
Əlavə tələblər
Qeyd etmək lazımdır ki, burda verilən nümunə nümayiş xarakteri daşıyır. Praktiki məsələlərin həlli üçün alqoritmə əlavə tələblər irəli sürülə bilər. Misalçün, sıralama alqoritmində istifadə edilməsi üçün alqoritmin elementin massivdəki yerini deyil, onun əlavə edilməsi üçün ən uyğun olan yeri qaytarması məqsədə uyğundur. Bu isə artan sıra ilə düzdükdə mümkün olan ən sağ vəziyyət, azalan sıra ilə düzdükdə isə ən sol vəziyyətdir. Bunu tam ədədlər massivini artan sıra ilə düzən sıralama alqoritminin nümunəsində göstərək:
#include <stdlib.h>/*srand(), rand(), RAND_MAX*/ #include <stdio.h>/*printf()*/ #include <conio.h>/*_getch()*/ #include <memory.h>/*memcpy()*/ #include <time.h>/*time()*/ #include <locale.h>/*setlocale()*/ #define n 12/* Elementlərin sayı */ /* Artan sıra ilə düzülmüş massivdə yarıya bölmə ilə axtarışın həyata keçirilməsi */ int YariYariyaAxtarma(int massiv[], const int say, const int axtarilan, int(*compare)(const int, const int)) { intsol = 0; intsag = say; while (sol < sag) { int orta = sol + (sag - sol) / 2; if (compare(massiv[orta], axtarilan) > 0) sag = orta; else sol = orta + 1; } return sag; } void MakeSort(int massiv[], const int say, int(*compare)(const int, const int)) { for (int i = 1; i < say; i++) { int elem = massiv[i];/* Növbəti elementi götürürük */ if (compare(elem, massiv[i - 1]) > 0) continue;/* nə isə etməyə ehtiyac yoxdur */ int yeniYer = YariYariyaAxtarma(massiv, i, elem, compare);/* elementin massivdəki yeni yerini tapırıq */ memcpy(massiv + yeniYer + 1, massiv + yeniYer, (i - yeniYer) * sizeof(int));/* həmin yeri boşaldırıq */ massiv[yeniYer] = elem;/* elementi yeni tapdığımız yerə yerləşdiririk */ } } /* Massivi artan sıra ilə düzmək üçün tələb olunan müqaisə funksiyası.*/ int Compare(const int elem1, const int elem2) { if (elem1 > elem2) return 1; if (elem1 < elem2) return -1; return 0; } /* Alqoritminin istifadəsinə nümunə */ int main() { int massiv[n]; int i; setlocale(LC_ALL, ".utf8"); srand((unsigned)time(NULL)); printf("Massivdəki ədədlərin ilkin təsadüfi sırası:\t"); for (i = 0; i < n; i++) { massiv[i] = 100.0 * rand() / (RAND_MAX + 1); printf("%d ", massiv[i]); } printf("\n"); MakeSort(massiv, n, Compare);/* massivin artan sıra ilə düzülməsi */ printf("Massivdəki ədədlər sıra ilə düzüldükdən sonra:\t"); for (i = 0; i < n; i++) printf("%d ", massiv[i]); printf("\n"); _getch(); }
Həmçinin bax
- Axtarış alqoritmləri
- Digər proqramlaşdırma dillərində təsviri
wikipedia, oxu, kitab, kitabxana, axtar, tap, meqaleler, kitablar, oyrenmek, wiki, bilgi, tarix, tarixi, endir, indir, yukle, izlə, izle, mobil, telefon ucun, azeri, azəri, azerbaycanca, azərbaycanca, sayt, yüklə, pulsuz, pulsuz yüklə, haqqında, haqqinda, məlumat, melumat, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, şəkil, muisiqi, mahnı, kino, film, kitab, oyun, oyunlar, android, ios, apple, samsung, iphone, pc, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, web, computer, komputer
Ikilik Binar ve ya yariya bolmekle axtaris ing Binary search Siralanmis massivde mueyyen qiymetin axtarilmasi alqoritmidir Xetti axtarisdan ferqli olaraq Binar axtaris siralanmis massivler uzerinde daha tez axtaris aparmaga imkan verir Xususile boyuk hecmli verilenler bazasina sahib proqramlarda xetti axtaris texniki olaraq cox vaxt teleb etdiyinden yaramir Isleme prinsipiAlqorimtin islemesi ucun ilk once massiv siralanmis olmalidir Bu usul ile axtaris zamani axtarilan melumat massivin ortadaki elementi ile muqayise edilir Eger axtarilan eded ortadaki elementden boyukdurse o zaman hemin ededden kicik hisseler unudulur ve axtaris boyuk olan hissede aparilir ve ya eksine Her bele muqayisede axtaris yariya endirilir Numunea axtarilan eded M massiv a 4 M 1 3 4 6 8 9 11 a ile 6 i muqayise et Kicikdir Axtarisi M 1 3 4 ile apar a ile 3 u muqayise et Boyukdur Axtarisi M 4 ile apar a ile 4 u muqayise et Beraberdir Axtaris tamamlandi a tapildi C proqramlasdirma dilinde tesviri include lt stdlib h gt srand rand RAND MAX include lt stdio h gt printf scanf include lt time h gt time include lt locale h gt setlocale define FALSE 0 define TRUE 1 define n 12 Massivin olcusu Artan sira ile duzulmus massivde ikilik axtaris funksiyasina numune int YariYariyaAxtarma int massiv int say int axtarilan Trivial hallari ele yerindece cavablandira bilerik if massiv 0 gt axtarilan massiv say 1 lt axtarilan return 1 int bas 0 int son say 1 while bas lt son int orta bas son 2 if massiv orta axtarilan return orta if massiv orta gt axtarilan son orta 1 else bas orta 1 return 1 Massivi siralamaq ucun teleb olunan muqaise funksiyasi Bu funksiya massivi artan sira ile duzur int compare const void elem1 const void elem2 if int elem1 gt int elem2 return 1 if int elem1 lt int elem2 return 1 return 0 Alqoritminin istifadesine numune int main int massiv n int i setlocale LC ALL utf8 srand unsigned time NULL printf Massivdeki ededlerin ilkin tesadufi sirasi t for i 0 i lt n i massiv i 100 0 rand RAND MAX 1 printf d massiv i printf n ikilik axtaris ucun massivin axtarisin istiqametinden asili olaraq siralanmasi mutleqdir qsort massiv n sizeof int compare printf Massivdeki ededler siralandiqdan sonra t t for i 0 i lt n i printf d massiv i printf n while TRUE int axtarilan printf n Proqramdan cixmaq ucun menfi sirasinin tapilmasi ucun ise her hansi bir diger eded daxil edin scanf d amp axtarilan if axtarilan lt 0 break int cavab YariYariyaAxtarma massiv n axtarilan if cavab lt 0 printf Cavab tapilmadi n else printf Sira N d n cavab 1 Elave teleblerQeyd etmek lazimdir ki burda verilen numune numayis xarakteri dasiyir Praktiki meselelerin helli ucun alqoritme elave telebler ireli surule biler Misalcun siralama alqoritminde istifade edilmesi ucun alqoritmin elementin massivdeki yerini deyil onun elave edilmesi ucun en uygun olan yeri qaytarmasi meqsede uygundur Bu ise artan sira ile duzdukde mumkun olan en sag veziyyet azalan sira ile duzdukde ise en sol veziyyetdir Bunu tam ededler massivini artan sira ile duzen siralama alqoritminin numunesinde gosterek include lt stdlib h gt srand rand RAND MAX include lt stdio h gt printf include lt conio h gt getch include lt memory h gt memcpy include lt time h gt time include lt locale h gt setlocale define n 12 Elementlerin sayi Artan sira ile duzulmus massivde yariya bolme ile axtarisin heyata kecirilmesi int YariYariyaAxtarma int massiv const int say const int axtarilan int compare const int const int int sol 0 int sag say while sol lt sag int orta sol sag sol 2 if compare massiv orta axtarilan gt 0 sag orta else sol orta 1 return sag void MakeSort int massiv const int say int compare const int const int for int i 1 i lt say i int elem massiv i Novbeti elementi gotururuk if compare elem massiv i 1 gt 0 continue ne ise etmeye ehtiyac yoxdur int yeniYer YariYariyaAxtarma massiv i elem compare elementin massivdeki yeni yerini tapiriq memcpy massiv yeniYer 1 massiv yeniYer i yeniYer sizeof int hemin yeri bosaldiriq massiv yeniYer elem elementi yeni tapdigimiz yere yerlesdiririk Massivi artan sira ile duzmek ucun teleb olunan muqaise funksiyasi int Compare const int elem1 const int elem2 if elem1 gt elem2 return 1 if elem1 lt elem2 return 1 return 0 Alqoritminin istifadesine numune int main int massiv n int i setlocale LC ALL utf8 srand unsigned time NULL printf Massivdeki ededlerin ilkin tesadufi sirasi t for i 0 i lt n i massiv i 100 0 rand RAND MAX 1 printf d massiv i printf n MakeSort massiv n Compare massivin artan sira ile duzulmesi printf Massivdeki ededler sira ile duzuldukden sonra t for i 0 i lt n i printf d massiv i printf n getch Hemcinin baxAxtaris alqoritmleri Diger proqramlasdirma dillerinde tesviri