基础算法学习 -> 广度/深度优先搜索

397 阅读1分钟

广度优先搜索和深度优先搜索在大数据分析、NLP、搜索中广泛应用。 比如我们要查从北京到广州到铁路路线

广度优先搜索

广度优先搜索即Breadth-First-Search BFS

代码

def BFS(graph, start, end):
    """
    Breath First Search
    :param graph 路线关系
    :param start 起始点
    :param end 终点
    """
    # 使用队列
    queue = []
    # 入列第一个点
    queue.append([start])
    # 记录访问过的点
    visited = set()
    
    while queue:
        # 队列弹出
        node = queue.pop()
        if node in visited:
            # 已经访问过的跳过
            continue
        visited.add(node)
        process(node)
        # 得到子节点
        for child in graph[node]:
            if child in visited:
                continue
            # 将子节点加到队列尾部
            queue = [child] + queue

深度优先搜索

def DFS(graph, start, end):
    """
    Depth First Search
    :param graph 路线关系
    :param start 起始点
    :param end 终点
    """
    # 使用队列
    queue = []
    # 入列第一个点
    queue.append([start])
    # 记录访问过的点
    visited = set()
    
    while queue:
        # 队列弹出
        node = queue.pop()
        if node in visited:
            # 已经访问过的跳过
            continue
        visited.add(node)
        process(node)
        # 得到子节点
        for child in graph[node]:
            if child in visited:
                continue
            # 将子节点加到队列头部
            queue = queue + [child]

DFS递归写法

visited = set()
def DFS(graph, node, visited):
    """
    :param graph 路线关系
    """
    visited.add(node)
    # 处理当前节点
    process(node)
    for next_node in graph[node]:
        if not next_node in visited:
            DFS(graph, next_node, visited)