Přejít na hlavní obsah

Binární vyhledávání v poli - jak funguje, principy a účinnost

Binární vyhledávání je účinný algoritmus pro nalezení prvku v seřazeném poli. Představuje oblíbený přístup používaný v informatice k rychlému vyhledávání informací, které potřebujete. Základem binárního vyhledávání je princip rozdělení seřazeného pole na polovinu a následné srovnání hodnoty průměrného prvku s cílovou hodnotou.

Časová složitost binárního vyhledávání je O (log n), díky čemuž je výrazně rychlejší než jednoduché lineární vyhledávání. Díky tomuto algoritmu mohou vývojáři a inženýři rychle najít informace v obrovském množství dat. V některých případech může být binární vyhledávání tak účinné, že vám umožní pracovat s miliardami prvků v sledovaném čase.

Pro efektivní využití binárního vyhledávání je však nutné řadit pole. Před použitím algoritmu je proto nutné zajistit, aby byla data uspořádána v požadovaném pořadí. Binární vyhledávání také naznačuje, že pole je uspořádáno vzestupně nebo sestupně, spíše než aby obsahovalo duplicitní prvky. V opačném případě může být výsledek práce algoritmu nesprávný.

Co je binární vyhledávání?

Binární vyhledávání má běhovou dobu O (log n), kde n je velikost pole. Z tohoto důvodu se algoritmus často používá k vyhledávání ve velkém množství dat. Může být také aplikován na různé datové struktury, včetně seznamů a stromů, pokud jsou data v nich seřazena.

Princip binárního vyhledávání je založen na rozdělení pole na polovinu a porovnání požadované hodnoty se středovým prvkem. Pokud se hodnoty shodují, hledání končí. Pokud je hledaná hodnota menší než střední prvek, proces se opakuje pro levou polovinu pole. Pokud je hledaná hodnota větší než střední prvek, proces se opakuje pro pravou polovinu pole. Tento proces pokračuje, dokud nebude nalezena hledaná hodnota nebo dokud nebude pole plně zkontrolováno.

Jakmile binární vyhledávání najde hledanou hodnotu, vrátí její index do pole. Pokud není nalezena žádná hodnota, algoritmus vrátí speciální hodnotu, obvykle -1, aby určil, že hodnota v poli chybí.

Binární vyhledávání je jedním ze základních algoritmů v programování a je široce používáno v různých oblastech, včetně vyhledávání v databázích, vědeckých výpočtů a algoritmů strojového učení.

Princip binárního vyhledávání

Princip binárního vyhledávání je následující:

  1. Nastavuje se uspořádané datové pole.
  2. Jsou definovány hranice vyhledávání-počáteční a koncové indexy pole.
  3. Nachází se středový prvek pole.
  4. Porovnává hledaný prvek se středovým prvkem:
    • Pokud se hledaný prvek rovná centrálnímu, je hledání dokončeno-prvek nalezen.
    • Pokud je hledaný prvek menší než střed, hledání pokračuje v levé polovině pole, jinak v pravé.
  5. Hranice vyhledávání se podle výsledku srovnání zužují:
    • Pokud je hledaný prvek menší než střed, horní hranice se posune na pozici středu mínus jedna, jinak-spodní hranice se posune na pozici středu plus jedna.
  6. Proces se opakuje, dokud není nalezen hledaný prvek nebo dokud se hranice vyhledávání nesestaví.

Binární vyhledávání je ideální pro práci s velkými seřazenými datovými poli, protože jeho složitost je O(log n), kde n je velikost pole. Tato účinnost je dosažena tím, že v každé iteraci vyhledávání se velikost vyhledávacího prostoru sníží přibližně na polovinu.

Výhody binárního vyhledávání

VýhodaPopis
ÚčinnostBinární vyhledávání se provádí většinou během o (log n), kde n je velikost pole. Díky tomu je výrazně rychlejší než jednoduché lineární vyhledávání.
UniverzálnostBinární vyhledávání lze použít na jakékoli seřazené pole bez ohledu na jeho typ dat. Funguje jak pro číselné hodnoty, tak pro řetězce nebo vlastní objekty.
Snadná implementaceBinární vyhledávací algoritmus je poměrně snadno implementovatelný a nevyžaduje složité datové struktury ani speciální operace.
Minimální počet srovnáníBinární vyhledávání snižuje počet srovnání tím, že umožňuje vyloučit polovinu prvků pole v každém kroku najednou. To je zvláště užitečné, když je pole velké nebo počet operací omezený, například ve vestavěných systémech.
Odolnost vůči změnámBinární vyhledávání nezávisí na pořadí prvků v poli. I když je pole seřazeno obráceně, algoritmus bude stále fungovat správně.

Všechny tyto výhody činí binární vyhledávání nepostradatelným nástrojem při práci s seřazenými poli. Umožňuje efektivně a rychle najít požadované položky a také usnadňuje řešení řady problémů souvisejících s vyhledáváním a filtrováním dat. Použití binárního vyhledávání se doporučuje zejména v případech, kdy výkon a účinnost algoritmu hrají důležitou roli.

Jak mohu použít binární vyhledávání v poli?

Chcete-li použít binární vyhledávání v poli, postupujte podle těchto kroků:

  1. Ujistěte se, že pole je seřazeno ve vzestupném nebo sestupném pořadí.
  2. Nastavte počáteční hodnoty pro proměnné low a high jsou indexy počátečních a koncových prvků pole.
  3. Vypočítejte střed pole jako součet low a high dělený polovinou.
  4. Porovnejte hodnotu středového prvku s hledanou hodnotou.
  5. Pokud se středová položka rovná vyhledané hodnotě, vraťte její index do pole.
  6. Pokud je střední prvek menší než požadovaná hodnota, aktualizujte hodnotu low přiřazením hodnoty mid + 1.
  7. Pokud je střední prvek větší než požadovaná hodnota, aktualizujte hodnotu high a přiřaďte jí hodnotu mid - 1.
  8. Opakujte kroky 3-7, dokud nebude low větší než high, v takovém případě není položka nalezena a hledání je dokončeno.

Binární vyhledávání umožňuje najít prvek v poli rychleji než lineární vyhledávání, zejména při práci s velkými poli. Je jedním z hlavních vyhledávacích algoritmů a je široce používán v programování k řešení různých problémů.

Příklad použití binárního vyhledávání s seřazeným polem

Vezměme si jako příklad následující pole celých čísel:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

Předpokládejme, že musíme najít hodnotu 11 V tomto poli pomocí binárního vyhledávání.

Kroky provádění binárního vyhledávání:

  1. Nastavte počáteční index pole-low na 0 a konečný index je high , který se rovná délce pole mínus jeden.
  2. Získejte střední index pole-mid vydělením součtu Low a high dvěma.
  3. Porovnejte hledanou hodnotu s prvkem pole umístěným v indexu mid . Pokud jsou stejné, hodnota je nalezena a vrací se index mid .
  4. Pokud je hledaná hodnota větší než položka podle indexu mid, aktualizujte hodnotu low na mid + 1 a opakujte kroky 2 až 4.
  5. Pokud je hledaná hodnota menší než položka podle indexu mid , aktualizujte hodnotu high na mid - 1 a opakujte kroky 2 až 4.
  6. Pokud se v poli nenajde hledaná hodnota, vrátí se hodnota -1.

Použijeme-li tyto kroky k našemu příkladu, získáme následující sekvenci akcí:

  1. low = 0, high = 9, mid = (0 + 9) / 2 = 4 . Porovnáme hodnotu 11 s prvkem pole podle indexu 4 (hodnota 9). Hledaná hodnota je větší, takže aktualizujeme low = 5 .
  2. low = 5, high = 9, mid = (5 + 9) / 2 = 7 . Porovnáme hodnotu 11 s prvkem pole podle indexu 7 (hodnota 15). Hledaná hodnota je menší, takže aktualizujeme high = 6 .
  3. low = 5, high = 6, mid = (5 + 6) / 2 = 5 . Porovnáme hodnotu 11 s prvkem pole podle indexu 5 (hodnota 11). Hledaná hodnota byla nalezena, vracíme index 5 .

Takže jsme našli hodnotu 11 v seřazeném poli a dostali jsme její index - 5 .

Příklad použití binárního vyhledávání se zvětšujícím se polem

Myšlenka je následující: začínáme malým polem, které stačí k provádění binárního vyhledávání. Pokud prvek není nalezen, zvětšíme velikost pole a opakujeme vyhledávání. Proces pokračuje, dokud není prvek nalezen nebo dokud není pole zcela zaplněno.

Vezměme si příklad použití binárního vyhledávání se zvětšujícím se polem. Ať máme uspořádané pole celých čísel:

const array = [2, 3, 5, 7, 10, 12, 15, 18, 20];

Chceme najít pozici čísla 15 v poli. K tomu použijeme binární vyhledávání se zvětšujícím se polem. Začněme malým polem z prvních dvou prvků:

const smallArray = [2, 3];let left = 0;let right = smallArray.length - 1;while (left else if (smallArray[middle] < 15) else if (left > right && right === smallArray.length - 1) >

Původně jsme měli pole [2, 3]. Při provádění binárního vyhledávání zvětšujeme jeho velikost přidáním dalšího prvku z původního pole. V tomto případě je to číslo 5. Poté pokračujeme v hledání a pole znovu zvětšíme přidáním čísla 7. Nakonec, při hledání čísla 15, bude naše pole vypadat [2, 3, 5, 7]. V poslední iteraci bude hledání čísla 15 úspěšné a dostaneme pozici čísla v poli.

Binární vyhledávání se zvětšujícím se polem vám umožňuje efektivně vyhledávat položky v polích neznámé velikosti předem. Je to jeden z výkonných nástrojů při práci s velkými datovými sadami.

Složitost binárního vyhledávacího algoritmu

Pokud se střední prvek rovná hledanému prvku, je hledání úspěšné a my vrátíme pozici tohoto prvku do pole. Pokud je střední prvek menší než hledaný prvek, aktualizujeme levou hranici vyhledávání na pozici napravo od střední položky a proces opakujeme. Pokud je střední prvek větší než hledaný prvek, aktualizujeme pravou hranici vyhledávání na pozici nalevo od střední položky a proces opakujeme.

Složitost binárního vyhledávacího algoritmu je O (log n), kde n je velikost pole. To znamená, že doba provádění algoritmu roste pomalu se zvětšením velikosti pole. Binární vyhledávání je velmi účinné pro velká seřazená pole, protože snižuje počet srovnání, která je třeba provést k nalezení prvku.

Za zmínku také stojí, že binární vyhledávací algoritmus vyžaduje, aby bylo pole seřazeno. Pokud pole není seřazeno, je nutné před použitím binárního vyhledávání provést třídění, což může trvat déle.

Časová náročnost

Při provádění binárního vyhledávání musí být pole předem seřazeno. Pokud tedy pole není tříděno, je nutné provést další operace k jeho třídění, což také zabere další čas.

Obtížnost o (log n) je velmi dobrá, zejména při práci s velkými poli. Binární vyhledávání umožňuje najít prvek v poli za relativně malý počet operací, i když pole má miliony prvků.

Níže uvedená tabulka ukazuje srovnání časové složitosti binárního vyhledávání s dalšími populárními vyhledávacími algoritmy:

AlgoritmČasová náročnost
Lineární vyhledáváníO(n)
Binární vyhledáváníO(log n)
Fibonacciev hledáníO(log n)
Interpolační vyhledáváníO(log log n)

Jak je vidět z tabulky, doba provádění binárního vyhledávání je výrazně kratší než u lineárního vyhledávání a je dosaženo efektivnějším zmenšením vyhledávacího prostoru dělením pole na polovinu v každé iteraci.