Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. Idea binarysearcha:
  2. 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).
  3. 2) nastepnie zmniejszanie zbioru z lewej badz prawej strony.
  4.          { -1  if x mniejszy od liczby
  5. guess(x)={ 0 if x==liczba
  6.          { 1 if x>liczba
  7. Problemy, które na poczatku musimy rozwiazac:
  8.     Czy zakladamy ze int start i int end nalezą do zbioru czy jest to zbiór otwarty?
  9.         Niech należą nasz zbior to [start,end];
  10.     Jak policzyc srodek zbioru?
  11.         Przyklady zbiorów [0,5],[30,32],[21,40]
  12.         Mozemy policzyc dlugosc zbioru, podzielic na polowe, a zrobic cos czesto nazywane offsetem. Tzn.
  13.         [30,32] - rozmiar tablicy 3 , 3/2=1, 30+1=31 ! 31 to srodek talbicy! zgadza sie !
  14.         [0,5] - rozmiar tablicy 6, 6/2=3, 0+3=3 !!3 to nie do konca srodek tablicy, bo elementow jest parzysta liczba, ale
  15.             jest ok!
  16.         [21,40]- rozmiar tablicy 40-21+1=20, 20/2=10, 21+10 ! 31 to srodek tablicy (tak samo jak w [0,5])
  17.  
  18. NAJWAZNIEJSZA RZECZ W REKURENCJI!!!!!!!!!!!!!!!!!!!!!!!! ( no moze jedna z dwoch najwanziejszych) !!!
  19. KIEDY FUNKCJA MA SIE PRZESTAC WYWOLYWAC I MA ZWRACAC WYNIK ?????
  20. gdy wywolamy binary_search(n-1,n+1) a szukamy liczby n
  21. !!!!!!!!!!! Innymisłowy gdy nasza zmienna middle to zmienna, której szukamy.
  22.  
  23. binary_search(int start,int end){
  24.     if(quess(end)==-1){
  25.         binary_search(int start,end+20);
  26.     }
  27. }
  28. dzieki temu 1) mamy zalatwioną
  29. teraz juz zmniejsamy nas zbior, wzgledem SRODKA
  30. binary_search(int start,int end){
  31.     if(quess(end)==-1){
  32.         binary_search(int start,end+20);
  33.     }
  34.     //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
  35.     int middle=start+(end-start)/2;
  36.     if(quess(middle)==1){
  37.         //nasz srodek jest za duzy! musimy isc na lewo na osi!
  38.         binary_search(start,middle);
  39.     }else if(quess(middle)==-1){
  40.         //nasz srodek jest za maly! musimy isc na prawo na osi!
  41.         binary_search(midle,end);
  42.     }
  43. }
  44. 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.
  45. int binary_search(int start,int end){
  46.     if(quess(end)==-1){
  47.         binary_search(int start,end+20);
  48.     }
  49.     //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
  50.     int middle=start+(end-start)/2;
  51.     if(quess(middle)==1){
  52.         //nasz srodek jest za duzy! musimy isc na lewo na osi!
  53.         return binary_search(start,middle);
  54.     }else if(quess(middle)==-1){
  55.         //nasz srodek jest za maly! musimy isc na prawo na osi!
  56.         return binary_search(midle,end);
  57.     }else if(quess(middle)==0){
  58.         //znalezlismy liczbe!
  59.         return middle;
  60.     }
  61. }
  62.  
  63. Jedna uwaga: middle sprawdzamy bezposrednio czy to jest nasza liczba (if quess(middle)==0) wiec mozemy zmodyfikowac nasza funkcje na:
  64. int binary_search(int start,int end){
  65.     if(quess(end)==-1){
  66.         binary_search(int start,end+20);
  67.     }
  68.     //obliczamy dla ulatwienia srodek, bedzie nam potrzebny
  69.     int middle=start+(end-start)/2;
  70.     if(quess(middle)==1){
  71.         //nasz srodek jest za duzy! musimy isc na lewo na osi!
  72.         return binary_search(start,middle-1);
  73.     }else if(quess(middle)==-1){
  74.         //nasz srodek jest za maly! musimy isc na prawo na osi!
  75.         return binary_search(midle+1,end);
  76.     }else if(quess(middle)==0){
  77.         //znalezlismy liczbe!
  78.         return middle;
  79.     }
  80. }
  81.  
  82. Jakies problemy:
  83. co jesli nasza liczba to jest liczba graniczna, end albo start?
  84. Niech nasza liczba bedzie 4, a my zaczynamy od wywolania
  85. binary_search(0,4)
  86. wtedy middle=2;
  87. quess(middle)==-1
  88. wiec wywolujemy
  89. binary_search(2,4)
  90. middle=3
  91. quess(middle)==-1
  92. wiec wywolujemy
  93. binary_search(4,4)
  94. teraz middle==4
  95. wiec quess(middle)==0
  96. Suckes!!!
  97. Bałem sie bardzo ze dla graniczncyh sie cos zjebie, ale sie udało.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement