Prejsť na vyhľadávanie

Ako Binárne vyhľadávanie Jump Search je vyhľadávací algoritmus pre triedené polia. Základnou myšlienkou je skontrolovať menej prvkov (ako lineárne vyhľadávanie ) skokom dopredu o pevné kroky alebo preskočením niektorých prvkov namiesto prehľadávania všetkých prvkov.
Predpokladajme napríklad, že máme pole arr[] veľkosti n a blok (na preskočenie) veľkosti m. Potom hľadáme v indexoch arr[0] arr[m] arr[2m].....arr[km] atď. Keď nájdeme interval (arr[km] < x < arr[(k+1)m]) we perform a linear search operation from the index km to find the element x.
Uvažujme o nasledujúcom poli: (0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610). Dĺžka poľa je 16. Vyhľadávanie skokom nájde hodnotu 55 s nasledujúcimi krokmi za predpokladu, že veľkosť bloku, ktorý sa má preskočiť, je 4. 
KROK 1: Skok z indexu 0 na index 4; 
KROK 2: Skok z indexu 4 na index 8; 
KROK 3: Skok z indexu 8 na index 12; 
KROK 4: Keďže prvok na indexe 12 je väčší ako 55, skočíme o krok späť, aby sme sa dostali k indexu 8. 
KROK 5: Vykonajte lineárne vyhľadávanie od indexu 8, aby ste získali prvok 55.

Výkon v porovnaní s lineárnym a binárnym vyhľadávaním:

Ak to porovnáme s lineárnym a binárnym vyhľadávaním, potom to vyjde lepšie ako lineárne vyhľadávanie, ale nie lepšie ako binárne vyhľadávanie.

Zvyšujúce sa poradie výkonu je:

lineárne vyhľadávanie   <  jump search   <  binary search


Aká je optimálna veľkosť bloku na preskočenie?  
V najhoršom prípade musíme urobiť n/m skokov a ak je posledná kontrolovaná hodnota väčšia ako hľadaný prvok, vykonáme m-1 porovnaní skôr pre lineárne vyhľadávanie. Preto celkový počet porovnaní v najhoršom prípade bude ((n/m) + m-1). Hodnota funkcie ((n/m) + m-1) bude minimálna, keď m = √n. Preto je najlepšia veľkosť kroku m = √ n.

Kroky algoritmu

  • Jump Search je algoritmus na nájdenie konkrétnej hodnoty v zoradenom poli skokom cez určité kroky v poli.
  • Kroky sú určené sqrt dĺžky poľa. 
  • Tu je krok za krokom algoritmus na vyhľadávanie skokov:
  • Určte veľkosť kroku m pomocou sqrt dĺžky poľa n.
  • Začnite od prvého prvku poľa a preskočte m krokov, kým hodnota na tejto pozícii nebude väčšia ako cieľová hodnota.
    Keď sa nájde hodnota väčšia ako cieľ, vykonajte lineárne vyhľadávanie počnúc predchádzajúcim krokom, kým sa nenájde cieľ alebo kým nie je jasné, že cieľ nie je v poli.
    Ak je cieľ nájdený, vráťte jeho index. Ak nie, vráťte hodnotu -1 na označenie, že cieľ sa v poli nenašiel. 

Príklad 1:

C++
   // C++ program to implement Jump Search   #include          using     namespace     std  ;   int     jumpSearch  (  int     arr  []     int     x       int     n  )   {      // Finding block size to be jumped      int     step     =     sqrt  (  n  );      // Finding the block where element is      // present (if it is present)      int     prev     =     0  ;      while     (  arr  [  min  (  step       n  )  -1  ]      <     x  )      {      prev     =     step  ;      step     +=     sqrt  (  n  );      if     (  prev     >=     n  )      return     -1  ;      }      // Doing a linear search for x in block      // beginning with prev.      while     (  arr  [  prev  ]      <     x  )      {      prev  ++  ;      // If we reached next block or end of      // array element is not present.      if     (  prev     ==     min  (  step       n  ))      return     -1  ;      }      // If element is found      if     (  arr  [  prev  ]     ==     x  )      return     prev  ;      return     -1  ;   }   // Driver program to test function   int     main  ()   {      int     arr  []     =     {     0       1       1       2       3       5       8       13       21        34       55       89       144       233       377       610     };      int     x     =     55  ;      int     n     =     sizeof  (  arr  )     /     sizeof  (  arr  [  0  ]);          // Find the index of 'x' using Jump Search      int     index     =     jumpSearch  (  arr       x       n  );      // Print the index where 'x' is located      cout      < <     '  n  Number '      < <     x      < <     ' is at index '      < <     index  ;      return     0  ;   }   // Contributed by nuclode   
