Ĉi tiu lernilo Klarigos Duuman Serĉon & Rekursiva Binara Serĉo en Java kune kun ĝia Algoritmo, Efektivigo kaj Java Binara Serĉo-Kodo Ekzemploj:
Duuma serĉo en Java estas tekniko, kiu estas uzata por serĉi celitan valoron aŭ ŝlosilon en kolekto. Ĝi estas tekniko kiu uzas la "dividu kaj konkeri" teknikon por serĉi ŝlosilon.
La kolekto sur kiu Duuma serĉo estas aplikata por serĉi ŝlosilon devas esti ordigita en pligranda ordo.
Kutime, la plej multaj el la programlingvoj subtenas Lineara serĉo, Binara serĉo, kaj Hashing teknikoj kiuj estas uzataj por serĉi datumojn en la kolekto. Ni lernos hashing en niaj postaj lerniloj.
Binara Serĉo En Java
Lineara serĉo estas baza tekniko. En ĉi tiu tekniko, la tabelo estas trairita sinsekve kaj ĉiu elemento estas komparata kun la ŝlosilo ĝis la ŝlosilo estas trovita aŭ la fino de la tabelo estas atingita.
Linia serĉo estas malofte uzata en praktikaj aplikoj. Duuma serĉo estas la plej ofte uzata tekniko ĉar ĝi estas multe pli rapida ol lineara serĉo.
Java disponigas tri manierojn fari duuman serĉon:
- Uzante la ripeta aliro
- Uzante rekursivan aliron
- Uzante Arrays.binarySearch ()-metodon.
En ĉi tiu lernilo, ni efektivigos kaj diskutos ĉiujn ĉi tiujn 3 metodoj.
Algoritmo Por Duuma Serĉo En Java
En la duuma serĉoserĉmetodo, la kolekto estas plurfoje dividita en duonon kaj la ŝlosila elemento estas serĉata en la maldekstra aŭ dekstra duono de la kolekto depende de ĉu la ŝlosilo estas malpli ol aŭ pli granda ol la meza elemento de la kolekto.
Simpla Binara Serĉa Algoritmo estas jena:
- Kalkulu la mezan elementon de la kolekto.
- Komparu la ŝlosilajn erojn kun la meza elemento.
- Se klavo = meza elemento, tiam ni resendas la mezan indeksan pozicion por la trovita ŝlosilo.
- Ali Se klavo > meza elemento, tiam la ŝlosilo kuŝas en la dekstra duono de la kolekto. Tiel ripetu la paŝojn 1 ĝis 3 sur la malsupra (dekstra) duono de la kolekto.
- Alie klavo meza elemento, tiam la ŝlosilo estas en la supra duono de la kolekto. Tial vi devas ripeti la duuman serĉon en la supra duono.
Kiel vi povas vidi el la supraj paŝoj, en Binara serĉo, duono de la elementoj en la kolekto estas ignorataj tuj post la unua komparo.
Rimarku, ke la sama sinsekvo de paŝoj validas por ripeta same kiel rekursiva binara serĉo.
Ni ilustru la binaran serĉalgoritmon uzante ekzemplon.
Ekzemple , prenu la jenan ordigitan tabelon de 10 elementoj.
Ni kalkulu la mezan lokon de la tabelo.
Mez = 0+9/2 = 4
#1) Ŝlosilo = 21
Unue, ni komparos la ŝlosilan valoron kun la [mid] elemento kaj ni trovas ke la elemento valoro jemid = 21.
Tiel ni trovas tiun ŝlosilon = [mid]. Tial la ŝlosilo troviĝas ĉe pozicio 4 en la tabelo.
#2) Ŝlosilo = 25
Ni unue komparas la ŝlosilon valoro al meza. Kiel (21 25), ni rekte serĉos la ŝlosilon en la supra duono de la tabelo.
Nun denove ni trovos la mezon por la supra duono de la tabelo. la tabelo.
Mez = 4+9/2 = 6
La valoro ĉe loko [meze] = 25
Nun ni komparu la ŝlosilan elementon kun la meza elemento. Do (25 == 25), tial ni trovis la ŝlosilon ĉe loko [mid] = 6.
Tiel ni plurfoje dividas la tabelon kaj komparante la ŝlosilan elementon kun la mezo, ni decidas en kiu duono al serĉi la ŝlosilon. Duuma serĉo estas pli efika laŭ tempo kaj ĝusteco kaj estas multe pli rapida ankaŭ.
Duuma Serĉo-Efektivigo Java
Uzante la ĉi-supran algoritmon, ni efektivigu Duuman serĉprogramon en Java uzante la ripeta aliro. En ĉi tiu programo, ni prenas ekzemplon tabelon kaj faras binaran serĉon sur ĉi tiu tabelo.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("The input array: " + Arrays.toString(numArray)); //key to be searched int key = 20; System.out.println("\nKey to be searched=" + key); //set first to first index int first = 0; //set last to last elements in array int last=numArray.length-1; //calculate mid of the array int mid = (first + last)/2; //while first and last do not overlap while( first = last ){ //if the mid key, then key to be searched is in the first half of array if ( numArray[mid] last ){ System.out.println("Element is not found!"); } } }
Eligo:
La eniga tabelo: [5, 10, 15, 20 , 25, 30, 35]
Serĉota ŝlosilo=20
Elemento troviĝas ĉe indekso: 3
La ĉi-supra programo montras ripetan aliron de Binara serĉo. Komence, tabelo estas deklarita, tiam ŝlosilo serĉenda estas difinita.
Post kalkulo de la mezo de la tabelo, la ŝlosilo estas komparata kun la meza elemento. Tiam depende ĉula ŝlosilo estas malpli ol aŭ pli granda ol la ŝlosilo, la ŝlosilo estas serĉata en la malsupra aŭ supra duono de la tabelo respektive.
Rekursiva Binara Serĉo En Java
Vi ankaŭ povas fari binaran serĉon. uzante la rekursan teknikon. Ĉi tie, la binara serĉmetodo estas vokita rekursie ĝis la ŝlosilo estas trovita aŭ la tuta listo estas elĉerpita.
La programo kiu efektivigas rekursieman binaran serĉon estas donita sube:
import java.util.*; class Main{ //recursive method for binary search public static int binary_Search(int intArray[], int low, int high, int key){ //if array is in order then perform binary search on the array if (high>=low){ //calculate 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 left half of array if (intArray[mid] > key){ return binary_Search(intArray, low, mid-1, key);//recursively search for key }else //key is in right half of the array { return binary_Search(intArray, mid+1, high, key);//recursively search for key } } return -1; } public static void main(String args[]){ //define array and key int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("Input List: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nThe key to be searched:" + 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 not found in given list!"); else System.out.println("\nKey is found at location: "+result + " in the list"); } }
Eligo:
Eniga Listo: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
La serĉenda ŝlosilo :
Ŝlosilo troviĝas ĉe loko: 3 en la listo
Uzante Arrays.binarySearch () metodo.
La klaso Arrays en Java provizas 'binarySearch ()'-metodon, kiu faras la binaran serĉon sur la donita Array. Ĉi tiu metodo prenas la tabelon kaj la serĉotan ŝlosilon kiel argumentojn kaj resendas la pozicion de la ŝlosilo en la tabelo. Se la ŝlosilo ne estas trovita, tiam la metodo liveras -1.
La ĉi-suba ekzemplo efektivigas la metodon Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //define an array int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("The input Array : " + Arrays.toString(intArray)); //define the key to be searched int key = 50; System.out.println("\nThe key to be searched:" + key); //call binarySearch method on the given array with key to be searched int result = Arrays.binarySearch(intArray,key); //print the return result if (result 0) System.out.println("\nKey is not found in the array!"); else System.out.println("\nKey is found at index: "+result + " in the array."); } }
Eligo:
La eniga Tabelo : [10, 20, 30, 40, 50, 60, 70, 80, 90]
La serĉenda ŝlosilo:50
Ŝlosilo troviĝas ĉe indekso: 4 en la tabelo.
Oftaj Demandoj
Q #1) Kiel vi skribas duuman serĉon ?
Respondo: Duuma serĉo estas kutime farita per dividado de la tabelo en duonojn. Se la serĉenda ŝlosilo estas pli granda ol la meza elemento,tiam la supra duono de la tabelo estas serĉata per plua dividado kaj serĉado de la sub-tabelo ĝis la ŝlosilo estas trovita.
Simile, se la ŝlosilo estas malpli ol la meza elemento, tiam la ŝlosilo estas serĉata en la malsupra. duono de la tabelo.
Q #2) Kie estas uzata la duuma serĉo?
Respondo: Duuma serĉo estas ĉefe uzata por serĉi ordigitaj datumoj en programaroj precipe kiam la memorspaco estas kompakta kaj limigita.
Q #3) Kio estas la granda O de binara serĉo?
Respondo : La tempokomplekseco de la binara serĉo estas O (logn) kie n estas la nombro da elementoj en la tabelo. La spackomplekseco de la duuma serĉo estas O (1).
Q #4) Ĉu duuma serĉo estas rekursiva?
Respondo: Jes. Ĉar binara serĉo estas ekzemplo de dividi kaj konkeri strategion kaj ĝi povas esti efektivigita uzante rekursion. Ni povas dividi la tabelon en duonojn kaj voki la saman metodon por plenumi la binaran serĉon denove kaj denove.
Q #5) Kial oni nomas ĝin binara serĉo?
Respondo: La binara serĉalgoritmo uzas strategion dividi kaj konkeri, kiu plurfoje tranĉas la tabelon en duonojn aŭ du partojn. Tiel ĝi estas nomita kiel duuma serĉo.
Konkludo
Duma serĉo estas la ofte uzata serĉtekniko en Java. La postulo por ke duuma serĉo estu farita estas ke la datumoj estu ordigitaj en pligranda ordo.
Duuma serĉo povas estiefektivigita aŭ uzante ripetan aŭ rekursieman aliron. Arrays-klaso en Java ankaŭ disponigas la 'binarySearch'-metodon kiu faras binaran serĉon sur Tabelo.
En niaj postaj lerniloj, ni esploros diversajn Ordigteknikojn en Java.