Šī apmācība izskaidros bināro meklēšanu un rekursīvo bināro meklēšanu Java kopā ar tās algoritmu, implementāciju un Java bināro meklēšanas koda piemēriem:
Bināra meklēšana Java ir metode, ko izmanto, lai meklētu mērķvērtību vai atslēgu kolekcijā. Tā ir metode, kurā atslēgas meklēšanai tiek izmantota metode "sadali un valdi".
Kolekcija, kurai jāpiemēro binārā meklēšana, lai meklētu atslēgu, jāsašķiro augošā secībā.
Parasti lielākā daļa programmēšanas valodu atbalsta lineārās meklēšanas, binārās meklēšanas un šifrēšanas metodes, ko izmanto, lai meklētu datus kolekcijā. Mēs apgūsim šifrēšanu turpmākajās mācību stundās.
Binary meklēšana Java programmā
Lineārā meklēšana ir pamattehnika. Šajā tehnikā masīvs tiek šķērsots secīgi, un katrs elements tiek salīdzināts ar atslēgu, līdz atslēga tiek atrasta vai tiek sasniegts masīva gals.
Lineārā meklēšana praktiskos lietojumos tiek izmantota reti. Visbiežāk tiek izmantota bināra meklēšana, jo tā ir daudz ātrāka nekā lineārā meklēšana.
Java nodrošina trīs veidus, kā veikt bināro meklēšanu:
- Izmantojot iteratīvo pieeju
- Rekursīvās pieejas izmantošana
- Izmantojot metodi Arrays.binarySearch ().
Šajā pamācībā mēs īstenosim un apspriedīsim visas šīs 3 metodes.
Binary meklēšanas algoritms programmā Java
Izmantojot bināro meklēšanas metodi, kolekcija tiek atkārtoti sadalīta uz pusēm, un atslēgas elements tiek meklēts kolekcijas kreisajā vai labajā pusē atkarībā no tā, vai atslēga ir mazāka vai lielāka par kolekcijas vidus elementu.
Vienkāršs binārās meklēšanas algoritms ir šāds:
- Aprēķina kolekcijas vidējo elementu.
- Salīdziniet galvenos elementus ar vidējo elementu.
- Ja atslēga = vidējais elements, tad tiek atgriezta atrastās atslēgas vidējā indeksa pozīcija.
- Ja atslēga> vidējais elements, tad atslēga atrodas kolekcijas labajā pusē. Tādējādi atkārtojiet 1.-3. darbību kolekcijas apakšējā (labajā) pusē.
- Ja atslēga <vidējais elements, tad atslēga atrodas kolekcijas augšējā daļā. Tādējādi ir jāatkārto bināra meklēšana augšējā daļā.
Kā redzams no iepriekš aprakstītajiem soļiem, binārajā meklēšanā puse kolekcijas elementu tiek ignorēta uzreiz pēc pirmā salīdzinājuma.
Ievērojiet, ka tāda pati soļu secība attiecas gan uz iteratīvo, gan rekursīvo bināro meklēšanu.
Ilustrēsim bināro meklēšanas algoritmu ar piemēru.
Piemēram, ņemsim šādu sakārtotu masīvu ar 10 elementiem.
Aprēķināsim masīva vidējo atrašanās vietu.
Mid = 0+9/2 = 4
#1) Atslēga = 21
Vispirms salīdzināsim atslēgas vērtību ar elementu [mid] un konstatēsim, ka elementa vērtība mid = 21.
Tādējādi mēs konstatējam, ka atslēga = [mid]. Tādējādi atslēga ir atrasta masīva 4. pozīcijā.
#2) Atslēga = 25
Vispirms mēs salīdzinām atslēgas vērtību ar mid. Tā kā (21 <25), mēs tieši meklēsim atslēgu masīva augšējā pusē.
Tagad atkal atradīsim masīva augšējās daļas vidusdaļu.
Mid = 4+9/2 = 6
Vērtība vietā [mid] = 25
Tagad mēs salīdzinām atslēgas elementu ar vidējo elementu. Tātad (25 == 25), tātad atslēga ir atrasta vietā [mid] = 6.
Tādējādi mēs vairākkārt sadalām masīvu un, salīdzinot atslēgas elementu ar vidusdaļu, izlemjam, kurā pusē meklēt atslēgu. Bināra meklēšana ir efektīvāka laika un pareizības ziņā, kā arī ir daudz ātrāka.
Binary meklēšanas īstenošana Java
Izmantojot iepriekš minēto algoritmu, īstenosim bināro meklēšanas programmu Java, izmantojot iteratīvo pieeju. Šajā programmā mēs ņemam piemēru masīvu un veicam bināro meklēšanu šajā masīvā.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("Ieejas masīvs: " + Arrays.toString(numArray)); //meklējamais atslēga int key = 20; System.out.println("Meklējamā atslēga=" + key); /nosaka pirmo uz pirmo indeksu int first = 0; /nosaka pēdējo uz pēdējo elementu masīvā int last=numArray.length-1; //aprēķina vidusmasīvs int mid = (first + last)/2; //tam laikam, kamēr pirmais un pēdējais nepārklājas while( first <= last ){ //ja mid <atslēga, tad meklējamā atslēga atrodas masīva pirmajā pusē if ( numArray[mid] last ){ System.out.println("Elements nav atrasts!"); } } } } }
Izvades rezultāts:
Ieejas masīvs: [5, 10, 15, 20, 25, 30, 35].
Meklējamā atslēga=20
Elements ir atrodams ar indeksu: 3
Iepriekšminētajā programmā ir parādīta iteratīvā pieeja binārā meklēšanā. Sākotnēji tiek deklarēts masīvs, pēc tam tiek definēta meklējamā atslēga.
Pēc masīva vidusdaļas aprēķināšanas atslēga tiek salīdzināta ar vidusdaļas elementu. Pēc tam atkarībā no tā, vai atslēga ir mazāka vai lielāka par atslēgu, atslēga tiek meklēta attiecīgi masīva apakšējā vai augšējā daļā.
Rekursīvā binārā meklēšana programmā Java
Bināro meklēšanu var veikt arī, izmantojot rekursijas metodi. Šajā gadījumā bināro meklēšanas metode tiek izsaukta rekursīvi, līdz atslēga ir atrasta vai viss saraksts ir izsmelts.
Programma, kas īsteno rekursīvo bināro meklēšanu, ir dota tālāk:
import java.util.*; class Main{ //rekursīvā metode binārajai meklēšanai public static int binary_Search(int int intArray[], int low, int high, int key){ //ja masīvs ir sakārtots, tad veikt bināro meklēšanu masīvā if (high>=low){ //aprēķināt mid int mid = low + (high - low)/2; //if key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //if intArray[mid]> key then key is in leftmasīva puse if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//rekursīvi meklēt atslēgu }else //atslēga atrodas masīva labajā pusē { return binary_Search(intArray, mid+1, high, key);//rekursīvi meklēt atslēgu } } } return -1; } public static void main(String args[]){ //definēt masīvu un atslēgu int int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputSaraksts: " + Arrays.toString(intArray)); int key = 31; System.out.println("Meklējamā atslēga:" + key); int high=intArray.length-1; //call binary search method int result = binary_Search(intArray,0,high,key); //print the result if (result == -1) System.out.println("\nKey nav atrasts dotajā sarakstā!"); else System.out.println("\nKey ir atrasts vietā: "+result + " sarakstā"); } } }
Izvades rezultāts:
Ievades saraksts: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Meklējamā atslēga:
Atslēga ir atrodama atrašanās vietā: 3 sarakstā
Izmantojot metodi Arrays.binarySearch ().
Java klase Arrays piedāvā metodi 'binarySearch ()', kas veic bināro meklēšanu dotajā masīvā. Šī metode kā argumentus pieņem masīvu un meklējamo atslēgu un atgriež atslēgas pozīciju masīvā. Ja atslēga nav atrasta, metode atgriež -1.
Tālāk dotajā piemērā ir implementēta metode Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //definē masīvu int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("Ievadmase Array : " + Arrays.toString(intArray)); //definē meklējamo atslēgu int key = 50; System.out.println("Meklējamā atslēga:" + key); //izsauc binarySearch metodi uz dotā masīva ar meklējamo atslēgu int result =Arrays.binarySearch(intArray,key); // izdrukāt atgriešanas rezultātu if (result <0) System.out.println("\nKey nav atrasts masīvā!"); else System.out.println("\nKey ir atrasts ar indeksu: "+rezultāts + " masīvā."); } } } }
Izvades rezultāts:
Ieejas masīvs: [10, 20, 30, 40, 50, 60, 70, 80, 90].
Meklējamā atslēga:50
Atslēga masīvā ir atrodama ar indeksu: 4.
Biežāk uzdotie jautājumi
Q #1) Kā rakstīt bināro meklēšanu?
Atbilde: Bināro meklēšanu parasti veic, sadalot masīvu uz pusēm. Ja meklējamā atslēga ir lielāka par vidējo elementu, tad tiek meklēta masīva augšējā puse, tālāk sadalot un meklējot apakšmasu, līdz atslēga tiek atrasta.
Līdzīgi, ja atslēga ir mazāka par vidējo elementu, tad atslēga tiek meklēta masīva apakšējā daļā.
2. jautājums) Kur izmanto bināro meklēšanu?
Atbilde: Bināro meklēšanu galvenokārt izmanto, lai meklētu sakārtotus datus programmatūras lietojumprogrammās, jo īpaši, ja atmiņas vieta ir kompakta un ierobežota.
Q #3) Kāda ir bināro meklējumu lielā O?
Atbilde: Binary meklēšanas laika sarežģītība ir O (logn), kur n ir elementu skaits masīvā. Binary meklēšanas telpas sarežģītība ir O (1).
Q #4) Vai binārā meklēšana ir rekursīva?
Atbilde: Jā. Tā kā bināra meklēšana ir dalīšanas un valdīšanas stratēģijas piemērs, un to var īstenot, izmantojot rekursiju. Mēs varam sadalīt masīvu uz pusēm un izsaukt vienu un to pašu metodi, lai veiktu bināro meklēšanu atkal un atkal.
Q #5) Kāpēc to sauc par bināro meklēšanu?
Atbilde: Binārajā meklēšanas algoritmā tiek izmantota dalīšanas un iekarošanas stratēģija, kas masīvu atkārtoti sagriež uz pusēm vai divās daļās. Tādējādi to sauc par bināro meklēšanu.
Secinājums
Binary search (binārā meklēšana) ir bieži izmantots meklēšanas paņēmiens programmā Java. Lai veiktu bināro meklēšanu, ir nepieciešams, lai dati būtu sakārtoti augošā secībā.
Bināro meklēšanu var īstenot, izmantojot iteratīvu vai rekursīvu pieeju. Java klasē Arrays ir pieejama arī metode 'binarySearch', kas veic bināro meklēšanu masīvā.
Turpmākajās pamācībās mēs izpētīsim dažādas šķirošanas tehnikas Java.