C
   #include      #include      int     min  (  int     a       int     b  ){      if  (  b  >  a  )      return     a  ;      else      return     b  ;   }   int     jumpsearch  (  int     arr  []     int     x       int     n  )   {      // Finding block size to be jumped      int     step     =     sqrt  (  n  );      // Finding the block where element is      // present (if it is present)      int     prev     =     0  ;      while     (  arr  [  min  (  step       n  )  -1  ]      <     x  )      {      prev     =     step  ;      step     +=     sqrt  (  n  );      if     (  prev     >=     n  )      return     -1  ;      }      // Doing a linear search for x in block      // beginning with prev.      while     (  arr  [  prev  ]      <     x  )      {      prev  ++  ;      // If we reached next block or end of      // array element is not present.      if     (  prev     ==     min  (  step       n  ))      return     -1  ;      }      // If element is found      if     (  arr  [  prev  ]     ==     x  )      return     prev  ;      return     -1  ;   }   int     main  ()   {      int     arr  []     =     {     0       1       1       2       3       5       8       13       21       34       55       89       144       233       377       610  };      int     x     =     55  ;      int     n     =     sizeof  (  arr  )  /  sizeof  (  arr  [  0  ]);      int     index     =     jumpsearch  (  arr       x       n  );      if  (  index     >=     0  )      printf  (  'Number is at %d index'    index  );      else      printf  (  'Number is not exist in the array'  );      return     0  ;   }   // This code is contributed by Susobhan Akhuli   
Java
   // Java program to implement Jump Search.   public     class   JumpSearch   {      public     static     int     jumpSearch  (  int  []     arr       int     x  )      {      int     n     =     arr  .  length  ;      // Finding block size to be jumped      int     step     =     (  int  )  Math  .  floor  (  Math  .  sqrt  (  n  ));      // Finding the block where element is      // present (if it is present)      int     prev     =     0  ;      for     (  int     minStep     =     Math  .  min  (  step       n  )  -  1  ;     arr  [  minStep  ]      <     x  ;     minStep     =     Math  .  min  (  step       n  )  -  1  )      {      prev     =     step  ;      step     +=     (  int  )  Math  .  floor  (  Math  .  sqrt  (  n  ));      if     (  prev     >=     n  )      return     -  1  ;      }      // Doing a linear search for x in block      // beginning with prev.      while     (  arr  [  prev  ]      <     x  )      {      prev  ++  ;      // If we reached next block or end of      // array element is not present.      if     (  prev     ==     Math  .  min  (  step       n  ))      return     -  1  ;      }      // If element is found      if     (  arr  [  prev  ]     ==     x  )      return     prev  ;      return     -  1  ;      }      // Driver program to test function      public     static     void     main  (  String     [     ]     args  )      {      int     arr  []     =     {     0       1       1       2       3       5       8       13       21        34       55       89       144       233       377       610  };      int     x     =     55  ;      // Find the index of 'x' using Jump Search      int     index     =     jumpSearch  (  arr       x  );      // Print the index where 'x' is located      System  .  out  .  println  (  'nNumber '     +     x     +      ' is at index '     +     index  );      }   }   
Python
   # Python3 code to implement Jump Search   import   math   def   jumpSearch  (   arr      x      n   ):   # Finding block size to be jumped   step   =   math  .  sqrt  (  n  )   # Finding the block where element is   # present (if it is present)   prev   =   0   while   arr  [  int  (  min  (  step     n  )  -  1  )]    <   x  :   prev   =   step   step   +=   math  .  sqrt  (  n  )   if   prev   >=   n  :   return   -  1   # Doing a linear search for x in    # block beginning with prev.   while   arr  [  int  (  prev  )]    <   x  :   prev   +=   1   # If we reached next block or end    # of array element is not present.   if   prev   ==   min  (  step     n  ):   return   -  1   # If element is found   if   arr  [  int  (  prev  )]   ==   x  :   return   prev   return   -  1   # Driver code to test function   arr   =   [   0     1     1     2     3     5     8     13     21     34     55     89     144     233     377     610   ]   x   =   55   n   =   len  (  arr  )   # Find the index of 'x' using Jump Search   index   =   jumpSearch  (  arr     x     n  )   # Print the index where 'x' is located   print  (  'Number'      x     'is at index'     '  %.0f  '  %  index  )   # This code is contributed by 'Sharad_Bhardwaj'.   
C#
   // C# program to implement Jump Search.   using     System  ;   public     class     JumpSearch   {      public     static     int     jumpSearch  (  int  []     arr       int     x  )      {      int     n     =     arr  .  Length  ;      // Finding block size to be jumped      int     step     =     (  int  )  Math  .  Sqrt  (  n  );      // Finding the block where the element is      // present (if it is present)      int     prev     =     0  ;      for     (  int     minStep     =     Math  .  Min  (  step       n  )  -  1  ;     arr  [  minStep  ]      <     x  ;     minStep     =     Math  .  Min  (  step       n  )  -  1  )      {      prev     =     step  ;      step     +=     (  int  )  Math  .  Sqrt  (  n  );      if     (  prev     >=     n  )      return     -  1  ;      }      // Doing a linear search for x in block      // beginning with prev.      while     (  arr  [  prev  ]      <     x  )      {      prev  ++  ;      // If we reached next block or end of      // array element is not present.      if     (  prev     ==     Math  .  Min  (  step       n  ))      return     -  1  ;      }      // If element is found      if     (  arr  [  prev  ]     ==     x  )      return     prev  ;      return     -  1  ;      }      // Driver program to test function      public     static     void     Main  ()      {      int  []     arr     =     {     0       1       1       2       3       5       8       13       21        34       55       89       144       233       377       610  };      int     x     =     55  ;      // Find the index of 'x' using Jump Search      int     index     =     jumpSearch  (  arr       x  );      // Print the index where 'x' is located      Console  .  Write  (  'Number '     +     x     +      ' is at index '     +     index  );      }   }   
JavaScript
    <  script  >   // Javascript program to implement Jump Search   function     jumpSearch  (  arr       x       n  )      {         // Finding block size to be jumped       let     step     =     Math  .  sqrt  (  n  );             // Finding the block where element is       // present (if it is present)       let     prev     =     0  ;         for     (  int     minStep     =     Math  .  Min  (  step       n  )  -  1  ;     arr  [  minStep  ]      <     x  ;     minStep     =     Math  .  Min  (  step       n  )  -  1  )      {         prev     =     step  ;         step     +=     Math  .  sqrt  (  n  );         if     (  prev     >=     n  )         return     -  1  ;         }             // Doing a linear search for x in block       // beginning with prev.       while     (  arr  [  prev  ]      <     x  )         {         prev  ++  ;             // If we reached next block or end of       // array element is not present.       if     (  prev     ==     Math  .  min  (  step       n  ))         return     -  1  ;         }         // If element is found       if     (  arr  [  prev  ]     ==     x  )         return     prev  ;             return     -  1  ;      }      // Driver program to test function    let     arr     =     [  0       1       1       2       3       5       8       13       21           34       55       89       144       233       377       610  ];      let     x     =     55  ;      let     n     =     arr  .  length  ;          // Find the index of 'x' using Jump Search    let     index     =     jumpSearch  (  arr       x       n  );          // Print the index where 'x' is located    document  .  write  (  `Number   ${  x  }   is at index   ${  index  }  `  );          // This code is contributed by _saurabh_jaiswal    <  /script>   
PHP
      // PHP program to implement Jump Search   function   jumpSearch  (  $arr     $x     $n  )   {   // Finding block size to be jumped   $step   =   sqrt  (  $n  );   // Finding the block where element is   // present (if it is present)   $prev   =   0  ;   while   (  $arr  [  min  (  $step     $n  )  -  1  ]    <   $x  )   {   $prev   =   $step  ;   $step   +=   sqrt  (  $n  );   if   (  $prev   >=   $n  )   return   -  1  ;   }   // Doing a linear search for x in block   // beginning with prev.   while   (  $arr  [  $prev  ]    <   $x  )   {   $prev  ++  ;   // If we reached next block or end of   // array element is not present.   if   (  $prev   ==   min  (  $step     $n  ))   return   -  1  ;   }   // If element is found   if   (  $arr  [  $prev  ]   ==   $x  )   return   $prev  ;   return   -  1  ;   }   // Driver program to test function   $arr   =   array  (   0     1     1     2     3     5     8     13     21     34     55     89     144     233     377     610   );   $x   =   55  ;   $n   =   sizeof  (  $arr  )   /   sizeof  (  $arr  [  0  ]);   // Find the index of '$x' using Jump Search   $index   =   jumpSearch  (  $arr     $x     $n  );   // Print the index where '$x' is located   echo   'Number '  .  $x  .  ' is at index '   .  $index  ;   return   0  ;   ?>   

výstup: 
 

 Number 55 is at index 10   


Časová zložitosť: O(?n) 
Pomocný priestor: O(1)

Výhody Jump Search:

  1. Lepšie ako lineárne vyhľadávanie polí, kde sú prvky rovnomerne rozložené.
  2. Skokové vyhľadávanie má nižšiu časovú zložitosť v porovnaní s lineárnym vyhľadávaním veľkých polí.
  3. Počet krokov vykonaných pri skokovom vyhľadávaní je úmerný druhej odmocnine veľkosti poľa, vďaka čomu je efektívnejší pre veľké polia.
  4. Je jednoduchšia na implementáciu v porovnaní s inými vyhľadávacími algoritmami, ako je binárne vyhľadávanie alebo ternárne vyhľadávanie.
  5. Skokové vyhľadávanie funguje dobre pre polia, kde sú prvky v poradí a rovnomerne rozložené, pretože pri každej iterácii môže preskočiť na bližšiu pozíciu v poli.

Dôležité body:  
 

  • Funguje iba so zoradenými poľami.
  • Optimálna veľkosť bloku, ktorý sa má preskočiť, je (? n). To robí časovú zložitosť vyhľadávania skokom O(? n).
  • Časová zložitosť vyhľadávania skokov je medzi lineárnym vyhľadávaním ((O(n)) a binárnym vyhľadávaním (O(Log n)).
  • Binárne vyhľadávanie je lepšie ako vyhľadávanie skokom, ale vyhľadávanie skokom má tú výhodu, že prechádzame späť iba raz (Binárne vyhľadávanie môže vyžadovať až O (Log n) skokov, pričom sa uvažuje o situácii, keď je prvok, ktorý sa má hľadať, najmenší prvok alebo len väčší ako najmenší). Takže v systéme, kde je binárne vyhľadávanie nákladné, používame vyhľadávanie skokov.


Referencie:  
https://en.wikipedia.org/wiki/Jump_search
Ak máte radi GeeksforGeeks a chceli by ste prispieť, môžete tiež napísať článok pomocou write.geeksforgeeks.org alebo pošlite svoj článok na [email protected]. Pozrite si, ako sa váš článok zobrazuje na hlavnej stránke GeeksforGeeks, a pomôžte tak ostatným Geeks. Ak nájdete niečo nesprávne, alebo ak sa chcete podeliť o viac informácií o téme diskutovanej vyššie, napíšte komentáre.