TGViewer
Артём Рыбин | Мэйби Артём Рыбин | Мэйби @maybe_digital · 250 subscribers
Post #63 245
DFS (Depth-First Search) или поиск в глубину

Основные применения метода поиска в глубину:
- Обнаружение компонента связанности в графе (связи в неориентированных графах)
- Проверка наличия циклов
- Топологическая сортировка
- Поиск путей
- Решение задач на генерацию лабиринтов, перестановок и комбинаций
- Решение задач на поиск оптимальной стратегии

Алгоритм:
1.    Начинаем с определения начальной вершины.
2.    Помещаем начальную вершину в стек и отмечфем ее как посещенную.
3.    Пока стек не пуст, извлекаем вершину из стека.
4.    Проверяем всех соседей текущей вершины. Если сосед еще не был посещен, помещаем его в стек и отмечаем как посещенный.
5.    Повторяйте этот процесс, пока не будет достигнута конечная вершина или пока не будут исследованы все доступные ветви.

Временная сложность: O(V + E)
- V — количество вершин (узлов) в графе.
- E — количество рёбер (или связей) в графе.
Пространственная сложность: O(V)


Пример: Найти путь от начальной вершины до целевой вершины в графе.
package main
 
import (
      "fmt"
)
 
type Graph struct {
      Nodes map[string][]string
}
 
func NewGraph() *Graph {
      return &Graph{
            Nodes: make(map[string][]string),
      }
}
 
func (g *Graph) AddEdge(src, dest string) {
      g.Nodes[src] = append(g.Nodes[src], dest)
      g.Nodes[dest] = append(g.Nodes[dest], src) // для ненаправленного графа
}
 
func DepthFirstSearch(graph *Graph, start, target string) []string {
      visited := make(map[string]bool)
      stack := []string{start}
      visited[start] = true
 
      for len(stack) > 0 {
            node := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
 
            if node == target {
                  return stack // Возвращаем стек, содержащий путь от начальной до целевой вершины
            }
 
            for _, neighbor := range graph.Nodes[node] {
                  if !visited[neighbor] {
                        stack = append(stack, neighbor)
                        visited[neighbor] = true
                  }
            }
      }
 
      return nil // Целевая вершина не достижима
}
More from @maybe_digital
  1. Sep 22, 2026Ну что, возвращаемся в медиа пространство Новый выпуск из серии подкастов «От кода к бизне…
  2. Sep 12, 2026А кто это у нас тут в отпуске смог пробиться на AI Cases Conf? Когда проект интересный - о…
  3. Sep 3, 2026Поговорили в ТГ и погнали на студию В сотый раз говорю, что безумно благодарен Олегу, за т…
  4. Aug 22, 2026Зашел к Олегу с идей сделать подкаст. В целом, аудиоверсия у нас есть
  5. Aug 21, 2026Не еду на конфу Сегодня общались с программным коммитетом и пришли к тому, что идея классн…
  6. Aug 20, 2026Сегодня был небольшой созвон утром, после которого получило письмо на почту Уважаемый Арте…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →