3.6 KiB
#алгоритмы #поиск
Эффективность O(n) = n
Поиск в ширину работает с графами, позволяет найти кратчайшее расстояние между двумя объектами. Поиск в ширину является алгоритмом обхода; это значит, что он посещает каждый узел дерева («обходит» его). Этот алгоритм находит путь с минимальным количеством сегментов.
Отвечает на вопросы 2 типов:
- существует ли путь от узла А к узлу В?
- как выглядит кратчайший путь от узла А к узлу В?
Связи первого уровня предпочтительнее связей второго уровня, связи второго уровня предпочтительнее связей третьего уровня и т.д. Отсюда следует, что поиск по узлам второго уровня не должен производиться, пока вы не будете полностью уверены в том, что среди связей первого уровня нет ни подходящего элемента. Также можно объяснить это иначе: связи первого уровня добавляются в Очередь (Queue) поиска раньше связей второго уровня.
Эффективность
Если поиск искомого был выполнен по всей сети, значит, вы прошли
по каждому ребру. Таким образом, время выполнения составляет как минимум О(количество\_ребер).
Также в программе должна храниться очередь поиска. Добавление одного
элемента в очередь выполняется за постоянное время: О(1) . Выполнение
операции для каждого человека потребует суммарного времени О(количество\_элементов).
Поиск в ширину выполняется за время О(количество\_элементов+количество\_ребер), что обычно записывается в форме O(V+E), где ($V$-количество вершин , Е - количество ребер).
const breadthFirstSearch = (graph, start, end) => {
const queue = graph[start];
const checked = [];
let lastLevelElement = queue[queue.length - 1];
let level = 1;
while (queue.length) {
const candidate = queue.shift();
if (candidate === end) {
return level;
}
if (checked.includes(candidate)) {
continue;
}
queue.push(...(graph[candidate] || []));
if (candidate === lastLevelElement) {
lastLevelElement = queue[queue.length - 1];
level += 1;
}
}
return -1;
}
const graph = {
a: ['b', 'c', 'd'],
b: ['e', 'f'],
d: ['e', 'g'],
c: ['j', 'k']
}
breadthFirstSearch(graph, 'a', 'g'); // 2
breadthFirstSearch(graph, 'a', 'm'); // -1
Связаные темы:
Источники:

