【图结构从入门到应用】图的表示和遍历,图搜索算法详解与示例

news2024/9/28 19:24:42

 1图的概念

         图是一种非常常见的数据结构,用于表示对象之间的关系。在计算机科学中,有许多不同的图类型,包括有向图(Directed Graph)和无向图(Undirected Graph)。图通常由节点(顶点)和边组成,节点代表对象,边表示对象之间的关系。

表示图:

使用NetworkX库,你可以轻松表示图。首先,确保你已经安装了这个库:

pip install networkx

接下来,让我们创建一个简单的无向图来表示社交网络关系:

import networkx as nx

# 创建一个空的无向图
G = nx.Graph()

# 添加节点
G.add_node("Alice")
G.add_node("Bob")
G.add_node("Charlie")

# 添加边
G.add_edge("Alice", "Bob")
G.add_edge("Bob", "Charlie")
G.add_edge("Charlie", "Alice")

这将创建一个包含三个节点和三条边的无向图,表示Alice、Bob和Charlie之间的社交关系。

2  图的表示

        图可以分为有向图(Directed Graph)和无向图(Undirected Graph)。以下是几种表示图的方式:

2.1 邻接矩阵(Adjacency Matrix)

        使用一个二维数组表示图中的边。对于无向图,矩阵是对称的,而对于有向图,矩阵不一定对称。矩阵中的元素表示从一个顶点到另一个顶点是否有边,以及边的权重(对于带权图)。

例如,以下是一个无向图的邻接矩阵表示:

0 1 1 0
1 0 1 1
1 1 0 0
0 1 0 0

2.2 邻接列表(Adjacency List)

        使用一个数组或哈希表,其中每个顶点都有一个关联的链表,链表中包含了与该顶点相邻的顶点。

例如,以下是一个无向图的邻接列表表示:

0 -> 1 -> 2
1 -> 0 -> 2 -> 3
2 -> 0 -> 1
3 -> 1

 2.3 边列表(Edge List)

        将图中的边存储为一组二元组或对象的列表,每个元素表示一条边。

例如,以下是一个无向图的边列表表示:

(0, 1), (0, 2), (1, 2), (1, 3)

3 图的遍历

图的遍历是指按照一定规则访问图中的所有节点。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

3.1 遍历节点

# 遍历所有节点
for node in G.nodes():
    print(node)

3.2 遍历边

# 遍历所有边
for edge in G.edges():
    print(edge)

3.3 遍历节点的邻居

node = "Bob"
neighbors = G.neighbors(node)
for neighbor in neighbors:
    print(f"{node} 的邻居: {neighbor}")

4 图搜索算法

        图搜索(Graph Search)是一种用于在图数据结构中查找特定信息或路径的通用计算机科学算法。图搜索广泛应用于各种领域,包括计算机科学、人工智能、地理信息系统、网络路由和数据分析。

图搜索的目标可以有很多种,包括以下几个常见的:

  1. 路径搜索:查找从一个节点到另一个节点的最短路径或任何可行路径。这包括算法如Dijkstra算法、A*算法和深度优先搜索(DFS)等。

  2. 连通性检测:确定图中是否存在一条路径或边,以连接两个特定的节点。这通常用于网络路由和通信系统中。

  3. 遍历:遍历整个图,以查找特定条件的节点或边。这包括深度优先搜索(DFS)和广度优先搜索(BFS)等。

  4. 最小生成树:查找一个图的最小生成树,它是一个包含所有节点并且边权重之和最小的子图。

  5. 拓扑排序:对有向无环图(DAG)进行拓扑排序,以确定节点之间的依赖关系。

图搜索算法的选择取决于问题的性质和要求。以下是一些常见的图搜索算法:

4.1 深度优先搜索(DFS)

递归地探索图的深度,然后返回并探索其他分支。适用于路径搜索和遍历。

visited = set()

def dfs(node):
    if node not in visited:
        print(node)
        visited.add(node)
        for neighbor in G.neighbors(node):
            dfs(neighbor)

start_node = "Alice"
dfs(start_node)

4.2 广度优先搜索(BFS)

        逐层遍历图,从起始节点开始,然后扩展到与起始节点距离为1的节点,依此类推。适用于路径搜索和连通性检测。

from collections import deque

def bfs(start_node):
    visited = set()
    queue = deque([start_node])

    while queue:
        node = queue.popleft()
        if node not in visited:
            print(node)
            visited.add(node)
            queue.extend(neighbor for neighbor in G.neighbors(node) if neighbor not in visited)

start_node = "Alice"
bfs(start_node)

4.3 Dijkstra算法 

        用于查找带权重图中的最短路径。适用于路径搜索和路由算法。

        Dijkstra算法用于在带权重的图中查找从一个起点到所有其他节点的最短路径。它是一种贪婪算法,通过不断选择距离最短的节点来扩展路径,以找到最短路径。

示例(Python):

import heapq

def dijkstra(graph, start):
    distances = {node: float('infinity') for node in graph}
    distances[start] = 0
    queue = [(0, start)]  # 使用优先队列来加速查找最短距离

    while queue:
        current_distance, current_node = heapq.heappop(queue)

        if current_distance > distances[current_node]:
            continue

        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(queue, (distance, neighbor))  # 更新距离并加入队列

    return distances

graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

start_node = 'A'
shortest_distances = dijkstra(graph, start_node)
print(shortest_distances)

输出:

4.4 A*算法

        结合了启发式搜索和Dijkstra算法的特点,用于在有权重的图中查找最短路径。适用于路径搜索。

4.5 Kruskal算法和Prim算法

        用于寻找最小生成树。

4.6 拓扑排序

        用于DAG中的节点排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode json文件添加注释报错

在vscode中创建json文件&#xff0c;想要注释一波时&#xff0c;发现报了个错&#xff1a;Comments are not permitted in JSON. (521)&#xff0c;意思是JSON中不允许注释 以下为解决方法&#xff1a; 在vscode的右下角中找到这个&#xff0c;点击 在出现的弹窗中输入json wit…

Python 自动化(十五)请求和响应

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls mysite1 (testenv) [rootlocalhost projects]# mkdir day01 day02 (testenv) [rootlocalhost projects]# cp -rf mysite1/ day01/ (testenv) [rootlocalhost proj…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

KDChart3.0编译过程-使用QT5.15及QT6.x编译

文章目录 参考原文一、下载KDChart源文件二、下载安装CMake三、编译Qt5.15.0 编译Qt6.x 编译使用Qt6.X编译的直接看这最快 四、使用测试方法一&#xff1a;测试方法二&#xff1a; 参考原文 记录我的KDChart3.0编译过程 系统&#xff1a;win11&#xff0c;Qt5.15 &#xff0c;编…

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2)

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder&#xff0c;Kotlin&#xff08;2&#xff09; import android.graphics.Canvas import android.graphics.Point import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util…

关于前端如何下载后端接口返回content-type为application/octet-stream的文件

关于前端如何下载后端接口返回response-type为application/octet-stream的文件 问题描述 后端接口定义为直接返回一个文件&#xff0c;如果带认证信息可以直接通过浏览器url下载&#xff0c;但是接口需要传headers认证信息&#xff0c;url上又不支持传相关信息 解决 前端…

如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a;…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

硬件安全与机器学习的结合

文章目录 1. A HT Detection and Diagnosis Method for Gate-level Netlists based on Machine Learning摘要Introduction 2. 基于多维结构特征的硬件木马检测技术摘要Instruction 3. A Hardware Trojan Detection and Diagnosis Method for Gate-Level Netlists Based on Diff…

第一章 系统工程概述|系统建模语言SysML实用指南学习

