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

 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中的节点排序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

语雀崩了,免费送VIP6个月,赶紧薅!!

一、前言 在一个无聊的周一&#xff0c;下午浑浑噩噩的时候&#xff0c;一条公众号信息引起我的关注。 什么东西&#xff1f;语雀这种量级的产品也能崩&#xff1f; 看了一下还真是官方公众号发的&#xff01;&#xff01; 心里不由得出现&#xff0c;完蛋整个团队要打包遣…

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

RetentionPolicy枚举类

包名package java.lang.annotation 作用 注释保留策略。此枚举类型的常量描述用于保留注释的各种策略。它们被使用与&#xff5b; Retention&#xff5d;元注释类型一起指定注释要保留多长时间。 属性 SOURCE编译器将丢弃注释。CLASS注释将由编译器记录在类文件…

Docker网络与资源控制

Docker网络与资源控制 一、Docker网络模式1.1、Docker网络实现原理1.2、Docker的网络模式1.2.1、host模式1.2.2、Container模式1.2.3、None模式1.2.4、 Bridge模式1.2.5、自定义网络 二、资源控制2.1、CPU 资源控制2.1.1、设置CPU使用率上限2.1.2、进行CPU压力测试2.1.3、设置C…

vue首页多模块布局(标题布局)

<template><div class"box"><div class"content"><div class"box1" style"background-color: rgb(245,23,156)">第一个</div><div class"box2" style"background-color: rgb(12,233,…

霸王条款惹品牌争议,京东双11站在商家对立面?

作者 | 江北 来源 | 洞见新研社 双11活动第一天&#xff0c;京东就站上了风口浪尖。 与烘焙烤箱品牌海氏的话题接连登上微博热搜&#xff0c;海氏控诉京东滥用市场竞争地位&#xff0c;破坏市场竞争秩序。在海氏的声明中&#xff0c;京东的行为让吃瓜群众大开眼界&#xff1a…

智能井盖监测系统功能,万宾科技传感器效果

智能井盖传感器的出现是高科技产品的更新换代&#xff0c;同时也是智慧城市建设中的需求。在智慧城市建设过程之中&#xff0c;高科技产品的应用数不胜数&#xff0c;智能井盖传感器的出现&#xff0c;解决了城市道路安全保护着城市地下生命线&#xff0c;改善着传统井盖带来的…

Hive安装配置笔记

版本说明 hadoop-3.3.6&#xff08;已安装&#xff09; mysql-8&#xff08;已安装&#xff09; hive-3.1.3 将hive解压到对应目录后做如下配置&#xff1a; 基本配置与操作 1、hive-site <configuration><!-- jdbc连接的URL --><property><name>ja…

微信小程序菜单导航选中自动居中

菜单导航选中自动居中 示例库 代码片段

Android Studio模拟器/虚拟设备连接互联网的方法

如图&#xff0c;无线、网络都无法联网 找到本机的DNS 找到emu-launch-params.txt&#xff0c;添加DNS -dns-server 192.168.124.1 重启虚拟机&#xff0c;关闭无线

智慧公厕:打造更美好的城市生活环境

在信息技术迅猛发展的今天&#xff0c;智慧公厕作为一种创新的城市管理模式&#xff0c;正逐渐受到人们的关注。以物联网、大数据、人工智能为基础&#xff0c;智慧公厕正逐步改变传统公厕的面貌&#xff0c;为城市居民提供更便捷、舒适的公共服务。本文将以智慧公厕源头厂家广…

机械设计制造,设计行业图纸透明加密保护。防止内部终端核心文件数据、资料外泄

当下互联网时代&#xff0c;许多设计单位的设计图纸都是以电子文件的形式存在于终端电脑和服务器上。在图纸的设计生产过程中&#xff0c;必定会经过多个部门人员之手&#xff0c;此过程中就隐藏着巨大的风险。所以&#xff0c;设计单位需要使用专业的图纸加密软件来保护内部图…

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

本文主要分享2021年下半年系统架构师综合知识历年真题以及本人在做题时的所思所想。题目序号有点混乱&#xff0c;可忽略 【01】.某计算机系统页面大小为4K&#xff0c;进程P1的页面变换表如下图所示&#xff0c;看P1要访问数据的逻辑地址为十六进制1B1AH,那么该逻辑地址经过变…

DDOS直接攻击系统资源

DDOS ——直接攻击系统资源 思路&#xff1a; 攻击机利用三次握手机制&#xff0c;产生大量半连接&#xff0c;挤占受害者系统资源&#xff0c;使其无法正常提供服务。 1、先体验下受害者的正常网速。在受害者主机上执行以下命令 (1)开启Apache。 systemctl start apache2 (2…

【QT】其他常用控件2

新建项目 lineEdit 什么都不显示&#xff08;linux password&#xff09; password textEdit和plainTextEdit spinBox和doubleSpinBox timeEdit、dateEdit、dateTimeEdit label 显示图案&#xff0c;导入资源&#xff1a;【QT】资源文件导入_复制其他项目中的文件到qt项目中_St…

rabbitmq-3.8.15集群、集群镜像模式安装部署

目录 一、环境 1、映射、域名、三墙 2、Erlang和socat安装&#xff08;三台服务器都实行&#xff09; 二、部署三台rabbitmq-3.8.15实例 1、rabbitmq官网下载地址 &#xff1a; 2、解压rabbitmq 3、添加系统变量 4、启动web插件、启动rabbitmq 5、在rabbitmq1上添加用…

HackTheBox---Starting Point-- Tier 0---Meow

文章目录 一 题目二 实验过程 一 题目 Tags Telnet、Network、Protocols、Reconnaissance、Weak Credentials、Misconfiguration译文&#xff1a;标签、远程登录、网络、协议、侦察、弱凭证、配置错误Connect To attack the target machine, you must be on the same networ…

在pycharm中创建python模板文件

File——>Setting——>File and Code Templates——>Python Scripts 在文本框中输入模板内容

RabbitMQ 笔记

一、win10安装erlang 1.1 安装erLang语言&#xff0c;配置环境变量 erLang官网地址 1.2 配置环境变量 &#xff08;1&#xff09;添加系统变量ERLANG_HOME &#xff08;2&#xff09;path路径&#xff0c;指向bin目录 1.3 配置完成后再cmd命令窗口erl -version可以查看…

Lua与C++交互

文章目录 1、Lua和C交互2、基础练习2.1、加载Lua脚本并传递参数2.2、加载脚本到stable&#xff08;包&#xff09;2.3、Lua调用c语言接口2.4、Lua实现面向对象2.5、向脚本中注册c的类 1、Lua和C交互 1、lua和c交互机制是基于一个虚拟栈&#xff0c;C和lua之间的所有数据交互都通…