logo

Binair zoeken in Java

Binair zoeken is een van de zoektechnieken die worden toegepast wanneer de invoer wordt gesorteerd. Hier concentreren we ons op het vinden van het middelste element dat als referentiekader fungeert, of we er nu links of rechts naartoe moeten gaan, aangezien de elementen al zijn gesorteerd. Dit zoeken helpt bij het optimaliseren van de zoektechniek, waarbij elke iteratie binair zoeken wordt genoemd en lezers benadrukken dit omdat het indirect wordt toegepast bij het oplossen van vragen.

Binaire zoekopdracht

Binair zoekalgoritme in Java

Hieronder vindt u het algoritme dat is ontworpen voor binair zoeken:



  1. Begin
  2. Neem invoerarray en Target
  3. Initialiseer start = 0 en einde = (arraygrootte -1)
  4. Indianize middenvariabele
  5. midden = (begin+einde)/2
  6. if array[ mid ] == doel retourneer dan mid
  7. if array[ midden ]
  8. als array[ mid ]> doel dan end = mid-1
  9. als start<=einde ga dan naar stap 5
  10. retourneer -1 als Niet element gevonden
  11. Uitgang

Nu moet u zich afvragen: als de invoer niet is gesorteerd, zijn de resultaten ongedefinieerd.

Opmerking: Als er duplicaten zijn, is er geen garantie welke zal worden gevonden.

Methoden voor binair zoeken in Java

Er zijn drie methoden in Java om te implementeren Binaire zoekopdracht in Java worden hieronder vermeld:

  1. Iteratieve methode
  2. Recursieve methode
  3. Ingebouwde methode

1. Iteratieve methode voor binair zoeken in Java

Hieronder wordt de implementatie hieronder vermeld:

Java




// 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);> >}> }>

>

>

Uitvoer

nfa naar dfa
Element found at index 3>

Tip: Geeks, je vraagt ​​je vast af of er een functie is zoals ondergrens() of bovengrens() waarschijnlijk gevonden in C++ STL. dus het duidelijke antwoord is dat er pas tot Java 9 een functie was, later werden ze toegevoegd.

2. Recursieve methode voor binair zoeken

Hieronder vindt u de implementatie van de bovenstaande methode:

Java




// 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);> >}> }>

>

>

Uitvoer

Element is present at index 3>

Complexiteit van de bovenstaande methode

Tijdcomplexiteit: O(log N)
Ruimtecomplexiteit: O(1), als de recursieve call-stack in aanmerking wordt genomen, zal de hulpruimte O(log N) zijn

3. In build-methode voor binair zoeken in Java

Arrays.binarysearch() werkt voor arrays die ook van een primitief gegevenstype kunnen zijn.

Hieronder vindt u de implementatie van de bovenstaande methode:

Java




// 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'>);> >}> }>

>

>

Uitvoer

22 found at index = 3 40 Not found>

Binair zoeken in Java-collecties

Laten we nu eens kijken hoe Collections.binarySearch() werkt voor LinkedList. Dus, zoals hierboven besproken, draait deze methode in log(n)-tijd voor een willekeurige toegangslijst zoals ArrayList. Als de opgegeven lijst de RandomAccess-interface niet implementeert en groot is, voert deze methode een op iterator gebaseerde binaire zoekopdracht uit die O(n)-linktraversals en O(log n)-elementvergelijkingen uitvoert.

Collecties.binarysearch() werkt voor objecten Collecties zoals ArrayLijst En GelinkteLijst .

Hieronder vindt u de implementatie van de bovenstaande methode:

Java




// 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'>);> >}> }>

>

>

Uitvoer

10 found at index = 3 15 Not found>

De complexiteit van de bovenstaande methode

Tijdcomplexiteit : O(log N)
Hulpruimte : O(1)