Прејди на содржината

BFS

Од Википедија — слободната енциклопедија

Во теоријата на графови, breadth-first search (BFS) е стратегија за пребарување во граф кога пребарувањето е ограничено со две операции: (а) посетување и испитување на јазол во граф; (б) добивање пристап за посета на соседните јазли на моментално посетениот јазол. BFS започнува од коренот и ги испитува сите соседни јазли. Потоа за секој од тие јазли, ги посетува нивните соседни јазли кои не се откриени, и така натаму.

Како работи

[уреди | уреди извор]

ВFS e неинформиран начин на пребарување којшто се стреми да се прошири и да ги испита сите јазли од некој граф или комбинација на секвенци преку систематизирано пребарување низ секое решение. Со други зборови, исцрпно го пребарува цел граф или секвенца без оглед на некоја цел сè додека не ја пронајде.. Од гледна точка на алгоритмот, сите под-јазли добиени преку проширувањето на еден јазол се додадени на FIFO (First In, First Out) барање. Во типичната имплементација, јазлите којшто сè уште не се испитани за нивни соседни јазли се сместени во некој контејнер (како барање или поврзана листа) која што е наречена „отворена“ и веднаш од кога ќе се испита се става во контејнер наречен „затворен контејнер“.

Алгоритам

[уреди | уреди извор]

Алгоритамот користи квота(queue) податочна структура за да ги складира резултатите додека се движи низ графот:

1. Поставување на коренот во квотата 2. Отстранување на јазол од квотата

  • Ако бараниот елемент е пронајден во јазолот, заврши го пребарувањето и врати резултат.
  • Инаку поставиги сите наследници во квотата кои не се откриени.

3. Ако квотата е празна, тогаш секој јазол е посетен - завршиго пребарувањето и врати резултат „Не е пронајден“. 4. Ако квотата не е празна, повтори го вториот чекор.

Псевдокод

[уреди | уреди извор]

Влез : Граф G и корен v od G

1  procedure BFS(G,v):
2      create a queue Q
3      enqueue v onto Q
4      mark v
5      while Q is not empty:
6          t ← Q.dequeue()
7          if t is what we are looking for:
8              return t
9          for all edges e in G.incidentEdges(t) do
10             o ← G.opposite(t,e)
11             if o is not marked:
12                  mark o
13                  enqueue o onto Q

Особености

[уреди | уреди извор]

Комплексност на простор

[уреди | уреди извор]

Кога одреден број на темиња од графот се познати однапред и дополнителните структури на податоци се искористени за да се утврди кој темиња се веќе додадени во редот, комплексноста на простор може се прикажи како каде што е кардиналност на множеството од темиња

Време на извршување

[уреди | уреди извор]

Времето на извршување може да се прикажи како сè додека секое теме и секој раб ќе бидат истражени и во најлош случај. Забелешка: може да варира помеѓу и , во зависност од познатите проценки на бројот на рабови во еден граф.

Breadth-first search може да се користи за да реши многу проблеми во теоријата на графови, на пример: Наоѓање на сите јазли во една поврзана компонента. Пронаоѓање на најкраток пат помеѓу два јазли u и v (мерна единица бројот на рабови) Серијализација/Десеријализација на бинарно дрво vs серијализација во подреден редослед, овозможувајќи ефикасно реконструирање на дрвото.

Пронаоѓање поврзани компоненти

[уреди | уреди извор]

Множеството на јазли постигнати од BFS (breadth-first search) ја формираат поврзаната компонента која го содржи почетниот јазол(коренот).

Тестирање бипартитност во граф

[уреди | уреди извор]

Бипартитното својство на еден граф ја означува неговата можност секое теме да биде обоено во една од две бои, така што не постојат две соседни темиња со иста боја. Користејќи BFS пребарување почнувајќи од секое теме, односно од едно теме во секоја компонента, и боејќи го секое следно соседно теме во обратна боја, може на лесен начин да се провери дали одреден град е бипартитен.

  • Knuth, Donald E. (1997), The Art Of Computer Programming Vol 1. 3rd ed., Boston: Addison-Wesley, ISBN 0-201-89683-4