Tento výukový program vysvětluje binární vyhledávání & rekurzivní binární vyhledávání v jazyce Java spolu s jeho algoritmem, implementací a příklady kódu binárního vyhledávání v jazyce Java:
Binární vyhledávání v jazyce Java je technika, která se používá k vyhledávání cílové hodnoty nebo klíče v kolekci. Jedná se o techniku, která k vyhledávání klíče využívá techniku "rozděl a panuj".
Kolekce, na kterou se má použít binární vyhledávání pro hledání klíče, musí být seřazena vzestupně.
Většina programovacích jazyků obvykle podporuje techniky lineárního vyhledávání, binárního vyhledávání a hashování, které se používají k vyhledávání dat ve sbírce. V dalších výukových kurzech se budeme učit hashování.
Binární vyhledávání v jazyce Java
Základní technikou je lineární vyhledávání. Při této technice se postupně prochází pole a každý prvek se porovnává s klíčem, dokud se nenajde klíč nebo se nedosáhne konce pole.
Lineární vyhledávání se v praktických aplikacích používá jen zřídka. Nejčastěji používanou technikou je binární vyhledávání, protože je mnohem rychlejší než lineární vyhledávání.
Java nabízí tři způsoby binárního vyhledávání:
- Použití iteračního přístupu
- Použití rekurzivního přístupu
- Použití metody Arrays.binarySearch ().
V tomto výukovém kurzu implementujeme a probereme všechny tyto 3 metody.
Algoritmus pro binární vyhledávání v Javě
Při binárním vyhledávání se kolekce opakovaně rozdělí na poloviny a klíčový prvek se hledá v levé nebo pravé polovině kolekce podle toho, zda je klíč menší nebo větší než střední prvek kolekce.
Jednoduchý binární vyhledávací algoritmus je následující:
- Vypočítejte střední prvek kolekce.
- Porovnejte klíčové položky se středním prvkem.
- Pokud je klíč = prostřední prvek, vrátíme střední indexovou pozici nalezeného klíče.
- Jinak Jestliže klíč> prostřední prvek, pak klíč leží v pravé polovině kolekce. Opakujte tedy kroky 1 až 3 na dolní (pravé) polovině kolekce.
- Else key <mid element, pak se klíč nachází v horní polovině kolekce. Proto je třeba binární hledání v horní polovině opakovat.
Jak je vidět z výše uvedených kroků, při binárním vyhledávání je polovina prvků v kolekci ignorována hned po prvním porovnání.
Všimněte si, že stejná posloupnost kroků platí pro iterační i rekurzivní binární vyhledávání.
Ukažme si binární vyhledávací algoritmus na příkladu.
Vezměme například následující setříděné pole o 10 prvcích.
Vypočítejme střední polohu pole.
Mid = 0+9/2 = 4
#1) Klíč = 21
Nejprve porovnáme hodnotu klíče s prvkem [mid] a zjistíme, že hodnota prvku v mid = 21.
Zjistíme tedy, že klíč = [mid]. Klíč se tedy nachází na pozici 4 v poli.
#2) Klíč = 25
Nejprve porovnáme hodnotu klíče s hodnotou mid. Protože (21 <25), budeme hledat klíč přímo v horní polovině pole.
Nyní opět najdeme střed pro horní polovinu pole.
Mid = 4+9/2 = 6
Hodnota v místě [mid] = 25
Nyní porovnáme klíčový prvek s prostředním prvkem. Takže (25 == 25), tudíž jsme našli klíč v místě [mid] = 6.
Pole tedy opakovaně rozdělíme a porovnáním klíčového prvku s polovinou se rozhodneme, ve které polovině budeme hledat klíč. Binární hledání je efektivnější z hlediska času i správnosti a je také mnohem rychlejší.
Implementace binárního vyhledávání v jazyce Java
Pomocí výše uvedeného algoritmu implementujme program pro binární vyhledávání v jazyce Java s využitím iteračního přístupu. V tomto programu vezmeme příklad pole a provedeme binární vyhledávání 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)); //hledaný klíč int key = 20; System.out.println("\nKey to be searched=" + key); /nastavit první na první index int first = 0; /nastavit poslední na poslední prvky pole int last=numArray.length-1; //vypočítat střed polepole int mid = (first + last)/2; //zatímco first a last se nepřekrývají while( first <= last ){ //pokud je mid <klíč, pak hledaný klíč je v první polovině pole if ( numArray[mid] last ){ System.out.println("Prvek nenalezen!"); } } } }
Výstup:
Vstupní pole: [5, 10, 15, 20, 25, 30, 35]
Klíč k vyhledávání=20
Prvek se nachází na indexu: 3
Výše uvedený program ukazuje iterační přístup binárního vyhledávání. Na začátku je deklarováno pole, poté je definován klíč, který má být vyhledán.
Po výpočtu středu pole se klíč porovná se středovým prvkem. Poté se podle toho, zda je klíč menší nebo větší než klíč, hledá klíč v dolní, resp. horní polovině pole.
Rekurzivní binární vyhledávání v jazyce Java
Binární vyhledávání můžete provádět také pomocí techniky rekurze. Zde se metoda binárního vyhledávání volá rekurzivně, dokud není nalezen klíč nebo není vyčerpán celý seznam.
Program, který implementuje rekurzivní binární vyhledávání, je uveden níže:
import java.util.*; class Main{ //rekurzivní metoda pro binární vyhledávání public static int binary_Search(int int intArray[], int low, int high, int key){ //pokud je pole v pořádku, pak proveďte binární vyhledávání v poli if (high>=low){ //vypočítejte 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 leftpolovina pole if (intArray[mid]> key){ return binary_Search(intArray, low, mid-1, key);//rekurzivně hledat klíč }else //klíč je v pravé polovině pole { return binary_Search(intArray, mid+1, high, key);//rekurzivně hledat klíč } } return -1; } public static void main(String args[]){ //definovat pole a klíč int intArray[] = {1,11,21,31,41,51,61,71,81,91}; System.out.println("InputSeznam: " + Arrays.toString(intArray)); int key = 31; System.out.println("\nVyhledávaný klíč:" + key); int high=intArray.length-1; //vyvolat metodu binárního vyhledávání int result = binary_Search(intArray,0,high,key); //vypsat výsledek if (result == -1) System.out.println("\nKey nenalezen v daném seznamu!"); else System.out.println("\nKey nalezen na místě: "+result + " v seznamu"); } }
Výstup:
Vstupní seznam: [1, 11, 21, 31, 41, 51, 61, 71, 81, 91
Klíč, který je třeba hledat:
Klíč se nachází na místě: 3 v seznamu
Použití metody Arrays.binarySearch ().
Třída Arrays v jazyce Java poskytuje metodu 'binarySearch ()', která provádí binární vyhledávání v daném poli. Tato metoda přijímá jako argumenty pole a hledaný klíč a vrací pozici klíče v poli. Pokud klíč není nalezen, metoda vrací -1.
Níže uvedený příklad implementuje metodu 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 hledaný klíč int key = 50; System.out.println("\nHledaný klíč:" + key); //vyvolejte metodu binarySearch na daném poli s hledaným klíčem int result =Arrays.binarySearch(intArray,key); //vypište návratový výsledek if (result <0) System.out.println("\nKey není nalezen v poli!"); else System.out.println("\nKey je nalezen na indexu: "+result + " v poli."); } } }
Výstup:
Vstupní pole: [10, 20, 30, 40, 50, 60, 70, 80, 90]
Klíč k vyhledávání:50
Klíč se nachází na indexu: 4 v poli.
Často kladené otázky
Q #1) Jak se zapisuje binární vyhledávání?
Odpověď: Binární vyhledávání se obvykle provádí rozdělením pole na poloviny. Pokud je hledaný klíč větší než prostřední prvek, pak se prohledává horní polovina pole dalším dělením a prohledáváním dílčího pole, dokud není klíč nalezen.
Podobně, pokud je klíč menší než prostřední prvek, hledá se klíč v dolní polovině pole.
Q #2) Kde se používá binární vyhledávání?
Odpověď: Binární vyhledávání se používá především k vyhledávání setříděných dat v softwarových aplikacích, zejména pokud je paměťový prostor kompaktní a omezený.
Q #3) Jaký je velký O binárního vyhledávání?
Odpověď: Časová složitost binárního vyhledávání je O (logn), kde n je počet prvků v poli. Prostorová složitost binárního vyhledávání je O (1).
Q #4) Je binární vyhledávání rekurzivní?
Odpověď: Ano. Protože binární vyhledávání je příkladem strategie rozděl a panuj a lze jej implementovat pomocí rekurze. Můžeme pole rozdělit na poloviny a volat stejnou metodu, která binární vyhledávání provede znovu a znovu.
Q #5) Proč se nazývá binární vyhledávání?
Odpověď: Algoritmus binárního vyhledávání používá strategii rozděl a panuj, která opakovaně rozřezává pole na poloviny nebo dvě části. Proto se nazývá binární vyhledávání.
Závěr
Binární vyhledávání je často používanou technikou vyhledávání v jazyce Java. Podmínkou pro provedení binárního vyhledávání je, aby data byla seřazena vzestupně.
Binární prohledávání lze realizovat buď iterativním, nebo rekurzivním přístupem. Třída Arrays v jazyce Java poskytuje také metodu 'binarySearch', která provádí binární prohledávání pole.
V dalších tutoriálech se budeme zabývat různými technikami třídění v jazyce Java.