深搜和广搜的差别

前言

搜索算法有许多种,但用的最多的还是深搜和宽搜,不管是值找最短路径,还是找最优解,都能看到这两个的身影。下面就来详细看看这两个的不同于适用情况。

深搜

深搜,看名字就知道到是优先往深处找,不撞南墙终不悔。深搜,像是一个人走迷宫,遇见岔路不知道怎么走,就瞎选一个(程序中一搬从头遍历),走到底,不对,回到岔路口,选另一条路,接着走。

深搜的实现一般用栈或递归,不断深入。

深搜一般是为了找多个解,或者找解存不存在。但当数据量很大时,深搜效率不高,一般要结合其他优化算法。

伪代码:

dfs(要搜的点){
    将该点标记为已搜过
    if(终止条件){
        如果找存在路径,就退出
        如果找最短路径,就比较这个与最小值,回去接着找
    }
    else{
        case1{
            目标值变化
            dfs(case1);
            目标值恢复到原来  
        }
        case2 ...
        case3 ...
    }
}

深搜典型题:回溯法(八皇后问题)
需要设置一个数组判断该点有无被访问过

宽搜

宽搜全名宽度搜索,就是放宽了搜,就像是雷达那样,中间一个点不断放出电磁波,一圈一圈往外扩散,很容易就能发现目标,而且发现了必然就是最近的(最优解)。

宽搜的实现一般使用队列,不断扩散。

宽搜在寻找最短路径上效率很高,但相对占用的内存较大。

伪代码:

bfs(){
    初始点入列
    while(终止条件不满足 或 队列不为空){
        队列头出列
        从出列元素开始扩散,满足的就入列
        找个数组记下来目标值
    }
    找目标值
}

宽搜典型题:迷宫找最短路径,细菌的扩散

总结

深搜和宽搜都是搜索的主要方法,但由于两种算法都有其局限性,当数据量较大时,一般都不用这两种算法。

本文转载链接:https://blog.csdn.net/qq_39747794/article/details/84478771

图的度优先索(Depth First Search, DFS)广度优先索(Breadth First Search, BFS)是图的两种重要遍历方式。 度优先索(DFS)假设初始状态是图中所有顶点均未被访问,从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发度优先索遍历图,直至图中所有v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到。其实现可以采用邻接矩阵或邻接表来表示图进行遍历,还能对非连通图进行度优先遍历,并且有相应的算法分析 [^3]。 广度优先索(BFS)需要借助队列来遍历。首先,选取图中某一顶点vi作为出发点,访问后将其入队并标记为已访问(使用队列用于避免重复访问,存放已经访问过的各邻接顶点);接着依次访问与vi邻接的顶点,即当队列不为空时检查出队顶点的所有邻接顶点,访问未被访问的邻接顶点并将其入队,重复该过程;可概括为由起始顶点开始,按照广度优先的顺序逐层遍历与当前顶点相邻的顶点将其访问;当队列为空时跳出循环,即所有已被访问的顶点的邻接顶点均被访问到,则此时遍历完成 [^4]。 值得注意的是,广度优先索在某些情况下可能不是最优的,例如当图很大或者结构复杂时,它可能需要遍历很多节点才能找到目标节点,在这种情况下,可能需要考虑使用其他索算法,如度优先索(DFS)或启发式索算法等 [^2]。 以下是简单的Python代码示例来实现DFSBFS: ```python # 图的邻接表表示 graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } # 度优先索 def dfs(graph, start, visited=None): if visited is None: visited = set() if start not in visited: print(start, end=' ') visited.add(start) for neighbor in graph[start]: dfs(graph, neighbor, visited) # 广度优先索 from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) visited.add(start) while queue: vertex = queue.popleft() print(vertex, end=' ') for neighbor in graph[vertex]: if neighbor not in visited: queue.append(neighbor) visited.add(neighbor) # 测试 print("DFS:") dfs(graph, 'A') print("\nBFS:") bfs(graph, 'A') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值