图算法(一)—深入理解深度优先搜索

深度优先搜索非递归方式 目录 一、概述 二、深度优先搜索非递归 三、代码 一、概述 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优... 阅读详情
  • @author : luoz
  • @date time:2016年9月18日 上午9:21:08

基于实现无向图的API
由浅入深理解深度优先搜索算法
分析深度优先搜索解决的单点路径问题,连通性问题,二分色问题

无向图

  1. 无向图即为由边(edge)和顶点(vertex)组成的图模型。
  2. 图的几种表示方法(使用哪种数据结构表示图)
    1>邻接矩阵:
    V*V的boolean矩阵,相连则true,这种数据结构对于上百万个顶点,空间需求太大。
    2>边的数组:
    使用一个边(edge)类,含有两个顶点变量。但是这种数据结构不能检查图所有的边。
    3>邻接表数组
    每个顶点都构造一个以顶点为索引的列表数组,数组中的元素都是和顶点相连的。下面的实现均是这种数据结构。
  3. 基于邻接表实现的图的性能分析
    1>使用空间和V+E成正比。
    2>当增加一条边时,所需时间为常数。
    3>遍历某个顶点的所有相邻顶点时,所需时间和V的度数成正比(处理每个相邻点所需时间为常数)
    所以,结合三个分析:
    基于以上操作的实现,邻接表性能趋向最优。
  4. 实现(Java)
package graphTheory;

import java.io.*;
import java.util.*;
/**
  * @author : luoz 
  * @date time:2016年9月16日 下午3:52:06 
**/
public class Graph {

    //vertex number
    private int V;

    //edge number
    private int E;

    //adjacency number  
    private Bag<Integer>[] adj;

    //FileIO
    FileIO fileio;

    /**
     * set up a graph and vertexs number are V.
     * @param V
     */
    public void Graph(int V)
    {
        this.V = V;
        this.E = 0;
        adj = (Bag<Integer>[]) new Bag[V];
        for(int v = 0;v<V;v++)
        {
            adj[v] = new Bag<Integer>();
        }
    }
    /**
     * read edge and vertex from a file and file name is Graph.txt
     * read String s from file,and the String data structure like:1 2,3 4,2 3,...
     */
    public void Graph()
    {
        fileio = new FileIO();
        String s = fileio.characterReader(new File("Graph.txt"));
        String[] st = s.split(",");
        int E = st.length;
        for(int i = 0;i<E;i++)
        {
            String[] str = st[i].split(" ");
            addEdge(Integer.parseInt(str[0]),Integer.parseInt(str[1]));         
        }

    }
    public int V(){
        return V;
    }

    public int E(){
        return E;
    }

    /**
     * add the vertex to the list.
     * @param v
     * @param w
     */
    public void addEdge(int v,int w)
    {
        adj[v].add(w);
        adj[w].add(v);
        E++;        
    }

    public Iterable<Integer> adj(int v)
    {
        return adj[v];
    }
}

深度优先搜索

  1. 思想
    走迷宫策略:按着通道(边),一直走未走过的,当遇到已经走过(标记过)的,则返回(递归)上一个路口(顶点),走这个路口的另外通道。走的过程中,用一个绳子标记已经走过的路(path)。
    如图:
    深度优先搜索
    由图,红色是搜索路径(path),根据邻接表的顺序一直走下去,直到遇到没路或者走过的路,则返回。
  2. 实现(Java)
package graphTheory;

import java.util.Stack;

/**
  * @author : luoz 
  * @date time:2016年9月18日 上午9:20:34 
**/
public class DepthFirstSearch {

    //the vertex is called dfs()
    private boolean[] marked;
    //first vertex to last vertex way
    private int[] edgeTo;
    //the start point
    private final int s;

    public boolean marked(int w)
    {
        return marked[w];
    }

    public boolean hashPathTo(int v){
        return marked[v];
    }

    //method:set up a DepthFirstSearch
    public DepthFirstSearch(Graph G,int s){
        marked = new boolean[G.V()];
        edgeTo = new int[G.V()];
        this.s = s;
        dfs(G,s);
    }
    //resursion for G to get the DepthFirstSearch
    private void dfs(Graph G,int v)
    {
        marked[v] = true;
        for(int w:G.adj(v))
            if(!marked[w])
            {
                edgeTo[w] = v;
                dfs(G,w);
            }
    }

    public Iterable<Integer> pathTo(int v)
    {
        if(!hashPathTo(v))
            return null;
        Stack<Integer> path = new Stack<Integer>();
        for(int x = v; x != s;x= edgeTo[x])
            path.push(x);
        path.push(s);
        return path;
    }
}

广度优先搜索

  1. 单点路径
    给定一个图和一个顶点,是否存在该顶点到目标顶点的路径,存在则输出。
    实现:即上一份API的实现方法pathTo()
  2. 是否为无环图
    给定的的图,是否为无环图?
    实现:既然是判断,必然需要增加boolean型变量:hashCycle
    public void Cycle(Graph G)
    {
        marked = new boolean[G.V()];
        for(int s = 0;s <G.V();s++)
        {
            if(!marked(s))
                cdfs(G,s,s);
        }
    }

    private void cdfs(Graph G,int v,int u)
    {
        marked[v] = true;
        for(int w : G.adj(v))
        {
            if(!marked[w])
                cdfs(G,w,v);
            else if(w != v)
                hashCycle = true;

        }
    }

    public boolean hashCycle()
    {
        return hashCycle;
    }
  1. 双色问题(二分图)
    能否用两种颜色将图的所有顶点着色,使得任意一条边的两个顶点都为不同颜色?(这是否为一个二分图)
    实现:
    public void TwoColor(Graph G)
    {
        marked = new boolean[G.V()];
        color = new boolean[G.V()];
        for(int s = 0;s<G.V();s++)
        {
            if(!marked[s])
                colorDFS(G,s);
        }
    }

    private void colorDFS(Graph G,int v)
    {
        marked[v] = true;
        for(int w : G.adj(v))
        {
            if(!marked[w])
            {
                color[w] = !color[v];
                colorDFS(G,w);
            }
            else if(color[w] == color[v])
                isTwoColor = false;
        }       
    }

    public boolean isTwoColor()
    {
        return isTwoColor;
    }

算法第四版

【AI大数据计算原理与代码实例讲解】图算法 【AI大数据计算原理与代码实例讲解】图算法 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 在当今的数据科学和人工智能 阅读详情

相关推荐

20、深入理解广度优先搜索与图算法

本文深入讲解了图算法中的两种核心遍历技术:广度优先搜索(BFS)和深度优先搜索(DFS)。详细介绍了它们的基本原理、时间与空间复杂度、应用场景以及实现代码示例。同时,还讨论了它们的优化策略、局限性及改进方法,并通过实际案例分析展示了其在现实问题中的广泛应用。通过本文,读者可以全面掌握BFS与DFS的核心思想与使用技巧。

salt的博客 174

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

