Binární vyhledávání v Javě

Binární vyhledávání v Javě

Binární vyhledávání je jednou z vyhledávacích technik používaných při třídění vstupu. Zde se zaměřujeme na nalezení prostředního prvku, který funguje jako referenční rámec, zda k němu jít doleva nebo doprava, protože prvky jsou již seřazeny. Toto vyhledávání pomáhá při optimalizaci vyhledávací techniky při každé iteraci se nazývá binární vyhledávání a čtenáři si na něj kladou důraz, protože se nepřímo používá při řešení otázek.

Binární vyhledávání

Binární vyhledávací algoritmus v Javě

Níže je uveden algoritmus navržený pro binární vyhledávání:

  1. Start
  2. Vezměte vstupní pole a cíl
  3. Inicializovat začátek = 0 a konec = (velikost pole -1)
  4. Indianize střední proměnná
  5. střední = (začátek+konec)/2
  6. if array[ mid ] == target then return mid
  7. if pole[ mid]
  8. if array[ mid ]> target then end = mid-1
  9. pokud začátek <=konec, přejděte na krok 5
  10. návrat -1 jako Nenalezen prvek
  11. Výstup

Nyní musíte přemýšlet o tom, co když vstup není seřazen, výsledky jsou nedefinované.

Poznámka: Pokud existují duplikáty, není zaručeno, který z nich bude nalezen.

Metody pro Java Binary Search

V Javě jsou tři způsoby implementace Binární vyhledávání v Javě jsou uvedeny níže:

  1. Iterativní metoda
  2. Rekurzivní metoda
  3. Vestavěná metoda

1. Iterativní metoda pro binární vyhledávání v Javě

Níže je implementace zmíněna níže:

Jáva




// Java implementation of iterative Binary Search> class> BinarySearch {> > // Returns index of x if it is present in arr[l....r], else return -1> > int> binarySearch(> int> arr[],> int> l,> int> r,> int> x)> > {> > while> (l <= r) {> > int> mid = (l + r) /> 2> ;> > // If the element is present at the> > // middle itself> > if> (arr[mid] == x) {> > return> mid;> > // If element is smaller than mid, then> > // it can only be present in left subarray> > // so we decrease our r pointer to mid - 1> > }> else> if> (arr[mid]>x) {> > r = mid -> 1> ;> > // Else the element can only be present> > // in right subarray> > // so we increase our l pointer to mid + 1> > }> else> {> > l = mid +> 1> ;> > }> > }> > // We reach here when element is not present> > // in array> > return> -> 1> ;> > }> > // Driver method to test above> > public> static> void> main(String args[])> > {> > BinarySearch ob => new> BinarySearch();> > int> arr[] = {> 2> ,> 3> ,> 4> ,> 10> ,> 40> };> > int> n = arr.length;> > int> x => 10> ;> > int> result = ob.binarySearch(arr,> 0> , n -> 1> , x);> > if> (result == -> 1> )> > System.out.println(> 'Element not present'> );> > else> > System.out.println(> 'Element found at index '> > + result);> > }> }>

Výstup

Element found at index 3 

Spropitné: Geekové vás jistě zajímá, zda existuje nějaká funkce jako dolní_mez() nebo horní hranice() pravděpodobně nalezený v C++ STL. takže přímá odpověď je, že žádná funkce neexistovala pouze do Java 9, později byly přidány.

2. Rekurzivní metoda pro binární vyhledávání

Níže je uvedena implementace výše uvedené metody:

Jáva




