当前位置: 首页 > 知识库问答 >
问题:

如何研究图数据结构和BFS

岳劲
2023-03-14

我最近在研究html" target="_blank">数据结构,我在图形方面有困难。我读了这本书:C语言中的数据结构和算法分析(第二版)。

事实上,我也读了一些其他算法书籍,我发现几乎没有一本书给我一个完整的图形实现。虽然我可以阅读伪代码,了解BFS和DFS是如何运行的,以及graph中用于解决问题的一些其他算法,但我仍然需要一个完整的实现来帮助我更好地理解它是如何工作的。然而,在研究图形时,在这里编写代码不重要吗?我不确定。

此外,我还发现了一些关于BFS和DFS的ACM问题。我不知道如何表达,但似乎BFS和DFS只是解决它们的想法,它们没有编写标准BFS代码。所以这让我很难研究数据结构。

很抱歉我的表达不好,我现在是一名在美国的国际学生。

最后,我从精通C语言的算法中复制了这段代码,并对其进行了分析。但我还是不能理解其中的一部分。下面是代码的一部分:

typedef struct BfsVertex_ {
    void *data;
    VertexColor color;
    int hops;
} BfsVertex;

typedef struct AdjList_ {
    void *vertex;
    Set adjacent;
} AdjList;

typedef struct Graph_ {
    int  vcount;
    int  ecount;
    List adjlists;
    int  (*match)(const void *key1, const void *key2);
    void (*destroy)(void *data);
} Graph;

int BFS(Graph *graph, BfsVertex *start, List *hops) {

    Queue     queue;
    AdjList   *adjlist, *clr_adjlist;
    BfsVertex *clr_vertex, *adj_vertex;
    ListElem  *element, *member;

    /* init all of the vertices in the graph */
    for (element = list_head(&graph_adjlists(graph));
         element != NULL;
         element = list_next(element)) {

        clr_vertex = ((AdjList *)list_data(element))->vertex;

        if (graph->match(clr_vertex, start)) {
            clr_vertex->color = gray;
            clr_vertex->hops = 0;
        } else {
            clr_vertex = white;
            clr_vertex->hops = -1;
        }
    }

    /* init the queue with the adjacency list of the start vertex */
    queue_init(&queue, NULL);
    if (graph_adjlist(graph, start, &clr_adjlist) != 0) {
        queue_destroy(&queue);
        return -1;
    }

    if (queue_enqueue(&queue, clr_adjlist) != 0) {
        queue_destroy(&queue);
        return -1;
    }

    /* perform Breadth-First Search */
    while (queue_size(&queue) > 0) {

        adjlist = queue_peek(&queue);

        /* traverse each vertex in the current adjacency list */
        for (member = list_head(&adjlist->adjacent);
             member != NULL;
             member = list_next(member)) {

            adj_vertex = list_data(member);

            /* determine the color of the next adjacent vertex */
            if (graph_adjlist(graph, adj_vertex, &clr_adjlist) != 0) {
                queue_destroy(&queue);
                return -1;
            }
            clr_vertex = clr_adjlist->vertex;

            /* color each white vertex gray and enqueue its adjacency list */
            if (clr_vertex->color == white) {
                clr_vertex->color = gray;
                clr_vertex->hops = ((BfsVertex *)adjlist->vertex)->hops + 1;

                if (queue_enqueue(&queue, clr_adjlist) != 0) {
                    queue_destroy(&queue);
                    return -1;
                }
            }
        }

        /* dequeue the current adjacency list and color its vertex black */
        if (queue_dequeue(&queue, (void **)&adjlist) == 0) {
            ((BfsVertex *)adjlist->vertex)->color = black;
        } else {
            queue_destroy(&queue);
            return -1;
        }
    }

    queue_destroy(&queue);

    /* pass back the hop count for each vertex in a list */
    list_init(hops, NULL);

    for (element = list_head(&graph_adjlists(graph));
         element != NULL;
         element = list_next(element)) {

        /* skip vertices that were not visited (those with hop counts of -1) */
        clr_vertex = ((AdjList *)list_data(element))->vertex;
        if (clr_vertex->hops != -1) {
            if (list_ins_next(hops, list_tail(hops), clr_vertex) != 0) {
                list_destroy(hops);
                return -1;
            }
        }
    }

    return 0;
}

我在这里遇到了麻烦:这个初始化是如何工作的?它遍历图的邻接列表,并为图中的每个顶点分配彩色顶点。但是着色后,clr_vertex改变了它的对象,颜色和距离信息是如何保存的?

 /* init all of the vertices in the graph */
        for (element = list_head(&graph_adjlists(graph));
             element != NULL;
             element = list_next(element)) {

            clr_vertex = ((AdjList *)list_data(element))->vertex;

            if (graph->match(clr_vertex, start)) {
                clr_vertex->color = gray;
                clr_vertex->hops = 0;
            } else {
                clr_vertex = white;
                clr_vertex->hops = -1;
            }
        }

谢谢你读了这么长的问题。

共有1个答案

曹凯泽
2023-03-14

如何研究图数据结构和BFS

一个词:抽象的。

不管编程语言如何,你都需要理解它们。你只需要一支笔和一张纸。这将使它在实施方面非常清楚。图应该是抽象对象,其中程序语言的选择与概念无关。

我仍然需要一个完整的实现来帮助我更好地理解它是如何工作的。

DFS和BFS只是遍历(即遍历)图形的两种不同方式。不多不少。这种行走的结果就是文献中所谓的搜索树。全面实施情况如下:

>

  • 手动在小图形上运行DFS和BFS。(这将返回一个搜索树)

    检查它与您的实现。

    当然,这些技术太笼统了。说到练习,你可以修改它们,结合其他技术,或者用它们做任何你想做的事情。目前,您可以将它们视为DFS=Stack,BFS=Queue

  •  类似资料:
    • 目前为止,你已经学完了 Python 的核心数据结构,同时你也接触了利用到这些数据结构的一些算法。如果你希望学习更多算法知识, 那么现在是阅读第二十一章的好时机。 但是不必急着马上读,什么时候感兴趣了再去读即可。 本章是一个案例研究,同时给出了一些习题, 目的是启发你思考如何选择数据结构,并练习数据结构使用。 词频分析 和之前一样,在查看答案之前,你至少应该试着解答一下这些习题。 习题13-1 编

    • 图(graph) 图由边的集合及顶点的集合组成 有向图: 无向图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Graph</title> </head> <body> <script> function Graph(v){ this.vertices=v;

    • 主要内容:图存储结构基本常识,图存储结构的分类我们知道,数据之间的关系有 3 种,分别是 "一对一"、"一对多" 和 "多对多",前两种关系的数据可分别用 线性表和树结构存储,本节学习存储具有"多对多"逻辑关系数据的结构—— 图存储结构。 图 1 图存储结构示意图 图 1 所示为存储 V1、V2、V3、V4 的图结构,从图中可以清楚的看出数据之间具有的"多对多"关系。例如,V1 与 V4 和 V2 建立着联系,V4 与 V1 和 V3 建立着

    • 调查新用户体验和痛点,应该用什么数据分析思路? 问卷在做的时候就分维度了,包括ui操作难度等等,在分析的时候除了做比率分析还要做什么分析? 是要结合用户画像分类做体验和痛点分析吗? ps:这是一道面试题,当时我是懵的,现在还是。 #用户研究##用户调研##游戏##用研#

    • 图的存储结构 图的存储结构除了要存储图中各个顶点的本身信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表等。 邻接矩阵表示法 对于一个具有n个结点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。矩阵 A(i,j) =

    • 问题内容: 我有一个包含的字符串变量 字符串不包含空格。我想编写一个仅打印包含(az)的单词的正则表达式,我尝试了一个简单的正则表达式 match对象仅包含单词,而单词不匹配。 使用时,我可以同时获得和。 我的问题是为什么我们不能这样做? 如何处理? 问题答案: 在字符串documenation中找到 一次 模式: 扫描字符串以查找正则表达式模式产生匹配项的位置,然后返回相应的MatchObjec