深度优先搜索算法(Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

白话机器学习 1万+

4、图算法与DeepWalk技术解析

本文深入解析了图算法中的深度优先搜索(DFS)和DeepWalk技术。DFS是一种递归图遍历算法,用于查找连通分量、拓扑排序等任务;而DeepWalk结合了随机游走和Word2Vec,用于生成图中节点的嵌入表示,广泛应用于节点分类、链接预测和图可视化。文章还介绍了Word2Vec的CBOW和Skip-gram模型,以及DeepWalk的整体流程和应用场景。

code8的博客 113

图的深度优先搜索(dfs)

图的遍历, 即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历 图的深度优先搜索(Depth First Search) 指的是在搜索时,如果遇到一个结点既有子结点,又有兄弟结点,那么先找子结点,然后找兄弟结点。 深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解:每次都在

wujianrenn的博客 9558

图算法的骨架:遍历与分治策略的深入理解

本章深入探讨了图算法中的核心概念——遍历,并引入了分治策略,即通过分解问题以提高性能。遍历算法能够访问图中所有可达节点,而分治策略通过递归分解和合并结果来解决复杂问题。文章详细解释了深度优先搜索(DFS)和广度优先搜索(BFS)的原理和应用,同时介绍了Kosaraju算法来寻找有向图的强连通分量。分治策略的平衡性被强调为算法性能提升的关键,通过示例展示了如何将算法应用于构建城市天际线问题。

weixin_42311427的博客 396

图算法完整实现:网状结构项目实战指南

在项目结束时,需要回顾项目的初始目标,对比项目完成后的实际成果。例如,如果项目的目标是提升社交网络中信息传播的效率,那么最终的成果应该体现在信息传播速度和覆盖范围的提升上。对于算法项目来说,成果总结还应该包括算法性能的提升情况,如处理时间的缩短、准确率的提高等。这些成果不仅能够量化地展示项目成效,还能为后续项目提供宝贵的参考数据。在项目实施过程中,遇到问题并采取相应的解决策略是项目成功的关键。在项目总结文档中,应该详细记录这些问题及其解决方案,以及实施后的效果。

weixin_30533301的博客 1117

【数据结构与算法】图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

一、深度优先搜索 DFS 1、深度优先搜索和广度优先搜索 2、深度优先搜索基本思想 3、深度优先搜索算法步骤 二、深度优先搜索示例 ( 理论 ) 1、第一轮递归 2、第二轮递归 3、第三轮递归 4、第四轮递归 5、第五轮递归 6、第六轮递归 7、第七轮递归

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9309

深入理解DFS与BFS及其在图算法中的应用

本章深入探讨了深度优先搜索(DFS)与广度优先搜索(BFS)这两种基本的图遍历算法,详细分析了它们的工作原理、时间复杂度以及在不同应用场景下的优势。DFS通过递归的方式创建了一个不包含回边的树结构,即DFS树,其时间复杂度为O(V+E)。而BFS则使用队列来逐层访问图中的节点,时间复杂度同样为O(V+E),但当使用邻接矩阵表示图时,复杂度提升至O(V2)。此外,本章还介绍了拓扑排序的原理和实现方法,并对比了DFS与BFS的优劣,指出选择何种算法取决于特定问题的需求。

weixin_42509513的博客 640

【图计算算法‌】深度优先搜索(DFS)算法

深度优先搜索算法(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。该算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点,这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为新的源节点并重复以上过程,直到所有节点都被访问为止。

大雨淅淅的博客 5998

图算法在数据结构中的应用与性能分析

本文深入探讨了图算法在数据结构中的应用,包括广度优先搜索(BFS)、深度优先搜索(DFS)、最小生成树和最短路径算法。文章详细分析了各种算法的原理、实现和性能,以及它们在解决实际问题时的应用场景和效率。通过具体的算法描述和实例应用,读者能够更好地理解这些图算法的精髓,并在实际编程和算法设计中加以运用。

weixin_31139479的博客 460

C++实现邻接表数据结构与图算法实战

邻接表的核心思想是将图中的每个顶点与其相邻顶点通过链表或容器形式组织起来。与邻接矩阵不同,邻接表不存储所有顶点之间的连接关系,而是仅记录存在的边,因此在空间效率上具有显著优势。int dest;// 邻接点编号int weight;// 边的权重(可选)// 指向下一个邻接点int V;// 顶点数// 邻接表数组} Graph;int V = 5;// 顶点数邻接矩阵适合边数较多的图,操作简单,查询效率高。邻接表适合边数较少的图,空间效率高,适合动态图结构。

weixin_31749299的博客 1188

【算法】深度优先搜索 (DFS)

本文介绍了 DFS 的概述、代码实现以及应用。

代码星辰的博客 3107

图算法精粹:掌握路径查找与网络流处理

本文深入探讨了图算法中的经典算法,包括广度优先搜索(BFS)、深度优先搜索(DFS)及其在路径查找、网络遍历和AI问题解决中的应用。同时,详细介绍了用于查找最短路径的Dijkstra算法和Bellman-Ford算法,以及用于构建最小生成树的Prim算法和Kruskal算法。此外,我们还探讨了拓扑排序在不同领域的实际应用,如任务调度、数据处理和课程安排。

weixin_29009401的博客 730

10种图算法直观可视化解释

快速介绍10个基本的图算法,并举例和可视化 图已经成为一种强大的建模和捕获真实场景中的数据的手段,比如社交媒体网络、网页和链接,以及GPS中的位置和路线。如果您有一组相互关联的对象,那么您可以使用图来表示它们。 在这篇文章中,我将简要地解释10个对分析和应用非常有用的基本图形算法。 首先,让我们介绍图。 什么是图? 图由一组有限的顶点或节点和一组连接这些顶点的边组成。如果两个顶点通过同一条边互相连接,则称它们为邻接。 下面给出了一些与图相关的基本定义。您可以参考图1中的示例。 阶Order:图中顶点的数

deephub 1万+

信号的自相关和互相关

自相关是描述信号与自身在不同时间延迟下的相似度,常用于信号的周期性分析和谱估计。互相关是描述两个信号之间在不同时间延迟下的相似度,常用于信号匹配、时延估计和信号检测。通过自相关和互相关,可以理解信号的特性、信号之间的关系,并用于许多信号处理任务,如检测、定位和谱分析。

weixin_44012667的博客 5406

NE5532A与JRC4580在低噪声音频电路设计中的关键应用

本文深入探讨了经典运算放大器NE5532A与JRC4580在低噪声音频电路设计中的核心应用。文章从噪声模型分析入手,阐述了针对低阻抗信号源时,如何利用这两款BJT输入运放的低电流噪声特性进行优化设计。通过对比两者参数与实战守则,为设计高保真音频前级、耳机放大等电路提供了从原理图到PCB布局的完整低噪声解决方案。

weixin_29295541的博客 332

图算法的基本知识笔记

简要概括 图算法指利用特制的线条算图求得答案的一种简便算法。无向图、有向图和网络能运用很多常用的图算法,这些算法包括:各种遍历算法(这些遍历类似于树的遍历),寻找最短路径的算法,寻找网络中最低代价路径的算法,回答一些简单相关问题(例如,图是否是连通的,图中两个顶点间的最短路径是什么,等等)的算法。图算法可应用到多种场合,例如:优化管道、路由表、快递服务、通信网站等。 图的基本知识点 算法导论之图算法--图的基本概念_xueyuxueyuxueyu的博客-优快云博客_图算法 图的...

To be a better man 581

Uibot RPA中级认证实战:手把手教你用流程创造者搞定客户数据迁移(附验证码容错技巧)

本文详细介绍了Uibot RPA中级认证实战中的客户数据迁移工程化解决方案,特别针对验证码容错技巧和动态表格处理等核心挑战。通过环境准备、登录模块设计、数据提取技术及容错体系的系统讲解,帮助RPA实施工程师掌握高效稳定的自动化流程开发方法,提升企业数据迁移效率。

weixin_30505225的博客 231

**发散创新:探索图算法在编程领域的应用之旅**引言:随着数据科学与计算技

图算法是一种基于图结构的算法,用于处理和分析网络数据。在计算机科学中,图算法广泛应用于社交网络分析、路径查找、机器学习等领域。本文将介绍几种常见的图算法,包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法)以及图着色算法等。

taozodew123的博客 243

Code Composer Studio 8.3.1安装与常见问题解决指南

本文提供了Code Composer Studio 8.3.1版本的详细安装指南与常见问题解决方案。内容涵盖从下载离线安装包、系统环境准备、自定义安装步骤,到首次启动配置及汉化建议。重点解析了安装过程中可能遇到的闪退、卡顿、Java虚拟机错误等典型问题的排查与修复方法,旨在帮助开发者高效部署这一稳定的嵌入式集成开发环境。

weixin_29195217的博客 334

QGraphicsView通过鼠标操作来绘制图元

在Visio和MindManager等类似的图元操作软件中,很多时候我们会通过鼠标操作来添加自定义的图元。这里就介绍一下如何在QT的图形视图框架中通过鼠标绘制来添加图元。

yang1fei2的博客 3578

**发散创新:探索图算法中的深度搜索与广度搜索**===============

深度优先搜索是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索图的分支,当节点v的所在边都已被探寻过,搜索将回溯至发现节点v的那条边的起始节点。这一过程递归进行,直至已发现从源节点可达的所有节点为止。visited = set() # 记录已访问过的节点stack = [start] # 使用栈来存储待访问的节点while stack: # 当栈不为空时继续遍历vertex = stack.pop() # 弹出栈顶元素。

2501_92807076的博客 419

华为OD机试真题 新系统2026-04-01 C++ 实现【计算数列位置N的值】

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

MISAYAONE的博客 1161

八皇后--深入理解深度优先搜索

文章目录一,深度优先搜索1.基本概念2.搜索步骤3.基本模板二、P1219 [USACO1.5]八皇后 Checker Challenge代码如下(示例): 一,深度优先搜索 1.基本概念 深度优先搜索算法(Depth First Search,简称DFS):是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情

m0_61452966的博客 476

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程

计算机视觉论文复现指南:从理论到可运行代码的保姆级教程​ ,人工智能,计算机视觉,大模型,AI,本文围绕计算机视觉论文复现展开,介绍从理论到可运行代码的全流程。先强调复现的重要性,再讲解复现前的准备,包括明确目标、构建工具链;接着说明代码获取分析、环境配置调优、调试运行技巧及结果验证优化方法,还推荐了高效工具,提及复现中的伦理规范。旨在助读者掌握复现方法论,实现从经典模型到前沿论文的复现,推动学术成果落地。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

Spring AI Alibaba Agent开发实战:DeepResearch Agent调度系统

智能Agent调度系统通过专业化分工解决传统AI系统的三大痛点:通用模型专业性不足、处理效率低下和资源浪费。系统采用分层架构设计,核心组件包括智能调度器、Agent选择辅助器和集成工具类,实现问题分类、专业Agent匹配和搜索策略优化的全流程自动化。系统特点包括:1)配置驱动的灵活扩展;2)分层回退的容错机制;3)支持工具调用与传统搜索的智能切换。该架构通过策略模式和依赖注入等技术,在保证稳定性的同时显著提升了研究质量和效率,为企业级多Agent协作提供了完整解决方案。(149字)

wjianwei666的专栏 505
上一篇: 查找算法—散列表
下一篇: 图算法(二)—深入理解广度优先搜索
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值