PHP

Чем отличается BFS от DFS

BFS (Breadth-First Search, поиск в ширину):

BFS использует очередь для отслеживания узлов, которые следует посетить. Это означает, что BFS начинает обход с корневого узла и посещает узлы в порядке их добавления в очередь (сначала ближайшие узлы, затем дальнейшие).

<?php

declare(strict_types=1);

function bfs(array $graph, string $startNode): array
{
    $visited = [];
    $queue = new SplQueue();

    $queue->enqueue($startNode);

    while (!$queue->isEmpty()) {
        $node = $queue->dequeue();

        if (!in_array($node, $visited)) {
            $visited[] = $node;

            foreach ($graph[$node] as $neighbor) {
                $queue->enqueue($neighbor);
            }
        }
    }

    return $visited;
}

$graph = [
  'A' => ['B', 'C'],
  'B' => ['A', 'D', 'E'],
  'C' => ['A', 'F'],
  'D' => ['B'],
  'E' => ['B', 'F'],
  'F' => ['C', 'E'],
];

print_r(bfs($graph, 'A'));

 

2 DFS (Depth-First Search, поиск в глубину):

DFS использует стек для отслеживания узлов, которые следует посетить. Это означает, что DFS начинает обход с корневого узла и посещает узлы в порядке их добавления в стек (сначала дальнейшие узлы, затем ближайшие).

<?php

declare(strict_types=1);

function dfs(array $graph, string $startNode): array
{
    $visited = [];
    $stack = new SplStack();

    $stack->push($startNode);

    while (!$stack->isEmpty()) {
        $node = $stack->pop();

        if (!in_array($node, $visited)) {
            $visited[] = $node;

            foreach ($graph[$node] as $neighbor) {
                $stack->push($neighbor);
            }
        }
    }

    return $visited;
}

$graph = [
  'A' => ['B', 'C'],
  'B' => ['A', 'D', 'E'],
  'C' => ['A', 'F'],
  'D' => ['B'],
  'E' => ['B', 'F'],
  'F' => ['C', 'E'],
];

print_r(dfs($graph, 'A'));

 

Обратите внимание, что в этих примерах используется объект SplQueue для реализации очереди в BFS и объект SplStack для реализации стека в DFS. Эти объекты являются частью стандартной PHP библиотеки (SPL).

 

Жизненные ситуации где может быть полезно BFS или DFS

BFS (Breadth-First Search, поиск в ширину) и DFS (Depth-First Search, поиск в глубину) используются в различных приложениях, в зависимости от конкретной проблемы, которую они решают. Вот некоторые жизненные сценарии, где они могут быть полезны:

  1. Социальные сети: BFS может быть использован для поиска друзей друзей на социальной сети. Например, если вы хотите увидеть всех друзей вашего друга и друзей ваших друзей, BFS будет подходящим алгоритмом, так как он начинает поиск с ближайшего уровня и переходит к следующему уровню только после того, как все узлы на текущем уровне были посещены.

  2. Web Crawling: Поисковые системы, такие как Google, используют алгоритмы, похожие на BFS, для индексации веб-страниц. Они начинают с одной страницы, затем переходят на все связанные страницы, затем переходят на страницы, связанные со связанными страницами, и так далее.

  3. GPS навигация: BFS также может использоваться для поиска кратчайшего пути от одной точки к другой на карте, представленной в виде графа, где узлы представляют собой местоположения, а ребра представляют собой пути между ними.

  4. Маршрутизация в сетях: Протоколы маршрутизации в сетях компьютеров, такие как OSPF, используют алгоритмы, похожие на BFS, чтобы определить наиболее эффективный путь для передачи данных от одной точки к другой.

С другой стороны, DFS может быть полезен в следующих сценариях:

  1. Решение пазлов: DFS может использоваться для решения таких пазлов, как лабиринты или головоломки на основе графа. Он ищет решение, углубляясь в каждую ветвь графа до тех пор, пока не найдет решение или не достигнет конца ветви.

  2. Планирование пути: DFS также может использоваться для планирования пути в ситуациях, когда цель состоит в том, чтобы посетить каждую точку на графе. Например, если вы хотите посетить каждую комнату в здании, DFS может помочь вам спланировать маршрут, чтобы вы не прошли через одну и ту же комнату дважды.

  3. Парсинг кода: DFS используется в компиляторах и интерпретаторах для анализа (или парсинга) кода. Он обходит абстрактное синтаксическое дерево (представление структуры кода) от вершины до листьев, применяя правила грамматики.

 

 

Афоризм дня:
Надежда выздороветь – половина выздоровления. (511)

Leave a reply