当前位置: 首页 > news >正文

深度优先搜索(DFS)和广度优先搜索(BFS)——c#实现

一、深度优先搜索(DFS)

原理

  • 沿着分支尽可能深入,直到到达叶子节点,然后回溯探索其他分支

  • 类似走迷宫时优先选择一条路走到黑,碰壁再回退

  • 数据结构:栈(Stack)或递归实现

  • 时间复杂度:O(V+E)(顶点数+边数)

  • // 递归实现(推荐)
    public void DFS(Node node, HashSet<Node> visited)
    {
        if (node == null || visited.Contains(node)) return;
        
        visited.Add(node);
        Console.Write(node.Value + " "); // 处理当前节点
        
        foreach (var neighbor in node.Neighbors)
        {
            DFS(neighbor, visited); // 递归访问相邻节点
        }
    }
    
    // 栈实现
    public void DFS_Stack(Node root)
    {
        var stack = new Stack<Node>();
        var visited = new HashSet<Node>();
        
        stack.Push(root);
        while (stack.Count > 0)
        {
            var current = stack.Pop();
            if (visited.Contains(current)) continue;
            
            visited.Add(current);
            Console.Write(current.Value + " ");
            
            // 注意:邻接节点要反向入栈(保持顺序)
            foreach (var neighbor in current.Neighbors.Reverse())
            {
                stack.Push(neighbor);
            }
        }
    }

    二、广度优先搜索(BFS)

    原理

  • 逐层向外扩展搜索,先访问离起点最近的节点

  • 类似水波纹扩散的效果

  • 数据结构:队列(Queue)

  • 时间复杂度:O(V+E)

  • public void BFS(Node root)
    {
        var queue = new Queue<Node>();
        var visited = new HashSet<Node>();
        
        queue.Enqueue(root);
        while (queue.Count > 0)
        {
            var current = queue.Dequeue();
            if (visited.Contains(current)) continue;
            
            visited.Add(current);
            Console.Write(current.Value + " ");
            
            foreach (var neighbor in current.Neighbors)
            {
                queue.Enqueue(neighbor);
            }
        }
    }

    三、核心区别对比

    特性深度优先搜索(DFS)广度优先搜索(BFS)
    数据结构栈/递归队列
    空间复杂度O(h)(树高)O(w)(最大宽度)
    适用场景拓扑排序、连通性检测最短路径、层级遍历
    解的性质不一定最短路径保证找到最短路径(无权图)
    内存消耗通常较小可能较大(存储层级节点)

 DFS 应用:



// 深度优先生成迷宫
private void GenerateMaze(int x, int y)
{
    var current = Cells[x, y];
    current.Visited = true;
    
    var directions = GetRandomDirections(); // 随机方向
    foreach (var dir in directions)
    {
        // 递归深入相邻单元格
        if (CanMove(x, y, dir))
            GenerateMaze(newX, newY);
    }
}

 BFS 应用(路径查找优化):



// 广度优先查找最短路径
public List<Point> FindShortestPath(MazeCell start, MazeCell end)
{
    var queue = new Queue<MazeCell>();
    var visited = new HashSet<MazeCell>();
    var parentMap = new Dictionary<MazeCell, MazeCell>();
    
    queue.Enqueue(start);
    while (queue.Count > 0)
    {
        var current = queue.Dequeue();
        if (current == end) break;
        
        foreach (var neighbor in GetAccessibleNeighbors(current))
        {
            if (!visited.Contains(neighbor))
            {
                parentMap[neighbor] = current;
                queue.Enqueue(neighbor);
                visited.Add(neighbor);
            }
        }
    }
    return ReconstructPath(parentMap, end);
}

五、选择依据
需要最短路径 → 选BFS(如迷宫求解)

内存敏感/深度优先特性 → 选DFS(如迷宫生成)

层级关系分析 → 选BFS(如社交网络层级分析)

存在性验证 → 两者均可(如节点是否可达)

两种算法在您的迷宫项目中可以配合使用:DFS生成随机迷宫,BFS寻找最优路径,这正是大多数迷宫算法的经典实现方式。

相关文章:

  • 如何验证邮件列表的有效性?
  • 从高资源到低资源语言的全覆盖:Manus AI的数据革命与迁移学习策略
  • 计算机组成原理:进位计数制与进制转换
  • #9 【code】实现扩散模型的一个jupyter notebook
  • 二、Visual Studio2022配置OpenGL环境
  • CameraX学习2-关于录像、慢动作录像
  • 【单片机通信技术】STM32 HAL库 SPI主从机通过串口发送数据
  • MySQL表空间碎片原理和解决方案
  • [HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(2)实操部署
  • 基于PySide6的CATIA零件自动化着色工具开发实践
  • 导入 Excel 规则批量修改或删除 Excel 表格内容
  • 【SegRNN 源码理解】【今天不水文系列】编码器部分理解
  • 云曦春季开学考复现(2025)
  • Linux基础--进程管理
  • 博弈是达到均衡状态的简单理解
  • 【网络】HTTP协议、HTTPS协议
  • PyTorch系列教程:编写高效模型训练流程
  • go的grpc
  • 视觉 Yolov11 环境配置(GPU版)
  • 使用websocket,注入依赖service的bean为null
  • 小程序电商系统开发/seo服务内容
  • 上海做网站哪家好/培训心得
  • PK10如何自己做网站/怎样推广自己的店铺啊
  • 怎么看网站后台什么语言做的/武汉seo首页优化技巧
  • 青海做网站最好的公司/seo关键词推广价格
  • 网站开发怎样实现上传视频教程/软件开发培训机构