// Java implementation of> // recursive Binary Search> // Driver Class> class> BinarySearch {> > // Returns index of x if it is present in arr[l..> > // r], else return -1> > int> binarySearch(> int> arr[],> int> l,> int> r,> int> x)> > {> > if> (r>= l) {> > int> mid = l + (r - l) /> 2> ;> > // If the element is present at the> > // middle itself> > if> (arr[mid] == x)> > return> mid;> > // If element is smaller than mid, then> > // it can only be present in left subarray> > if> (arr[mid]>x)> > return> binarySearch(arr, l, mid -> 1> , x);> > // Else the element can only be present> > // in right subarray> > return> binarySearch(arr, mid +> 1> , r, x);> > }> > // We reach here when element is not present> > // in array> > return> -> 1> ;> > }> > // main function> > public> static> void> main(String args[])> > {> > BinarySearch ob => new> BinarySearch();> > int> arr[] = {> 2> ,> 3> ,> 4> ,> 10> ,> 40> };> > int> n = arr.length;> > int> x => 10> ;> > int> result = ob.binarySearch(arr,> 0> , n -> 1> , x);> > if> (result == -> 1> )> > System.out.println(> > 'Element is not present in array'> );> > else> > System.out.println(> > 'Element is present at index '> + result);> > }> }>

Výstup

Element is present at index 3 

Složitost výše uvedené metody

Časová náročnost: O (log N)
Prostorová složitost: O(1), Pokud je uvažován zásobník rekurzivních volání, bude pomocný prostor O(log N)

3. V Build Method pro binární vyhledávání v Javě

Arrays.binarysearch() funguje pro pole, která mohou být také primitivního datového typu.

Níže je uvedena implementace výše uvedené metody:

Jáva




// Java Program to demonstrate working of binarySearch()> // Method of Arrays class In a sorted array> // Importing required classes> import> java.util.Arrays;> // Main class> public> class> GFG {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Declaring an integer array> > int> arr[] = {> 10> ,> 20> ,> 15> ,> 22> ,> 35> };> > // Sorting the above array> > // using sort() method of Arrays class> > Arrays.sort(arr);> > int> key => 22> ;> > int> res = Arrays.binarySearch(arr, key);> > if> (res>=> 0> )> > System.out.println(> > key +> ' found at index = '> + res);> > else> > System.out.println(key +> ' Not found'> );> > key => 40> ;> > res = Arrays.binarySearch(arr, key);> > if> (res>=> 0> )> > System.out.println(> > key +> ' found at index = '> + res);> > else> > System.out.println(key +> ' Not found'> );> > }> }>

Výstup

22 found at index = 3 40 Not found 

Binární vyhledávání v kolekcích Java

Nyní se podívejme, jak Collections.binarySearch() funguje pro LinkedList. Takže v zásadě, jak je uvedeno výše, tato metoda běží v log(n) čase pro seznam s náhodným přístupem, jako je ArrayList. Pokud zadaný seznam neimplementuje rozhraní RandomAccess a je velký, tato metoda provede binární vyhledávání založené na iterátoru, které provádí O(n) procházení odkazů a porovnání prvků O(log n).

Collections.binarysearch() funguje pro objekty Kolekce jako ArrayList a Spojový seznam .

Níže je uvedena implementace výše uvedené metody:

Jáva




// Java Program to Demonstrate Working of binarySearch()> // method of Collections class> // Importing required classes> import> java.util.ArrayList;> import> java.util.Collections;> import> java.util.List;> // Main class> public> class> GFG {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Creating an empty ArrayList of integer type> > List al => new> ArrayList();> > // Populating the Arraylist> > al.add(> 1> );> > al.add(> 2> );> > al.add(> 3> );> > al.add(> 10> );> > al.add(> 20> );> > // 10 is present at index 3> > int> key => 10> ;> > int> res = Collections.binarySearch(al, key);> > if> (res>=> 0> )> > System.out.println(> > key +> ' found at index = '> + res);> > else> > System.out.println(key +> ' Not found'> );> > key => 15> ;> > res = Collections.binarySearch(al, key);> > if> (res>=> 0> )> > System.out.println(> > key +> ' found at index = '> + res);> > else> > System.out.println(key +> ' Not found'> );> > }> }>

Výstup

10 found at index = 3 15 Not found 

Složitost výše uvedené metody

Časová složitost : O (log N)
Pomocný prostor : O(1)