Tento tutoriál vysvetľuje binárne vyhľadávanie & Rekurzívne binárne vyhľadávanie v jazyku Java spolu s jeho algoritmom, implementáciou a príkladmi kódu binárneho vyhľadávania v jazyku Java:
Binárne vyhľadávanie v jazyku Java je technika, ktorá sa používa na hľadanie cieľovej hodnoty alebo kľúča v kolekcii. Je to technika, ktorá na hľadanie kľúča používa techniku "rozdeľ a panuj".
Kolekcia, na ktorú sa má použiť binárne vyhľadávanie na hľadanie kľúča, musí byť zoradená vzostupne.
Väčšina programovacích jazykov zvyčajne podporuje techniky lineárneho vyhľadávania, binárneho vyhľadávania a hashovania, ktoré sa používajú na vyhľadávanie údajov v kolekcii. Hashovanie sa naučíme v ďalších učebných textoch.
Binárne vyhľadávanie v jazyku Java
Lineárne vyhľadávanie je základná technika. Pri tejto technike sa pole prechádza postupne a každý prvok sa porovnáva s kľúčom, kým sa nenájde kľúč alebo sa nedosiahne koniec poľa.
Lineárne vyhľadávanie sa v praktických aplikáciách používa zriedkavo. Najčastejšie používanou technikou je binárne vyhľadávanie, pretože je oveľa rýchlejšie ako lineárne vyhľadávanie.
Java poskytuje tri spôsoby vykonávania binárneho vyhľadávania:
- Použitie iteračného prístupu
- Použitie rekurzívneho prístupu
- Použitie metódy Arrays.binarySearch ().
V tomto tutoriáli implementujeme a prediskutujeme všetky tieto 3 metódy.
Algoritmus pre binárne vyhľadávanie v jazyku Java
Pri metóde binárneho vyhľadávania sa kolekcia opakovane rozdelí na polovicu a kľúčový prvok sa hľadá v ľavej alebo pravej polovici kolekcie podľa toho, či je kľúč menší alebo väčší ako stredný prvok kolekcie.
Jednoduchý algoritmus binárneho vyhľadávania je nasledovný:
- Vypočítajte stredný prvok kolekcie.
- Porovnajte kľúčové položky so stredným prvkom.
- Ak je kľúč = stredný prvok, potom vrátime strednú pozíciu indexu pre nájdený kľúč.
- Inak Ak kľúč> stredný prvok, potom kľúč leží v pravej polovici kolekcie. Zopakujte teda kroky 1 až 3 na dolnej (pravej) polovici kolekcie.
- Else key <mid element, potom sa kľúč nachádza v hornej polovici kolekcie. Preto je potrebné zopakovať binárne vyhľadávanie v hornej polovici.
Ako vidíte z uvedených krokov, pri binárnom vyhľadávaní sa polovica prvkov v kolekcii ignoruje hneď po prvom porovnaní.
Všimnite si, že rovnaká postupnosť krokov platí pre iteračné aj rekurzívne binárne vyhľadávanie.
Ilustrujme algoritmus binárneho vyhľadávania na príklade.
Vezmite si napríklad nasledujúce zoradené pole s 10 prvkami.
Vypočítajme strednú polohu poľa.
Mid = 0+9/2 = 4
#1) Kľúč = 21
Najprv porovnáme hodnotu kľúča s prvkom [mid] a zistíme, že hodnota prvku v strede = 21.
Zistíme teda, že kľúč = [mid]. Kľúč sa teda nachádza na pozícii 4 v poli.
#2) Kľúč = 25
Najskôr porovnáme hodnotu kľúča s hodnotou mid. Keďže (21 <25), budeme priamo hľadať kľúč v hornej polovici poľa.
Teraz opäť nájdeme stred pre hornú polovicu poľa.
Mid = 4+9/2 = 6
Hodnota v mieste [mid] = 25
Teraz porovnáme kľúčový prvok so stredným prvkom. Takže (25 == 25), a preto sme našli kľúč na mieste [mid] = 6.
Teda opakovane rozdeľujeme pole a porovnávaním kľúčového prvku so stredom sa rozhodujeme, v ktorej polovici budeme hľadať kľúč. Binárne vyhľadávanie je efektívnejšie z hľadiska času a správnosti a je aj oveľa rýchlejšie.
Implementácia binárneho vyhľadávania Java
Pomocou uvedeného algoritmu implementujme program na binárne vyhľadávanie v jazyku Java s použitím iteračného prístupu. V tomto programe vezmeme príklad poľa a vykonáme binárne vyhľadávanie na tomto poli.
import java.util.*; class Main{ public static void main(String args[]){ int numArray[] = {5,10,15,20,25,30,35}; System.out.println("Vstupné pole: " + 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 thearray int mid = (first + last)/2; //ak sa first a last neprekrývajú while( first <= last ){ //ak je mid <kľúč, potom kľúč, ktorý sa má hľadať, je v prvej polovici array if ( numArray[mid] last ){ System.out.println("Prvok nebol nájdený!"); } } } }
Výstup:
Vstupné pole: [5, 10, 15, 20, 25, 30, 35]
Kľúč, ktorý sa má hľadať=20
Prvok sa nachádza na indexe: 3
Uvedený program ukazuje iteračný prístup binárneho vyhľadávania. Na začiatku sa deklaruje pole, potom sa definuje kľúč, ktorý sa má vyhľadať.
Po výpočte stredu poľa sa kľúč porovná so stredným prvkom. Potom sa v závislosti od toho, či je kľúč menší alebo väčší ako kľúč, hľadá kľúč v dolnej, resp. hornej polovici poľa.
Rekurzívne binárne vyhľadávanie v jazyku Java
Binárne vyhľadávanie môžete vykonať aj pomocou techniky rekurzie. V tomto prípade sa metóda binárneho vyhľadávania volá rekurzívne, kým sa nenájde kľúč alebo sa nevyčerpá celý zoznam.
Program, ktorý implementuje rekurzívne binárne vyhľadávanie, je uvedený nižšie:
import java.util.*; class Main{ //rekurzívna metóda pre binárne vyhľadávanie public static int binary_Search(int int intArray[], int low, int high, int key){ //ak je pole v poriadku, potom vykonaj binárne vyhľadávanie na poli if (high>=low){ //vypočítaj mid int mid = low + (high - low)/2; //ak key =intArray[mid] return mid if (intArray[mid] == key){ return mid; } //ak intArray[mid]> key then key is in leftpolovica poľa if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//rekurzívne hľadanie kľúča }else //kľúč je v pravej polovici poľa { return binary_Search(intArray, mid+1, high, key);//rekurzívne hľadanie kľúča } } return -1; } public static void main(String args[]){ //definujte pole a kľúč int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputZoznam: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nVyhľadávaný kľúč:" + key); int high=intArray.length-1; //vyvolajte metódu binárneho vyhľadávania int result = binary_Search(intArray,0,high,key); //vypíšte výsledok if (result == -1) System.out.println("\nKey sa v danom zozname nenašiel!"); else System.out.println("\nKey sa v zozname nachádza na mieste: "+result + "); } }
Výstup:
Vstupný zoznam: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Kľúč, ktorý sa má hľadať:
Kľúč sa nachádza na mieste: 3 v zozname
Použitie metódy Arrays.binarySearch ().
Trieda Arrays v jazyku Java poskytuje metódu 'binarySearch ()', ktorá vykonáva binárne vyhľadávanie v danom poli. Táto metóda prijíma ako argumenty pole a kľúč, ktorý sa má vyhľadať, a vracia pozíciu kľúča v poli. Ak sa kľúč nenájde, metóda vráti hodnotu -1.
Nasledujúci príklad implementuje metódu Arrays.binarySearch ().
import java.util.Arrays; class Main{ public static void main(String args[]){ //definujte pole int intArray[] = {10,20,30,40,50,60,70,80,90}; System.out.println("Vstupné pole : " + Arrays.toString(intArray)); //definujte hľadaný kľúč int key = 50; System.out.println("\nHľadaný kľúč:" + key); //vyvolajte metódu binarySearch na danom poli s hľadaným kľúčom int result =Arrays.binarySearch(intArray,key); //vypíšte návratový výsledok if (result <0) System.out.println("\nKey sa nenachádza v poli!"); else System.out.println("\nKey sa nachádza na indexe: "+result + " v poli."); } }
Výstup:
Vstupné pole: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Kľúč, ktorý sa má hľadať:50
Kľúč sa nachádza na indexe: 4 v poli.
Často kladené otázky
Otázka č. 1) Ako napíšete binárne vyhľadávanie?
Odpoveď: Binárne vyhľadávanie sa zvyčajne vykonáva rozdelením poľa na polovice. Ak je hľadaný kľúč väčší ako stredný prvok, potom sa prehľadáva horná polovica poľa ďalším delením a prehľadávaním čiastkového poľa, kým sa kľúč nenájde.
Podobne, ak je kľúč menší ako stredný prvok, potom sa kľúč hľadá v dolnej polovici poľa.
Q #2) Kde sa používa binárne vyhľadávanie?
Odpoveď: Binárne vyhľadávanie sa používa najmä na vyhľadávanie zoradených údajov v softvérových aplikáciách, najmä ak je pamäťový priestor kompaktný a obmedzený.
Otázka č. 3) Čo je veľké O binárneho vyhľadávania?
Odpoveď: Časová zložitosť binárneho vyhľadávania je O (logn), kde n je počet prvkov v poli. Priestorová zložitosť binárneho vyhľadávania je O (1).
Q #4) Je binárne vyhľadávanie rekurzívne?
Odpoveď: Áno. Keďže binárne vyhľadávanie je príkladom stratégie rozdeľ a panuj a možno ho implementovať pomocou rekurzie. Môžeme rozdeliť pole na polovice a zavolať tú istú metódu na opakované binárne vyhľadávanie.
Q #5) Prečo sa nazýva binárne vyhľadávanie?
Odpoveď: Algoritmus binárneho vyhľadávania používa stratégiu rozdeľ a panuj, ktorá opakovane rozdeľuje pole na polovice alebo dve časti. Preto sa nazýva binárne vyhľadávanie.
Záver
Binárne vyhľadávanie je často používanou technikou vyhľadávania v jazyku Java. Požiadavkou na vykonanie binárneho vyhľadávania je, aby boli údaje zoradené vzostupne.
Binárne vyhľadávanie možno realizovať buď pomocou iteračného, alebo rekurzívneho prístupu. Trieda Arrays v jazyku Java poskytuje aj metódu 'binarySearch', ktorá vykonáva binárne vyhľadávanie na poli Array.
V našich ďalších tutoriáloch sa budeme venovať rôznym technikám triedenia v jazyku Java.