【问题标题】:The usage of graph traversal algorithm图遍历算法的使用
【发布时间】:2014-03-27 14:34:51
【问题描述】:

我正在阅读与 C++ 4e 中的数据结构和算法中的图形相关的材料(作者:Adam Drozdek)。在他的 Graph Breadth First Search 实现中,伪代码如下:

BFS():
    for all vertices u
        num(u) = 0
    edges = null
    i = 1
    while there is a vertex v such that num(v) is 0
        num(v)++
        enqueue(v)
        while queue is not empty
            v = dequeue()
            if num(u) is 0
                num(u) = i++
                enqueue(u)
                attach edge(v,u) to edges
    output edges

基本上,在图的实现中,我们已经保留了一组所有顶点和一组所有边。在 BFS 中,算法首先枚举该集合中未访问的每个顶点来遍历完整图。

我的问题是: 由于我们已经将所有顶点存储在一个集合中,我们可以循环遍历该集合以对特定顶点进行操作,而无需使用 BFS 算法。为什么我们需要一个图遍历算法,主要用途是什么?

【问题讨论】:

    标签: algorithm graph breadth-first-search graph-traversal


    【解决方案1】:

    BFS 和 DFS 有很多用途...
    给你一个关于 BFS 的想法:

    1. 您有一个表示社交网络的图表,并希望为特定用户提供朋友建议。然后,您执行 BFS。顶点(人)越接近,在好友推荐列表中的排名就越高。 (如果用户数量很大,在距离为 3 处停下而不对整个图做 BFS 是有意义的)。

    2. 解决方案空间搜索。当解决方案空间无限时非常有用。 (见Game Trees

    3. 最短路径(如果边具有相同的权重并且没有环)。 Dijkstra 对其进行了调整以适用于可变权重(请参阅Dijkstra's algorithm)。

    【讨论】:

    • 所以遍历算法的目标不是主要访问一些顶点,而是探索不同顶点之间的关系,对吧?
    • 可以这么说。但是,当您访问顶点时,您也可以调用一些函数。也许我想给所有的 Vertices 分配一个优先级,它们越接近,优先级越高。因此,我做一个 BFS 并在每个节点访问时调用一个函数。此功能分配优先级。当您了解树时,您会看到各种树遍历也有多种应用程序(前序、中序和后序)。
    【解决方案2】:

    例如,当递归遍历树时,通常会隐式使用 DFS。

    【讨论】:

    • 是的,我知道树中序和前序遍历与 DFS 相同。我只是感到困惑,因为实际上在图形的实现中,实际上顶点和边都存储在一个数组中,而不像树节点使用指针相互链接。在树中,我们需要逐字逐句地遍历每个节点。然而,在图中,如果我们需要访问某个节点,似乎循环遍历包含顶点的向量更简单。我猜图遍历算法更多地用于检测顶点之间的关系,而不仅仅是纯粹访问节点。 (?)
    • 嗯,您也可以在树中执行此操作(您将所有节点的地址存储在一个数组中,然后您可以在恒定时间内访问它们中的任何一个)。但是,访问节点与访问节点不同。更多的是你如何到达那里的问题。作为程序员,您可能可以访问所有顶点,但您可能无法“访问”某个顶点,因为它是孤立的。
    • 我尝试了一个玩具程序来使用图遍历算法找到迷宫路径,现在对它的用法有了更好的理解。非常感谢。是的,访问与获得物理访问非常不同..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多