Python 算法高级篇:图的表示与存储优化

Python 算法高级篇:图的表示与存储优化

  • 引言
  • 1. 什么是图?
  • 2. 图的基本概念
  • 3. 图的表示方法
    • 3.1. 临接矩阵表示
      • 临接矩阵的优点:
      • 临接矩阵的缺点:
    • 3.2. 邻接表表示
      • 邻接表的优点:
      • 邻接表的缺点:
  • 4. 优化的存储方法
    • 4.1. 邻接矩阵的压缩表示
    • 4.2. 邻接表的哈希表表示
  • 5. 使用示例
  • 6. 总结

引言

图是计算机科学中一种重要的数据结构,用于表示各种关系和网络。在算法高级篇课程中,我们将深入探讨如何有效地表示和存储图,以及如何优化这些表示方法。本文将详细介绍图的基本概念、不同的表示方法,以及如何在 Python 中实现它们。

😃😄 ❤️ ❤️ ❤️

1. 什么是图?

图是由节点(顶点)和它们之间的边组成的抽象数据结构。它可以用来表示各种关系,例如社交网络中的朋友关系、城市之间的道路连接、计算机网络中的数据传输等。在图中,节点表示实体,边表示实体之间的关系。

图的一些重要概念包括:

  • 节点(顶点):图中的单个实体,可以包含各种信息。
  • 边:连接两个节点的关系。边可以是有向的(从一个节点到另一个节点)或无向的(双向的)。
  • 权重:边可以带有权重,表示两个节点之间的距离、成本或其他度量。
  • 路径:节点序列,其中任意两个相邻节点都由边连接。
  • 环:形成一个循环的边的序列,它从一个节点出发,经过一些节点,最终回到出发节点。

2. 图的基本概念

在图论中,有一些基本概念值得了解:

  • 有向图和无向图:有向图中的边有方向,从一个节点指向另一个节点。无向图中的边没有方向,可以双向移动。
  • 度:节点的度是与该节点相关联的边的数量。在有向图中,通常分为入度和出度。
  • 路径:路径是连接图中节点的边的序列。
  • 连通图和非连通图:如果在图中任意两个节点之间都存在至少一条路径,那么图是连通的。否则,它是非连通的。
  • 环路:图中的环路是一个节点序列,从一个节点出发,经过一些节点,最终回到出发节点。

3. 图的表示方法

在计算机中,有多种方法可以表示图,每种方法都有其优势和劣势。以下是两种常见的图表示方法:

3.1. 临接矩阵表示

临接矩阵是一个二维数组,其中行和列分别表示图的节点。如果节点 i 与节点 j 之间存在边,则在矩阵中的 ( i , j ) 和 ( j , i ) 位置上将包含相应的信息,如权重。否则,这些位置将包含空值或零。

临接矩阵的优点:

  • 适用于稠密图(边数量接近节点数量的平方)。
  • 可以进行快速的节点之间边的查找和更新操作。

临接矩阵的缺点:

  • 浪费空间,对于稀疏图,很多位置都是空的。
  • 难以表示带有循环的图。

3.2. 邻接表表示

邻接表是一种更节省空间的表示方法,其中每个节点都维护一个与其相邻的节点列表。

邻接表的优点:

  • 适用于稀疏图,因为它不浪费空间来表示不存在的边。
  • 可以轻松表示带有循环的图。

邻接表的缺点:

  • 查找两个节点之间的边可能需要遍历列表,效率较低。
  • 不适用于快速查找整个图的全局性质。

4. 优化的存储方法

在实际应用中,我们经常需要在表示图时进行优化,以便更有效地处理各种操作。以下是一些优化方法:

4.1. 邻接矩阵的压缩表示

对于稀疏图,可以使用邻接矩阵的压缩表示,如稀疏矩阵或邻接列表数组,以减少空间消耗。

4.2. 邻接表的哈希表表示

使用哈希表来表示邻接表,以加速节点之间边的查找。

5. 使用示例

让我们通过一个简单的示例来演示如何在 Python 中表示图。我们将创建一个无向图,并使用邻接表表示法。

class Graph:
    def __init__(self):
        self.graph = {}

    def add_edge(self, u, v):
        if u in self.graph:
            self.graph[u].append(v)
        else:
            self.graph[u] = [v]
        if v in self.graph:
            self.graph[v].append(u)
        else:
            self.graph[v] = [u]

    def __str__(self):
        result = ""
        for node, neighbors in self.graph.items():
            result += f"{node}: {neighbors}\n"
        return result

# 创建一个图并添加边
g = Graph()
g.add_edge(1, 2)
g.add_edge(2, 3)
g.add_edge(3, 1)

# 打印图的邻接表表示
print(g)

上述代码创建了一个图对象,通过 add_edge 方法添加边,并使用邻接表表示图。最后,打印出了图的邻接表表示。

6. 总结

图是一个重要的数据结构,用于表示各种关系和网络。在算法高级篇课程中,我们深入研究了图的表示和存储方法,包括邻接矩阵和邻接表。我们还讨论了如何在实际应用中进行优化,以更有效地处理各种操作。通过了解这些概念,你将能够更好地理解和应用图算法,从而解决各种实际问题。

如果你有兴趣进一步学习图算法,可以探索最短路径算法、最小生成树算法、图遍历算法等内容。图算法在社交网络分析、路线规划、网络分析等领域都有广泛的应用,是算法高级篇课程中的重要主题之一。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

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

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

相关文章

[python 刷题] 974 Subarray Sums Divisible by K

[python 刷题] 974 Subarray Sums Divisible by K 题目如下: Given an integer array nums and an integer k, return the number of non-empty subarrays that have a sum divisible by k. A subarray is a contiguous part of an array. 依旧是 prefix sum 的变种…

Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

MapReduce原理分析 什么是MapReduce 前言:如果想知道一堆牌中有多少张红桃,直接的方式是一张张的检查,并数出有多少张红桃。 而MapReduce的方法是,给所有的节点分配这堆牌,让每个节点计算自己手中有几张是红桃&#…

IOC课程整理-20 Spring 应用上下文生命周期

0.目录 1. Spring 应用上下文启动准备阶段 2. BeanFactory 创建阶段 3. BeanFactory 准备阶段 4. BeanFactory 后置处理阶段 5. BeanFactory 注册 BeanPostProcessor 阶段 6. 初始化內建 Bean:MessageSource 7. 初始化內建 Bean:Spring 事件广播器…

【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)

文章目录 2678. 老人的数目(简单遍历模拟)1155. 掷骰子等于目标和的方法数(动态规划)2698. 求一个整数的惩罚数(预处理dfs回溯)2520. 统计能整除数字的位数(简单模拟)1465. 切割后面…

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一:字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…

关于FTP的一些往事

公司每天都要从美国的服务器下载大量的语音文件。然后根据语音的内容完成相关的医疗报告。不同语音的实时性要求是不一样的,有些要求6小时内完成(TAT6) ,有些则是12小时。中美之间的网速又特别慢,所以,如何…

shell脚本变量

目录 1.变量的定义 2.shell脚本中变量的定义方法 3.变量的转译 4.Linux中命令的别名设定 5.用户环境变量的更改 6.利用命令的执行结果设定变量 7.脚本函数 1.变量的定义 1)定义本身 变量就是内存一片区域的地址 2)变量存在的意义 命令无法操作一直变化的目…

14. 机器学习 - KNN 贝叶斯

Hi,你好。我是茶桁。 咱们之前几节课的内容,从线性回归开始到最后讲到了数据集的处理。还有最后补充了SOFTMAX。 这些东西,都挺零碎的,但是又有着相互之间的关系,并且也都蛮重要的。并且是在学习机器学习过程当中比较…

【赠书活动】从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

测开 (性能测试)

目录 前言 1、性能测试和功能测试的区别 2、性能好与不好的表现 3、性能测试衡量指标 && 名称解释 指标一:并发用户数 指标二:响应时间 / 平均响应时间 指标三:事务 指标四:点击率(Hit Per Second&…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

数据交换技术

一、数据交换 数据交换是实现在大规模网络核心上进行数据传输的技术基础。 常见的数据交换技术包括 电路交换报文交换分组交换 基于不同交换技术构建的网络分别称之为电路交换网络、报文交换网络和分组交换网络。 发展演变图: a) 电路交换 电路交换是最早出现…

JEnv使用初体验

Java多版本控制器初体验 1、前言 由于公司项目使用jdk8版本,而日常学习会使用其他版本例如jdk17等,往常都是修改环境配置目录实现。 2、下载资料 链接:https://pan.baidu.com/s/1UqzHv8K8WBu-75Ysyc_h3A 提取码:ra6a 3、安装 …

TYWZOJ 种树苗 待定题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路与部分实现完整代码 题目描述 在游戏 Minecraft 中,玩家可以通过种树来使木材再生。玩家需要将树苗种在泥土上,然后等待它长成大树,期间可以利用骨粉来催熟树苗。…

Linux——文件权限属性和权限管理

文件权限属性和权限管理 本章思维导图: 注:本章思维导图对应的Xmid文件和.png文件都以传到“资源” 文章目录 文件权限属性和权限管理1. sudo提权和sudoers文件1.1 sudo提权和成为root的区别 2. 权限2.1 Linux群体2.1.1 为什么要有所属组2.1.2 修改文件…

汇编运算符和表达式

运算符: 汇编语言由表达式和运算符组成,运算符分为数值运算符和属性运算符。属性运算符面向变量或标号。 数值运算符: 算术运算符: 运算符类型 ✓ ( 正号 ) 、 -( 负号 ) ✓ ( 加 ) 、 -( 减 ) 、 *( 乘 ) 、 /( 除 ) 、 MO…

centos中安装Mysql8.0

其实和mysql5.7的安装差不多 1.root用户 2.更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 3.安装mysql yum库 rpm -Uvh https://dev.mysql.com/ get/mysql80-community-release-el7-2.noarch.rpm 4.通过上两步,我们就可以使用yum去安装…

2023-10-21 美团2024秋招后端开发岗笔试题

1 考察dfs和拓扑排序 1.1 题目描述(如果拓扑排序不清楚可以去做一下lc 207. 课程表) 1.2 答案 import java.util.*;public class Meituan {static int m,n;public static void main(String[] args) {Scanner in new Scanner(System.in);m in.nextInt…

Controller接收Postman的raw参数时,属性值全部为空

Controller接收Postman的raw参数时,属性值全部为空 情景再现 在进行业务代码的编写过程中,使用Postman等工具调用Controller接口时,发现属性值全部为空后端代码如下: Requset对象为: public class QuerySkuRequest …

Openssl数据安全传输平台017:客户端在Linux上的编译与调试

客户端代码在widows上编译,除了protobuf找不到目录,其他的基本没有什么问题。 然后打开虚拟机,项目文件已经在/home/projects目录下了 进入项目文件,对代码进行编译 第一次 // 找不到protobuf g *.cpp *.cc -ljson -lpthread -…