Base/Knowledges/IT/Алгоритмы/Поиск/Поиск в ширину (Breadth-first search).md
2026-02-23 19:52:05 +03:00

3.6 KiB
Raw Permalink Blame History

#алгоритмы #поиск

!0_HN6Tr71sgf1qR70n.gif

Эффективность 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

!Pasted image 20250113103049.png

Связаные темы:

Источники: