【数据结构—图论】图的遍历(DFS、BFS)

图的遍历(DFS、BFS)

关于图的遍历

1.从图的某个顶点出发,访问图中所有顶点,且使每个顶点恰被访问一次的过程被称为图的遍历。
2.图中可能存在回路,且图的任一顶点都可能与其他顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
3.为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组vis[ ],它的初始状态为0,在图的遍历过程中,一旦某一个顶点i被访问,就立即让**vis[i]**为1,防止其被多次访问。

两种遍历算法都需要vis[ ]数组来标记是否访问过某个顶点!!

图的深度优先遍历(Depth First Search—DFS)

在这里插入图片描述

注意:图深度优先遍历的次序不唯一!

在这里插入图片描述

DFS递归算法

在这里插入图片描述
非连通图

在这里插入图片描述

DFS的迭代算法(需要借助栈)

在这里插入图片描述例1:
在这里插入图片描述例2:
在这里插入图片描述
在这里插入图片描述

图的广度优先遍历(Breadth First Search—BFS)

BFS介绍:

在这里插入图片描述示例:
在这里插入图片描述

广度优先遍历(BFS)类似于树的层次遍历,是一种分层的搜索过程,每前进一层就访问一批顶点,而不像深度优先搜索(DFS)那样需要回溯。因此,广度优先搜索不是一个需要递归的过程。

这也就是为什么深度优先搜索的迭代算法需要用到栈,而广度优先搜索为了实现逐层访问并记忆未被处理的节点,用到的是队列

ADL伪代码
在这里插入图片描述
在这里插入图片描述举例:
在这里插入图片描述

代码实现
//图的结构
//边结点的结构
typedef struct Edge
{
    int Veradj;//邻接顶点序号
    struct Edge* link;//指向下一个边结点的指针 struct Edge*指向他自己!
}Edge, * ArcNode;

//顶点表中结点的结构
typedef struct Vertex
{
    int Vername;//顶点名称
    Edge* adjacent;//边链表的头指针  //指向edge
}Vertex;

//邻接表的结构
typedef struct LGraph {
    Vertex vertices[200]; //顶点表 它包含Vertex这个结构体
}ALGraph;

ALGraph G;

//BFS
void BFS(int n, int m, SqQueue& Q, int a, int b)//a为起点 b为终点
{
    ArcNode q;  //指向边链表的指针
    int v;
    for (int i = 0; i < n; i++)  dist[i] = -1;
    dist[a] = 0;
    EnQueue(Q, a);
    while (!QueueEmpty(Q)) {
        v = DeQueue(Q);//队头顶点v出队!!
        q = G.vertices[v].adjacent;
        while (q != NULL)
        {
            int w = q->Veradj;
            if (dist[w] == -1) //未被访问过
            {
                dist[w] = dist[v] + 1;
                EnQueue(Q, w);
            }
            q = q->link;
        }
    }//执行结束
}
内容概要:本文档是一份关于大数据开发的笔试题目集合,涵盖了多个计算机科学领域的知识点。主要内容包括:数组排序算法的应用,如给出了一段不完整的冒泡排序代码示例;二叉树的基本操作,包括普通二叉树的遍历方式(先序遍历),以及针对大规模数据(如一亿个节点)时避免服务器崩溃的优化策略——采用分布式计算思想将单棵大树拆分为多棵小树并行处理;人力资源系统的数据库设计方案,涉及到了员工信息存储所需的字段(如ID、姓名、工资、上级ID、层级)、展示公司内部架构的SQL语句(利用CTE公共表达式或者PL/SQL中的特定语法来构建递归查询),还有统计某个管理者所辖人数的方法论。 适合人群:正在准备大数据相关岗位面试的技术人员,尤其是那些希望加深对数据结构、算法以及数据库设计等方面理解的人群。 使用场景及目标:①帮助求职者熟悉常见的编程技巧与理论知识,提高解决实际问题的能力;②为从事企业级应用开发工作的程序员提供参考案例,以便更好地理解和实施复杂的数据管理和业务逻辑建模任务。 阅读建议:由于文档中包含了多种类型的题目,建议读者按照自己的薄弱环节选择重点复习的内容。对于排序算法部分,应该注意理解各种经典算法的工作机制及其优缺点;对于二叉树的问题,则要掌握不同遍历顺序的特点,并思考如何应对海量数据带来的挑战;最后,在研究HR系统相关的数据库设计时,除了要学会正确地创建表格外,还应学会运用适当的SQL语句来进行高效的数据检索和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值