入度与出度在数据结构中的应用

文章目录

    • 应用案例
      • 1. 邻接矩阵
      • 2. 邻接链表
      • 3. 邻接集(字典实现)
      • 4. 入度列表(基于邻接链表计算)
    • 特别补充
      • 3. 邻接集计算入度(补充)
      • 4. 邻接多重表(概念介绍)

入度和出度是图论中的概念,主要应用于有向图的数据结构中。这些概念并不直接划分数据结构的类型,而是描述有向图中顶点的特性。然而,理解入度和出度有助于我们分析和操作不同类型的图数据结构。以下是几种与有向图及其入度、出度概念紧密相关的数据结构:

  1. 邻接矩阵:

    • 邻接矩阵是一种使用二维数组来表示图中顶点之间连接关系的数据结构。对于有向图,矩阵的第i行第j列的值表示从顶点i到顶点j的边的存在与否,以及可能的权重。通过遍历矩阵的行可以轻易计算出每个顶点的出度,遍历列则可得到入度。其空间复杂度为O(|V|^2),其中|V|是顶点的数量。
  2. 邻接链表:

    • 邻接链表是另一种常用的图表示方法,特别适合边较少的稀疏图。每个顶点都有一个链表,链表中包含了所有从该顶点出发的边(即出度信息),链表中的节点通常会包含指向目标顶点的指针或索引以及边的权重等信息。为了获取入度,通常需要额外的数据结构,如逆邻接链表,或者遍历所有链表来统计指向每个顶点的边数。
  3. 入度列表(或称为逆邻接链表):

    • 当需要频繁查询顶点的入度时,可以维护一个额外的链表或数组来直接记录每个顶点的入度情况。每个顶点对应的链表或数组条目存储了所有指向该顶点的边的信息,这使得计算入度变得直接且高效。
  4. 邻接多重表:

    • 对于允许每对顶点间有多条边(多重图)的情况,邻接多重表会在邻接链表的基础上为每个顶点对维护一个链表,链表中包含了所有从一个顶点到另一个顶点的边。这种结构同时方便了出度和入度的计算,尽管它比基本的邻接链表或矩阵更为复杂,占用更多的内存。

这些数据结构都是围绕图的表示和操作设计的,入度和出度的概念在这些结构中用于描述图中顶点的连接特性,并非直接划分数据结构类型,而是作为这些结构中顶点属性的一部分被考量。

应用案例

针对入度与出度的计算,我们将分别展示四种数据结构的具体应用案例:邻接矩阵、邻接链表、邻接集(使用Python字典实现),以及通过邻接链表计算后生成的入度列表。这里,我们以一个简单的有向图为例,包含顶点集合['A', 'B', 'C', 'D'],以及边集合['A'->'B', 'A'->'C', 'B'->'C', 'C'->'D', 'D'->'A']

1. 邻接矩阵

def adjacency_matrix(degrees):n = len(degrees)matrix = [[0]*n for _ in range(n)]for from_v, to_vs in degrees.items():for to_v in to_vs:matrix[ord(from_v) - ord('A')][ord(to_v) - ord('A')] = 1return matrixdegrees = {'A': ['B', 'C'], 'B': ['C'], 'C': ['D'], 'D': ['A']}
matrix = adjacency_matrix(degrees)
# 计算入度和出度
out_degrees = [sum(row) for row in matrix]
in_degrees = [sum(col) for col in zip(*matrix)]
print("邻接矩阵表示:")
print(*matrix, sep='\n')
print("出度:", out_degrees)
print("入度:", in_degrees)

2. 邻接链表

class Graph:def __init__(self):self.adj_list = {}def add_edge(self, from_v, to_v):if from_v not in self.adj_list:self.adj_list[from_v] = []self.adj_list[from_v].append(to_v)def calculate_degrees(self):in_degrees = {v: 0 for v in self.adj_list}out_degrees = {v: 0 for v in self.adj_list}for from_v, to_vs in self.adj_list.items():out_degrees[from_v] = len(to_vs)for to_v in to_vs:in_degrees[to_v] += 1return in_degrees, out_degreesgraph = Graph()
graph.add_edge('A', 'B')
graph.add_edge('A', 'C')
graph.add_edge('B', 'C')
graph.add_edge('C', 'D')
graph.add_edge('D', 'A')in_degrees, out_degrees = graph.calculate_degrees()
print("邻接链表表示:")
print("出度:", out_degrees)
print("入度:", in_degrees)

