See õpetus selgitab Binary Search & Rekursiivne Binary Search Java koos selle algoritmi, rakendamise ja Java Binary Seach koodi näited:
Binaarne otsing Java's on tehnika, mida kasutatakse sihtväärtuse või võtme otsimiseks kollektsioonist. See on tehnika, mis kasutab võtme otsimiseks "jaga ja valitse" tehnikat.
Kollektsioon, mille suhtes rakendatakse Binary search'i võtme otsimiseks, peab olema sorteeritud kasvavas järjekorras.
Tavaliselt toetab enamik programmeerimiskeeli lineaarse otsingu, binaarse otsingu ja hashimise tehnikaid, mida kasutatakse andmete otsimiseks kogumikus. Me õpime hashimist järgmistes õpetustes.
Binaarne otsing Java's
Lineaarne otsing on põhitehnika. Selle tehnika puhul läbitakse massiivi järjestikku ja iga elementi võrreldakse võtmega, kuni võti on leitud või massiivi lõppu jõutakse.
Lineaarotsingut kasutatakse praktilistes rakendustes harva. Binaarne otsing on kõige sagedamini kasutatav tehnika, kuna see on palju kiirem kui lineaarne otsing.
Java pakub kolm võimalust binaarseks otsinguks:
- Iteratiivse lähenemisviisi kasutamine
- Rekursiivse lähenemisviisi kasutamine
- Kasutades meetodit Arrays.binarySearch ().
Selles õpetuses rakendame ja arutame kõiki neid 3 meetodit.
Algoritm binaarseks otsinguks Java's
Binaarse otsingu meetodi puhul jagatakse kogumik korduvalt pooleks ja võtmeelementi otsitakse kogumiku vasakus või paremas pooles, sõltuvalt sellest, kas võti on väiksem või suurem kui kogumiku keskmine element.
Lihtne binaarne otsingualgoritm on järgmine:
- Arvutage kollektsiooni keskmine element.
- Võrrelge põhielemente keskmise elemendiga.
- Kui võti = keskmine element, siis tagastame leitud võtme keskmise indeksi positsiooni.
- Else Kui võti> keskmine element, siis asub võti kollektsiooni paremas pooles. Seega korrake samme 1 kuni 3 kollektsiooni alumises (paremas) pooles.
- Else key <mid element, siis on võti kollektsiooni ülemises pooles. Seega tuleb korrata binaarset otsingut ülemises pooles.
Nagu ülaltoodud sammudest näha, jäetakse binaarses otsingus pooled elemendid kollektsioonis kohe pärast esimest võrdlust tähelepanuta.
Pange tähele, et sama sammude jada kehtib nii iteratiivse kui ka rekursiivse binaarse otsingu puhul.
Illustreerime binaarset otsingu algoritmi ühe näite abil.
Võtame näiteks järgmise 10 elemendist koosneva sorteeritud massiivi.
Arvutame massiivi keskmise asukoha.
Mid = 0+9/2 = 4
#1) Võti = 21
Kõigepealt võrdleme võtme väärtust elemendiga [mid] ja leiame, et elemendi väärtus keskel = 21.
Seega leiame, et võti = [mid]. Seega leitakse võti massiivi positsioonilt 4.
#2) Võti = 25
Kõigepealt võrdleme võtme väärtust keskmisega. Kuna (21 <25), otsime võtme otse massiivi ülemisest poolest.
Nüüd leiame jälle massiivi ülemise poole keskkoha.
Keskmine = 4+9/2 = 6
Väärtus asukohas [mid] = 25
Nüüd võrdleme võtmeelementi keskmise elemendiga. Seega (25 == 25), seega oleme leidnud võtme asukohas [mid] = 6.
Seega jagame massiivi korduvalt ja võrreldes võtmeelementi keskmisega otsustame, millisest poolest võtit otsida. Binaarne otsing on aja ja korrektsuse poolest tõhusam ja ka palju kiirem.
Binaarotsingu rakendamine Java
Kasutades ülaltoodud algoritmi, rakendame Java's programmi Binary search, kasutades iteratiivset lähenemist. Selles programmis võtame näidismassiivi ja teostame sellel massiivil binaarset otsingut.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("Sisendmassiivi: " + Arrays.toString(numArray)); //otsitav võti int key = 20; System.out.println("\nKey to be searched=" + key); //määrata esimene indeks esimeseks int first = 0; //määrata viimane kuni viimase elemendi massiivi int last=numArray.length-1; //arvutada keskm.massiiv int mid = (esimene + viimane)/2; //kuivõrd esimene ja viimane ei kattu while( esimene <= viimane ){ //kui mid <võti, siis otsitav võti on massiivis esimeses pooles if ( numArray[mid] last ){ System.out.println("Elementi ei leitud!"); } } } }
Väljund:
Sisendmassiivi: [5, 10, 15, 20, 25, 30, 35]
Otsitav võti=20
Element on leitud indeksiga: 3
Ülaltoodud programm näitab Binary search'i iteratiivset lähenemist. Esialgu deklareeritakse massiivi, seejärel määratletakse otsitav võti.
Pärast massiivi keskkoha arvutamist võrreldakse võtit keskmise elemendiga. Seejärel, sõltuvalt sellest, kas võti on väiksem või suurem kui võti, otsitakse võtit vastavalt massiivi alumises või ülemises pooles.
Rekursiivne binaarne otsing Java's
Binaarset otsingut saab teha ka rekursioonitehnika abil. Siin kutsutakse binaarset otsingumeetodit rekursiivselt, kuni võti on leitud või kogu nimekiri on ammendunud.
Allpool on esitatud programm, mis rakendab rekursiivset binaarset otsingut:
import java.util.*; class Main{ //rekursiivne meetod binaarseks otsinguks public static int binary_Search(int intArray[], int low, int high, int key){ //kui massiiv on korras, siis teostame massiivis binaarset otsingut if (high>=low){ //arvutame keskmist int mid = low + (high - low)/2; //kui key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //kui intArray[mid]> key siis key on vasakpoolnepool massiivi if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//rekursiivselt otsime võtit }else //võtit on massiivi paremas pooles { return binary_Search(intArray, mid+1, high, key);//rekursiivselt otsime võtit } } return -1; } public static void main(String args[]){ //määrame massiivi ja võtit int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputList: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nEsitav võti:" + key); int high=intArray.length-1; //kutse binaarne otsingumeetod int result = binary_Search(intArray,0,high,key); //trüki tulemus if (result == -1) System.out.println("\nKey ei leitud antud loendis!"); else System.out.println("\nKey on leitud kohas: "+result + " loendis"); } } }
Väljund:
Sisendnimekiri: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Otsitav võti:
Võti asub nimekirjas aadressil: 3.
Kasutades meetodit Arrays.binarySearch ().
Java klassis Arrays on olemas meetod 'binarySearch ()', mis teostab antud massiivi binaarset otsingut. See meetod võtab argumentidena massiivi ja otsitava võtme ning tagastab võtme positsiooni massiivi sees. Kui võtit ei leita, siis tagastab meetod -1.
Allpool esitatud näide rakendab meetodit Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //määrame massiivi int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("Sisendmassiivi : " + Arrays.toString(intArray)); //määrame otsitava võtme int key = 50; System.out.println("\nThe key to be searched:" + key); //kutsetame binarySearch meetodit antud massiivil koos otsitava võtmega int result =Arrays.binarySearch(intArray,key); //trükkida tagastamistulemus if (result <0) System.out.println("\nKey ei ole massiivi sees leitud!"); else System.out.println("\nKey on leitud indeksiga: "+result + " massiivi sees."); } } }
Väljund:
Sisend Array : [10, 20, 30, 40, 50, 60, 70, 80, 90]
Otsitav võti:50
Võti on leitud indeksis: 4 massiivi.
Korduma kippuvad küsimused
K #1) Kuidas kirjutada binaarset otsingut?
Vastus: Binaarne otsing viiakse tavaliselt läbi, jagades massiivi pooleks. Kui otsitav võti on suurem kui keskmine element, siis otsitakse massiivi ülemist poolt, jagades ja otsides alamassiivi edasi, kuni võti on leitud.
Samamoodi, kui võti on väiksem kui keskmist elementi, siis otsitakse võtit massiivi alumises pooles.
K #2) Kus kasutatakse binaarset otsingut?
Vastus: Binaarset otsingut kasutatakse peamiselt sorteeritud andmete otsimiseks tarkvararakendustes, eriti kui mäluruum on kompaktne ja piiratud.
K #3) Mis on binaarse otsingu suur O?
Vastus: Binaarse otsingu ajaline keerukus on O (logn), kus n on massiivi elementide arv. Binaarse otsingu ruumiline keerukus on O (1).
K #4) Kas binaarne otsing on rekursiivne?
Vastus: Jah. Kuna binaarne otsing on näide jaga-ja-võida strateegiast ja seda saab rakendada rekursiooni abil. Me võime jagada massiivi pooleks ja kutsuda sama meetodit binaarse otsingu sooritamiseks ikka ja jälle.
K #5) Miks nimetatakse seda binaarseks otsinguks?
Vastus: Binaarne otsingualgoritm kasutab "jaga ja valitse" strateegiat, mis lõikab massiivi korduvalt pooleks või kaheks osaks. Seetõttu nimetatakse seda binaarseks otsinguks.
Kokkuvõte
Binaarne otsing on Java's sageli kasutatav otsingutehnika. Binaarse otsingu teostamise eelduseks on, et andmed peavad olema järjestatud kasvavas järjekorras.
Binaarset otsingut saab rakendada kas iteratiivse või rekursiivse lähenemise abil. Java klassis Arrays on olemas ka meetod 'binarySearch', mis teostab Array'l binaarset otsingut.
Järgnevates õpetustes uurime erinevaid sorteerimistehnikaid Javas.