LearnToCP
Prijavi se
Navigacija
PočetnaRoad-mapaProblemiO Nama
Teorija
Takmičarsko Znanje
Izbor Radnog Okruženja (IDE)Interaktivni ZadaciOutput-only Zadaci
Osnove
Tvoj Prvi ProgramTipovi podataka, Unos i IzlazC++ sintaksaModuloFunkcijeVektoriMatriceVremenska Složenost Algoritma
Sortiranje
SortiranjeSortiranje PrebrojavanjemRadix Sort
Tehnike Optimizacije
Dva PokazivačaZbir brojeva od 1 do nZbir PrefiksaBinarna PretragaPohlepni AlgoritmiFunkcije Binarne PretrageBinarna Pretraga po RešenjuPodeli, pa Vladaj
Binarni Brojevi
Binarni BrojeviBrojevi u koduOperacije nad BitovimaBitmaske
Matematika
Binarno StepenovanjeProsti BrojeviRastavljanje na proste činioceNZD i NZSEratostenovo SitoModifikovano Sito
Strukture Podataka
Niske (Stringovi)StekRedMapeSkupovi (Set)Red sa PrioritetomKorišćenje Proizvoljnih KriterijumaSegmentna StablaFenvikova StablaSparse TabeleDisjunktni SkupoviSqrt Dekompozicija
Kombinatorika
Pravilo SabiranjaPravilo MnoženjaKombinatorni ObjektiPrincip Uključenja Isključenja
Geometrija
Osnove GeometrijeVektoriVektorski i Skalarni ProizvodLinijePoligoniUgloviTačka u PoligonuRastojanja i Tačke PresekaKonveksni OmotačKrugovi
Rekurzija
PokazivačiRekurzijaGenerisanje Kombinatornih Objekata
Dinamičko Programiranje
O DP-uDP problemiDP nad StablimaDP nad BitmaskamaDP nad brojevima
Teorija Grafova
GrafoviDFS i BFSNajkraći PuteviStablaTopološko SortiranjeDajkstrin AlgoritamMinimalna Razapinjuća StablaAlgoritmi Najkraćih Puteva
Napredna Teorija Grafova
Dvostruka PovezanostJako Povezane KomponenteBipartitni GrafMaksimalni Protok u GrafuFord-Fulkersonov AlgoritamDualnost Protoka i Minimalnog PresekaTeško-Laka DekompozicijaCentroidna Dekompozicija
Napredne Strukture Podataka
2D i 3D Segmentna StablaLenjo PropagiranjeImplicitna Segmentna StablaPerzistentna Segmentna StablaNajbliži Zajednički PredakTrieBalansirana Binarna Stabla PretrageMoov Algoritam

Funkcije Binarne Pretrage

U ovoj lekciji upoznaćemo se sa ugrađenim funkcijama binarne pretrage

Iako je veoma važno razumeti kako algoritam binarne pretrage radi, kada nam treba njegova najosnovnija verzija, i brže i pametnije je koristiti ugrađene funkcije

Postoje tri takve funkcije, i baš kao sort(), primaju opseg a.begin(), a.end() i rade samo kada je niz sortiran.

binary_search

Kod: binary_search(a.begin(), a.end(), k)

Ova verzija vraća true ako k postoji u nizu, false u suprotnom.

lower_bound

Ovo je funkcija koju ćeš najviše koristiti.

Kod: lower_bound(a.begin(), a.end(), k)

Ova verzija pronalazi prvi element koji je >= k.

Zanimljivo je to što ne vraća indeks, već pokazivač (istu vrstu stvari kao a.begin()). Da bismo ga pretvorili u indeks, oduzimamo početak niza:

int i = lower_bound(a.begin(), a.end(), k) - a.begin();

Zamisli to kao kućne brojeve, pokazivač je adresa kuće. a.begin() je početak ulice, pa je njihova razlika kućni broj.

upper_bound

Kod: upper_bound(a.begin(), a.end(), k)

Skoro je ista kao i lower_bound, ali pronalazi prvi element koji je strogo veći od k ( >k ).

Evo primera kako rade za vrednost 3 u nizu ispod, lower_bound pokazuje na početak trojki, a upper_bound na mesto odmah posle njihovog kraja.

indeks 0 1 2 3 4 5
vrednost 1 3 3 5 8 10
lower_bound upper_bound
Sortiran niz 1 3 3 5 8 10 sa lower_bound na indeksu 1 gde blok trojki počinje i upper_bound na indeksu 3 odmah iza njegovog kraja, pa je njihova razlika 2 broj pojavljivanja trojke

To nam otkriva koristan trik - broj pojavljivanja vrednosti k je prosto upper_bound - lower_bound (veličina tog bloka)!

Sve tri funkcije rade u vremenskoj složenosti O(log n) po pozivu.

Elementi kojih nema u nizu?

Kada nijedan element ne zadovoljava uslov, obe funkcije vraćaju a.end() - jednu poziciju iza poslednjeg elementa. Tako da je indeks koji dobijemo jednak a.size().

Uvek proveri ovaj slučaj pre nego što iskoristiš rezultat kao indeks. if(i == a.size()) znači "nije pronađeno", a čitanje a[i] će izazvati grešku!

Za kraj

Većina zadataka koji koriste binarnu pretragu u rešenju će ili zahtevati posebnu funkciju (kao što smo radili u ranijoj lekciji), ili će zahtevati lower_bound() za pronalaženje određenog indeksa. Zato je važno poznavati je.