3. 邻接集(字典实现)

def adjacency_set(degrees):graph_dict = {v: set() for v in degrees}for from_v, to_vs in degrees.items():for to_v in to_vs:graph_dict[from_v].add(to_v)return graph_dict# 注意:直接使用邻接集计算入度不如邻接链表直观,因此计算入度时通常需要额外处理或转换
graph_dict = adjacency_set(degrees)
out_degrees = {v: len(edges) for v, edges in graph_dict.items()}
# 计算入度需要额外逻辑,此处略去直接展示结果
print("邻接集表示:")
print("出度:", out_degrees)
# 实际应用中,可能需要遍历所有边,统计每个顶点作为目标的次数来获得入度

4. 入度列表(基于邻接链表计算)

由于直接计算入度列表通常依赖于邻接链表或其他形式的图表示,上述邻接链表示例中已隐含了如何生成入度列表。这里不单独列出新代码,因为计算入度列表的过程已经在邻接链表的示例中体现出来,即通过遍历邻接链表并计数。

以上代码展示了不同数据结构下如何表示有向图以及如何计算每个顶点的入度和出度。请注意,实际应用中根据具体需求选择合适的数据结构,以达到最优的性能和资源利用率。

特别补充

为了进一步完善解释并提供一个全面的理解,让我们通过一个额外的例子来展示如何直接从邻接集计算入度,同时简要介绍一种高级数据结构——邻接多重表,它在处理具有多重边的图时特别有用。

3. 邻接集计算入度(补充)

前面提到,从邻接集直接计算入度不如邻接链表直观,但可以通过遍历整个邻接集来实现。下面是完成这一过程的代码补充:

def calculate_in_degrees(adjacency_set):in_degrees = {vertex: 0 for vertex in adjacency_set}for edges in adjacency_set.values():for edge in edges:in_degrees[edge] += 1return in_degrees# 使用之前的邻接集示例
graph_dict = adjacency_set(degrees)
in_degrees = calculate_in_degrees(graph_dict)
print("基于邻接集计算的入度:", in_degrees)

4. 邻接多重表(概念介绍)

邻接多重表是针对含有重边(两个顶点之间有多条边)和自环的图的一种数据结构。它扩展了邻接链表的概念,每个链表项不仅包含指向下一个节点的指针,还记录了该边的权值(如果图是有权图的话)以及边的数量。对于无权图,只需记录边的数量。

虽然不提供具体代码实现,邻接多重表的基本结构可以描述如下:

顶点A -> (边数: 2, 指向B的链表) -> 顶点B -> (边数: 1, 指向C的链表) -> 顶点C ...

在这个结构中,每个链表头会有一个计数器说明该链表包含了多少条指向后续顶点的边。如果有向图中允许存在多条从一个顶点到另一个顶点的边,邻接多重表能准确地反映这一点,并且便于快速计算出度和入度。

总结而言,不同的数据结构适用于图的不同特性和操作需求。邻接矩阵适合于稠密图和需要快速查询两点间是否存在边的场景;邻接链表和邻接集(字典)则更适合稀疏图,特别是当关注空间效率或频繁进行遍历时;而邻接多重表则专为处理具有多重边的图设计。

😍😍 海量H5小游戏、微信小游戏、Web casualgame源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

手机误删图片怎么办?2个照片恢复大师来帮忙,轻松找回

手机照片早已成为我们日常生活中的一部分,记录着欢笑、泪水等各种瞬间。但有时候,因为各种原因,它们会突然消失,让人痛心疾首。照片恢复有哪些方法呢?别急,今天就给大家带来2位照片恢复大师,它们…

【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧

0501 多线程管理 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 0501 多…

[C++] 由浅入深理解面向对象思想的组成模块

文章目录 (一) 类的默认成员函数(二) 构造函数构造函数的特征构造函数示例无参构造带参构造 冲突:全缺省参数的构造函数与无参构造函数 (三)析构函数特性析构函数的析构过程解析 (四)拷贝构造函数什么是拷贝构造?特性为…

数据结构——单链表详解(超详细)(2)

前言: 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现,不过为了保证文章的简洁,小编把它分成了两篇来写,这一篇小编紧接上一篇文章继续写单链表函数功能的实现: 目录: 1.单链表剩余函数的编写 1.…

MBR40150FCT-ASEMI无人机专用MBR40150FCT

编辑:ll MBR40150FCT-ASEMI无人机专用MBR40150FCT 型号:MBR40150FCT 品牌:ASEMI 封装:TO-220F 批号:最新 最大平均正向电流(IF):40A 最大循环峰值反向电压(VRRM&a…

小程序-视图与逻辑

一、页面导航 声明式导航 编程式导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onload中接收导航参数 二、页面事件 下拉刷新 上拉触底 三、生命周期 分类 生命周期函数分类 1.应用的生命周期函数 2.页面的生命周期函数 四、WXS脚本 基础语法 wxs的特点 五、案…

智能硬件——0-1开发流程

文章目录 流程图1. 市场分析具体分析 2. 团队组建2. 团队组建早期团队配置建议配置一:基础型团队 (4人)配置二:扩展型团队 (6人)配置三:全面型团队 (7人) 3. 产品需求分析4. ID设计(Industrial Design, 工业设计)5. 结…

MathType加载项被word禁用怎么办 MathType加载到Word不能用

Word中的MathType加载项是指将MathType软件与Word文档进行关联的一项功能。它允许用户在Word中直接使用MathType的功能,方便地输入和编辑数学公式等内容。通过加载项,MathType的强大数学公式编辑能力可以与Word的文档处理功能相结合,提高工作…

谷歌账号异常的常见8种状态,前三种有望立刻恢复,越往后越难(1)

生搬硬套列夫•托尔斯泰的一句话名言“幸福的家庭都是相似的,不幸的家庭各有各的不幸。” 工作、学习、娱乐中需要使用谷歌账号的朋友可能会发现,幸福的人就是谷歌账号一直都好好的,每次登陆都如所愿,丝滑无比。但是“不幸”的人就会发现&am…

【微信小程序知识点】自定义构建npm

在实际开发中,随着项目的功能越来越多,项目越来越复杂,文件目录也变得很繁琐,为了方便进行项目的开发,开发人员通常会对目录结构进行优化调整,例如:将小程序源码放到miniprogram目录下。 &…

电脑型号数据源的性能提升:新一代技术的突破

随着科技的不断发展,电脑型号的数据源性能也得到了显著的提升。新一代技术的突破使得电脑型号的数据源更加准确、全面且易于使用。本文将从代码的角度解释这一突破,并参考挖数据平台的内容,向大家介绍电脑型号数据源的性能提升。 首先&#…

【scrapy】——个人笔记

scrapy简介 Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。 Scrapy吸引人的地方在于它是一个框架,任何人都可…

HEVC编码中的MPM(最可能模式,Most Probable Mode)

简介 最近看到有文章用视频编码时的MPM参数来映射特征并用于数字取证,故做该文章记录。 HEVC(高效视频编码)中的MPM(最可能模式,Most Probable Mode)用于预测帧内块的模式,以提高编码效率并减…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【ABB】示教器可编程按钮的配置

【ABB】示教器可编程按钮的配置 操作流程演示 操作流程 首先我要配置的是如图所示控制器上的四个按钮,这四个按钮是可以自定义功能的。 点击【菜单】点击【Control Panel】点击【ProgKeys】即可配置对应按键功能 演示 点击【菜单】 点击【配置可编程按键】 这里…

12306高铁票如何打印电子发票?

高铁票报销凭证电子版如何打印? 高铁票报销目前没有电子发票形式,只有纸质版报销凭证,不过虽然没有电子版报销凭证,但是可以通过多种方式获取纸质版报销凭证。 报销凭证只能打印一次,丢失不能补打,请妥善…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…

Stable Diffusion教程|视频转绘有手就会Ebsynth Utility应用详解

过去这几个月,相信很多同行都已经见识到了AIGC强大的风格化绘图能力,不仅能够做出高品质的美术资产,还可以将制作效率大幅提高,这也是AI概念如今在资本市场受热捧的重要原因。 不过,目前我们所见到的大部分图形&#…

把当前img作为到爷爷的背景图

(忽略图大小不一致,一般UI给的图会刚好适合页面大小,我这网上找的图,难调大小,我行内的就自己随便写的宽高),另外悄悄告诉你最后有简单方法~~ 先来看看初始DOM结构代码 …

支付宝低代码搭建电商小程序,无需编程,可视化操作

大家好,我是小悟 在数字化浪潮的推动下,为了更快速、高效地搭建电商小程序,支付宝低代码平台凭借其独特优势,为商家提供了便捷的解决方案。 支付宝低代码平台犹如一座精心打造的智慧工坊,让电商小程序的搭建变得轻而易…