Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Idea binarysearcha:
- 1) na poczatku rozszerzamy rozmiar zbioru ( dla A=[a,b] rozmiar zbioru to b-a+1 np. rozmiar zbioru [0,5]=6 (bo {0,1,2,3,4,5,6} naleza do niego).
- 2) nastepnie zmniejszanie zbioru z lewej badz prawej strony.
- { -1 if x mniejszy od liczby
- guess(x)={ 0 if x==liczba
- { 1 if x>liczba
- Problemy, które na poczatku musimy rozwiazac:
- Czy zakladamy ze int start i int end nalezą do zbioru czy jest to zbiór otwarty?
- Niech należą nasz zbior to [start,end];
- Jak policzyc srodek zbioru?
- Przyklady zbiorów [0,5],[30,32],[21,40]
- Mozemy policzyc dlugosc zbioru, podzielic na polowe, a zrobic cos czesto nazywane offsetem. Tzn.
- [30,32] - rozmiar tablicy 3 , 3/2=1, 30+1=31 ! 31 to srodek talbicy! zgadza sie !
- [0,5] - rozmiar tablicy 6, 6/2=3, 0+3=3 !!3 to nie do konca srodek tablicy, bo elementow jest parzysta liczba, ale
- jest ok!
- [21,40]- rozmiar tablicy 40-21+1=20, 20/2=10, 21+10 ! 31 to srodek tablicy (tak samo jak w [0,5])
- NAJWAZNIEJSZA RZECZ W REKURENCJI!!!!!!!!!!!!!!!!!!!!!!!! ( no moze jedna z dwoch najwanziejszych) !!!
- KIEDY FUNKCJA MA SIE PRZESTAC WYWOLYWAC I MA ZWRACAC WYNIK ?????
- gdy wywolamy binary_search(n-1,n+1) a szukamy liczby n
- !!!!!!!!!!! Innymisłowy gdy nasza zmienna middle to zmienna, której szukamy.
- binary_search(int start,int end){
- if(quess(end)==-1){
- binary_search(int start,end+20);
- }
- }
- dzieki temu 1) mamy zalatwioną
- teraz juz zmniejsamy nas zbior, wzgledem SRODKA
- binary_search(int start,int end){
- if(quess(end)==-1){
- binary_search(int start,end+20);
- }
- //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
- int middle=start+(end-start)/2;
- if(quess(middle)==1){
- //nasz srodek jest za duzy! musimy isc na lewo na osi!
- binary_search(start,middle);
- }else if(quess(middle)==-1){
- //nasz srodek jest za maly! musimy isc na prawo na osi!
- binary_search(midle,end);
- }
- }
- Wiec teraz mamy funkcje, które "cos robi" pracuje nad zbiorem (głowny zarys logiki binarysearcha), zmenijsza/zwieksza go. Ale nadal kod nadaje sie do kosza :P. Nic nie zwraca i tak naprawde nic nie sprawdza. Wiec najlepiej jakby funkcja nam zwracala inta, TAJMENICZĄ LICZBE.
- int binary_search(int start,int end){
- if(quess(end)==-1){
- binary_search(int start,end+20);
- }
- //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
- int middle=start+(end-start)/2;
- if(quess(middle)==1){
- //nasz srodek jest za duzy! musimy isc na lewo na osi!
- return binary_search(start,middle);
- }else if(quess(middle)==-1){
- //nasz srodek jest za maly! musimy isc na prawo na osi!
- return binary_search(midle,end);
- }else if(quess(middle)==0){
- //znalezlismy liczbe!
- return middle;
- }
- }
- Jedna uwaga: middle sprawdzamy bezposrednio czy to jest nasza liczba (if quess(middle)==0) wiec mozemy zmodyfikowac nasza funkcje na:
- int binary_search(int start,int end){
- if(quess(end)==-1){
- binary_search(int start,end+20);
- }
- //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
- int middle=start+(end-start)/2;
- if(quess(middle)==1){
- //nasz srodek jest za duzy! musimy isc na lewo na osi!
- return binary_search(start,middle-1);
- }else if(quess(middle)==-1){
- //nasz srodek jest za maly! musimy isc na prawo na osi!
- return binary_search(midle+1,end);
- }else if(quess(middle)==0){
- //znalezlismy liczbe!
- return middle;
- }
- }
- Jakies problemy:
- co jesli nasza liczba to jest liczba graniczna, end albo start?
- Niech nasza liczba bedzie 4, a my zaczynamy od wywolania
- binary_search(0,4)
- wtedy middle=2;
- quess(middle)==-1
- wiec wywolujemy
- binary_search(2,4)
- middle=3
- quess(middle)==-1
- wiec wywolujemy
- binary_search(4,4)
- teraz middle==4
- wiec quess(middle)==0
- Suckes!!!
- Bałem sie bardzo ze dla graniczncyh sie cos zjebie, ale sie udało.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement