Denne vejledning vil forklare binær søgning & rekursiv binær søgning i Java sammen med dens algoritme, implementering og Java Binary Seach Code Eksempler:
En binær søgning i Java er en teknik, der bruges til at søge efter en bestemt værdi eller nøgle i en samling. Det er en teknik, der bruger "del og hersk"-teknikken til at søge efter en nøgle.
Den samling, som binær søgning skal anvendes på for at søge efter en nøgle, skal sorteres i stigende orden.
Normalt understøtter de fleste programmeringssprog lineær søgning, binær søgning og Hashing-teknikker, som bruges til at søge efter data i samlingen. Vi lærer hashing i vores efterfølgende tutorials.
Binær søgning i Java
Lineær søgning er en grundlæggende teknik. I denne teknik gennemløbes arrayet sekventielt, og hvert element sammenlignes med nøglen, indtil nøglen er fundet, eller arrayet er nået til enden af arrayet.
Lineær søgning anvendes sjældent i praktiske anvendelser. Binær søgning er den hyppigst anvendte teknik, da den er meget hurtigere end lineær søgning.
Java tilbyder tre måder at udføre en binær søgning på:
- Brug af den iterative metode
- Brug af en rekursiv tilgang
- Brug af metoden Arrays.binarySearch ().
I denne vejledning vil vi implementere og diskutere alle disse 3 metoder.
Algoritme til binær søgning i Java
I den binære søgemetode deles samlingen gentagne gange i to halvdele, og nøgleelementet søges i den venstre eller højre halvdel af samlingen, afhængigt af om nøglen er mindre eller større end det midterste element i samlingen.
En simpel binær søgealgoritme er som følger:
- Beregner det midterste element i samlingen.
- Sammenlign de vigtigste elementer med det midterste element.
- Hvis nøgle = det midterste element, returneres den midterste indeksposition for den fundne nøgle.
- Else Hvis key> mid element, så ligger key i den højre halvdel af samlingen. Gentag derfor trin 1 til 3 for den nederste (højre) halvdel af samlingen.
- Ellers key <mid element, så er key i den øverste halvdel af samlingen. Derfor skal du gentage den binære søgning i den øverste halvdel.
Som du kan se af ovenstående trin, ignoreres halvdelen af elementerne i samlingen i binær søgning lige efter den første sammenligning.
Bemærk, at den samme rækkefølge af trin gælder for iterativ såvel som rekursiv binær søgning.
Lad os illustrere den binære søgealgoritme ved hjælp af et eksempel.
Tag f.eks. følgende sorteret array med 10 elementer.
Lad os beregne den midterste placering i arrayet.
Mid = 0+9/2 = 4
#1) Nøgle = 21
Først sammenligner vi nøgleværdien med elementet [mid], og vi finder ud af, at elementværdien ved mid = 21.
Vi finder således, at key = [mid], og at key findes således på position 4 i arrayet.
#2) Nøgle = 25
Vi sammenligner først nøgleværdien med mid. Da (21 <25), søger vi direkte efter nøglen i den øverste halvdel af arrayet.
Nu skal vi igen finde midten for den øverste halvdel af arrayet.
Mid = 4+9/2 = 6
Værdien på sted [mid] = 25
Nu sammenligner vi nøgleelementet med det midterste element, så (25 == 25), og derfor har vi fundet nøglen på sted [mid] = 6.
Vi deler således arrayet gentagne gange, og ved at sammenligne nøgleelementet med midten beslutter vi, i hvilken halvdel vi skal søge efter nøglen. Binær søgning er mere effektiv med hensyn til tid og korrekthed, og den er også meget hurtigere.
Implementering af binær søgning Java
Lad os ved hjælp af ovenstående algoritme implementere et program til binær søgning i Java ved hjælp af den iterative metode. I dette program tager vi et eksempel på et array og udfører binær søgning på dette array.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("Input array: " + Arrays.toString(numArray))); //nøgle der skal søges int key = 20; System.out.println("\nNøgle der skal søges=" + key); //sæt første til første indeks int first = 0; //sæt sidste til sidste element i arrayet int last=numArray.length-1; //beregn midten afarray int mid = (first + last)/2; // mens første og sidste ikke overlapper hinanden while( first <= last ){ //hvis mid <key, så er den nøgle, der skal søges, i den første halvdel af arrayet if ( numArray[mid] last ){ System.out.println("Elementet er ikke fundet!"); } } }
Output:
Indgangsmatrialet: [5, 10, 15, 15, 20, 25, 30, 35]
Nøgle, der skal søges=20
Elementet er fundet på indeks: 3
Ovenstående program viser en iterativ tilgang til binær søgning. Først deklareres et array, derefter defineres en nøgle, der skal søges efter.
Efter beregning af midten af arrayet sammenlignes nøglen med det midterste element. Derefter søges nøglen i den nederste eller øverste halvdel af arrayet, afhængigt af om den er mindre eller større end nøglen.
Rekursiv binær søgning i Java
Du kan også udføre en binær søgning ved hjælp af rekursionsteknikken. Her kaldes den binære søgemetode rekursivt, indtil nøglen er fundet, eller hele listen er udtømt.
Programmet, der implementerer en rekursiv binær søgning, er angivet nedenfor:
import java.util.*; class Main{ //recursiv metode til binær søgning public static int binary_Search(int intArray[], int low, int high, int key){ //hvis arrayet er i orden, så udfør binær søgning på arrayet if (high>=low){ //beregn midten int mid = low + (high - low)/2; //hvis key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //hvis intArray[mid]> key, så er key i venstrehalvdelen af arrayet if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//recursivt søge efter key }else //key er i højre halvdel af arrayet { return binary_Search(intArray, mid+1, high, key);//recursivt søge efter key } } } return -1; } } public static void main(String args[]){ //definere array og key intArray[] = {1,11,21,21,31,41,51,61,61,71,81,91}; System.out.println("InputListe: " + Arrays.toString(intArray))); int key = 31; System.out.println("\nNøglen, der skal søges:" + key); int high=intArray.length-1; //kald binær søgemetode int result = binary_Search(intArray,0,high,key)); //udskriv resultatet if (result == -1) System.out.println("\nNNøglen findes ikke i den givne liste!"); ellers System.out.println("\nNNøglen er fundet på placering: "+result + " i listen"); } }
Output:
Indtastningsliste: [1, 11, 21, 31, 31, 41, 51, 51, 61, 71, 81, 91
Den nøgle, der skal søges efter:
Nøglen findes på placering: 3 på listen
Brug af metoden Arrays.binarySearch ().
Arrays-klassen i Java indeholder en metode "binarySearch ()", der udfører en binær søgning på det givne Array. Denne metode tager arrayet og den nøgle, der skal søges efter, som argumenter og returnerer nøglens position i arrayet. Hvis nøglen ikke findes, returnerer metoden -1.
Nedenstående eksempel implementerer metoden Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //definere et array int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("The input Array : " + Arrays.toString(intArray))); //definere den nøgle, der skal søges efter int key = 50; System.out.println("\nNøglen, der skal søges efter:" + key); //anvende binarySearch-metoden på det givne array med den nøgle, der skal søges efter int result =Arrays.binarySearch(intArray,key); //udskriv det returnerede resultat if (result <0) System.out.println("\nKey er ikke fundet i arrayet!"); ellers System.out.println("\nKey er fundet ved indeks: "+result + " i arrayet."); } }
Output:
Input Array : [10, 20, 30, 30, 40, 40, 50, 50, 60, 60, 70, 80, 90]
Den nøgle, der skal søges efter:50
Nøglen findes ved indeks: 4 i arrayet.
Ofte stillede spørgsmål
Spørgsmål 1) Hvordan skriver man en binær søgning?
Svar: Binær søgning udføres normalt ved at dele arrayet i to halvdele. Hvis den nøgle, der skal søges efter, er større end det midterste element, søges der i den øverste halvdel af arrayet ved yderligere at dele og søge i underarrayet, indtil nøglen er fundet.
Hvis nøglen er mindre end det midterste element, søges nøglen på samme måde i den nederste halvdel af arrayet.
Sp #2) Hvor anvendes binær søgning?
Svar: Binær søgning bruges hovedsagelig til at søge efter sorterede data i softwareapplikationer, især når hukommelsespladsen er kompakt og begrænset.
Sp #3) Hvad er det store O ved binær søgning?
Svar: Den binære søges tidskompleksitet er O (logn), hvor n er antallet af elementer i arrayet. Den binære søges rumkompleksitet er O (1).
Spørgsmål #4) Er binær søgning rekursiv?
Svar: Ja, da binær søgning er et eksempel på en divide-and-conquer-strategi, og den kan implementeres ved hjælp af rekursion, kan vi dele arrayet op i to dele og kalde den samme metode til at udføre den binære søgning igen og igen.
Spørgsmål #5) Hvorfor kaldes det en binær søgning?
Svar: Den binære søgealgoritme anvender en divide-and-conquer-strategi, der gentagne gange skærer arrayet i to dele eller halvdele. Derfor kaldes den binær søgning.
Konklusion
Binær søgning er den hyppigt anvendte søgeteknik i Java. Kravet til en binær søgning er, at dataene skal være sorteret i stigende orden.
En binær søgning kan gennemføres enten ved hjælp af en iterativ eller rekursiv tilgang. Arrays-klassen i Java indeholder også metoden "binarySearch", som udfører en binær søgning på et Array.
I vores efterfølgende tutorials vil vi udforske forskellige sorteringsteknikker i Java.