仅供个人学习记录 系统工程起因 期望当今系统能力较之前有显著提升。 竞争压力要求系统提升技术先进性&#xff1a;提高性能&#xff0c;同时降低成本及缩短交付周期 能力增长驱动需求增长&#xff0c;包括功能、互操作性、性能、可靠性提升与小型化等。 系统不再是孤立的&…

【软考系统架构设计师】2022年系统架构师综合知识真题及解析

本篇文章主要讲解2022年系统架构师综合知识真题及解析 【01】云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与SaaS、PaaS、Iaas相对应&#xff0c;图中①、②、③应为( )。 解析&#xff1a;答案选择B 从上到下&#xff0c;依次是应用层——平台层——基础设施…

【网络原理】| 应用层协议与传输层协议 (UDP)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;javaEE初阶 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 一、应用层协议二、传输层协议&#xff08;UDP协议&#xff09; 一、应用层协议 应用层是和代码直接相关的一层&#xff0c;决定…

Spark集群中一个Worker启动失败的排错记录

文章目录 1 检查失败节点worker启动日志2 检查正常节点worker启动日志3 查看正常节点spark环境配置4 又出现新的ERROR4.1 报错解释4.2 报错解决思路4.3 端口报错解决操作 集群下电停机后再次启动时&#xff0c;发现其中一台节点的worker启动失败。 1 检查失败节点worker启动日…

常见排序算法之冒泡排序

冒泡排序&#xff0c;英文名Bubble Sort&#xff0c;是一种相对基础的 交换排序方法。这种排序算法的名字来源于它操作的过程&#xff0c;可以类比为数列中的每一个元素都可以像小气泡一样&#xff0c;根据自身的大小一点一点向数组的一侧移动。具体到冒泡排序的工作原理&#…

【Java网络编程】二

本文主要介绍了传输层的UDP协议和TCP协议&#xff0c;以及在Java中如何通过Socket套接字实现网络编程&#xff08;内附UDP和TCP版本的回显服务器代码&#xff09; 一.网络通信 网络编程&#xff0c;就是写一个应用程序&#xff0c;让这个程序可以使用网络通信&#xff0c;这里就…

Day9力扣打卡

打卡记录 掷骰子等于目标和的方法数&#xff08;动态规划&#xff09; 链接 用 f[i][j] 表示投了 i 次投骰子得到点数总和&#xff0c;从而得到状态转移方程 f[i][j]f[i−1][j]f[i−1][j−1]⋯f[i−1][j−min(k−1,j)] 。 class Solution { public:int numRollsToTarget(int…

Tauri2 mobile development traps

时间点&#xff1a;2023/10/24。最近在倒腾移动端开发&#xff0c;不想学原生和 flutter&#xff0c;试了试 react-native&#xff0c;开发体验没有想象中的舒服&#xff0c;干脆直接上 tauri 2 吧&#xff0c;半年前就听说 tauri 2 支持移动端&#xff0c;到现在应该可堪小用。…

Qwt开发环境搭建(保姆级教程)

1.简介 QWT&#xff0c;即Qt Widgets for Technical Applications&#xff0c;其目标是以基于2D方式的窗体部件来显示数据&#xff0c; 数据源以数值&#xff0c;数组或一组浮点数等方式提供&#xff0c; 输出方式可以是Curves&#xff08;曲线&#xff09;&#xff0c;Slider…

C++入门01—从hello word!开始

1.第一个C程序 1.1 创建项目 第一次使用Visual Studio时&#xff1a; 1.2 创建文件 1.3 编写代码 编写第一个代码&#xff1a; #include<iostream> using namespace std; int main() {cout << "hello word!" << endl;system("pause"…

vue3+vite在线预览pdf

效果图 代码 <template><div class"pdf-preview"><div class"pdf-wrap"><vue-pdf-embed :source"state.source" :style"scale" class"vue-pdf-embed" :page"state.pageNum" /></div…