当前位置: 首页 > news >正文

非线性数据结构之图

一、有向图(Directed Graph)

1. 定义

有向图是一个由顶点(节点)和有方向的边(弧)组成的图。在有向图中,每条边都有一个起点和一个终点,表示从一个顶点到另一个顶点的关系。

2. 特点
  • 边有方向:每条边都有一个方向,通常用箭头表示。例如,边 A→B 表示从顶点 A 到顶点 B。
  • 可能存在孤立点:有向图中的某些顶点可能没有入边或出边。
  • 可有多个入度和出度:顶点的入度是指指向该顶点的边数,出度是指从该顶点出发的边数。
3. 优缺点
  • 优点

    • 能够准确表示有向关系,如网页链接、任务调度等。
    • 适合表示不对称的关系。
  • 缺点

    • 复杂性较高,特别是在涉及遍历和路径寻找时。
    • 算法实现相对复杂,如最短路径算法。
4. 应用场景
  • 网络路由:表示计算机网络中的连接。
  • 任务调度:表示任务之间的依赖关系。
  • 图形界面:表示用户界面元素之间的交互。
5. 示例

有向图可以用邻接表或邻接矩阵表示。以下是一个有向图的示例:

示例代码(Java 实现)

import java.util.*;class DirectedGraph {private Map<String, List<String>> adjacencyList;public DirectedGraph() {adjacencyList = new HashMap<>();}public void addVertex(String vertex) {adjacencyList.putIfAbsent(vertex, new ArrayList<>());}public void addEdge(String from, String to) {adjacencyList.putIfAbsent(from, new ArrayList<>());adjacencyList.putIfAbsent(to, new ArrayList<>());adjacencyList.get(from).add(to);}public List<String> getNeighbors(String vertex) {return adjacencyList.get(vertex);}
}

二、无向图(Undirected Graph)

1. 定义

无向图是一个由顶点和无方向的边组成的图。在无向图中,边连接两个顶点,但没有方向。

2. 特点
  • 边无方向:边表示的是两个顶点之间的关系,通常用线段表示。例如,边 A−B 表示顶点 A 和顶点 B 是相连的。
  • 每条边相互对称:如果存在边 A−B,则同时存在边 B−A。
  • 所有顶点具有相同的边关系
3. 优缺点
  • 优点

    • 适合表示对称关系,如社交网络、朋友关系。
    • 较简单的算法实现。
  • 缺点

    • 对于某些应用,缺乏表达方向性的能力。
    • 在某些情况下,图的结构可能会显得过于简单。
4. 应用场景
  • 社交网络:表示用户之间的朋友关系。
  • 电路设计:表示电路中元件之间的连接。
  • 城市交通:表示城市道路网络。
5. 示例

无向图可以用邻接表或邻接矩阵表示。以下是一个无向图的示例:

示例代码(Java 实现)

import java.util.*;class UndirectedGraph {private Map<String, List<String>> adjacencyList;public UndirectedGraph() {adjacencyList = new HashMap<>();}public void addVertex(String vertex) {adjacencyList.putIfAbsent(vertex, new ArrayList<>());}public void addEdge(String vertex1, String vertex2) {adjacencyList.putIfAbsent(vertex1, new ArrayList<>());adjacencyList.putIfAbsent(vertex2, new ArrayList<>());adjacencyList.get(vertex1).add(vertex2);adjacencyList.get(vertex2).add(vertex1); // 无向边}public List<String> getNeighbors(String vertex) {return adjacencyList.get(vertex);}
}

三、加权图(Weighted Graph)

1. 定义

加权图是一个图,其中每条边都分配有一个权重(或成本)。权重可以表示距离、时间、费用等多种含义。

2. 特点
  • 每条边有权重:边的权重通常是一个数值,表示从一个顶点到另一个顶点的代价。
  • 支持最短路径计算:适合用于计算从一个顶点到另一个顶点的最短路径。
  • 可以是有向或无向图:加权图可以是有向的或无向的。
3. 优缺点
  • 优点

    • 能够表示复杂的关系,如交通网络、物流等。
    • 可以使用多种算法(如 Dijkstra、Bellman-Ford)进行路径优化。
  • 缺点

    • 处理复杂性较高,尤其是在大量边和顶点的情况下。
    • 可能导致计算错误,尤其在负权重情况下(如 Bellman-Ford 算法)。
4. 应用场景
  • 地图导航:用于计算从起点到终点的最短路径。
  • 网络流量:分析和优化网络数据传输。
  • 电路分析:计算电路中元件之间的电流和电压。
5. 示例

加权图的表示通常使用邻接表或邻接矩阵。以下是一个加权图的示例:

示例代码(Java 实现)

import java.util.*;class WeightedGraph {private Map<String, List<Edge>> adjacencyList;class Edge {String destination;int weight;Edge(String destination, int weight) {this.destination = destination;this.weight = weight;}}public WeightedGraph() {adjacencyList = new HashMap<>();}public void addVertex(String vertex) {adjacencyList.putIfAbsent(vertex, new ArrayList<>());}public void addEdge(String from, String to, int weight) {adjacencyList.putIfAbsent(from, new ArrayList<>());adjacencyList.putIfAbsent(to, new ArrayList<>());adjacencyList.get(from).add(new Edge(to, weight));adjacencyList.get(to).add(new Edge(from, weight)); // 如果是无向图}public List<Edge> getNeighbors(String vertex) {return adjacencyList.get(vertex);}
}

总结比较

图类型边的方向性权重适用场景
有向图有方向任务调度、网络路由
无向图无方向社交网络、城市交通
加权图有向/无向地图导航、网络流量、电路分析

通过这些详细的介绍,可以更清晰地理解不同图类型的特点和应用场景,为具体问题的解决选择合适的数据结构提供帮助。

相关文章:

非线性数据结构之图

一、有向图&#xff08;Directed Graph&#xff09; 1. 定义 有向图是一个由顶点&#xff08;节点&#xff09;和有方向的边&#xff08;弧&#xff09;组成的图。在有向图中&#xff0c;每条边都有一个起点和一个终点&#xff0c;表示从一个顶点到另一个顶点的关系。 2. 特…...

vue3项目history模式部署404处理,使用 historyApiFallback 中间件支持单页面应用路由

vue3项目history模式部署404处理&#xff0c;使用 historyApiFallback 中间件支持单页面应用路由 在现代的 web 开发中&#xff0c;单页面应用&#xff08;SPA&#xff09;变得越来越流行。这类应用通常依赖于客户端路由来提供流畅的用户体验&#xff0c;但在服务器端&#xf…...

不同的科技查新机构之间有什么区别?

科技查新&#xff0c;作为一种确保科研项目新颖性、先进性的重要手段&#xff0c;在现代科研活动中扮演着至关重要的角色。然而&#xff0c;在众多提供科技查新服务的机构中&#xff0c;它们之间的区别究竟体现在哪些方面呢&#xff1f;本文将从服务内容、专业领域、权威性与客…...

Pycharm,2024最新专业版下载安装配置详细教程!

先来一段官方介绍&#xff0c;PyCharm是一种PythonIDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高级功能…...

BERT预训练的MLM和NSP任务的损失函数都是什么?

引言 BERT预训练过程中包括两个主要任务:Masked Language Modeling(MLM) 和 Next Sentence Prediction(NSP)。 MLM损失函数: 在MLM任务中,模型需要根据上下文预测被MASK掉的词语。具体来说,输入序列中的一部分词语被随机MASK,模型需要依据未被MASK的词语来预测这些被MASK…...

微信发布测试版4.0,碰瓷NT版QQ?

不知有没有小伙伴发现&#xff0c;就在最近&#xff0c;微信推出了全新版本&#xff1a;4.0.0测试版本&#xff0c;张小龙&#xff0c;你在搞什么飞机? 有什么新活儿了嘛 记得上一次发布腾讯QQ的NT版本&#xff0c;在网上也是引发了不小的吐槽。很多网友戏称为“脑瘫”版本&am…...

数据库->视图

目录 一、视图 1.什么是视图 ​编辑 2.创建视图 1.语法 3.使用视图 4.视图的功能 1.屏蔽相关字段 2.对外提供统一访问规范 3.视图和真实表进行表连接查询 5.修改数据 6.注意事项 7.删除视图 1.语法 8.视图的优点 1. 简单性 2. 安全性 3. 逻辑数据独⽴性 4. 重…...

华为HarmonyOS打造开放、合规的广告生态 - 贴片广告

场景介绍 贴片广告是一种在视频播放前、视频播放中或视频播放结束后插入的视频或图片广告。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告&#xff0c;通过AdRequestParams、AdOptions…...

vue3 v-for循环子组件上绑定ref并且取值

vue3 v-for循环子组件上绑定ref并且取值 // 要循环的变量 const views ref([])// 数组存所有ref dom const itemsRef ref([])const refresh (index) > {// 取出ref dom子组件并且调用其方法itemsRef.value[index].initChart() }<div class"block" v-for&quo…...

GitHub个人主页美化

效果展示 展示为静态效果&#xff0c;动态效果请查看我的GitHub页面 创建GitHub仓库 创建与GitHub用户名相同的仓库&#xff0c;当仓库名与用户名相同时&#xff0c;此仓库会被视作特殊仓库&#xff0c;其README.md&#xff08;自述文件&#xff09;会展示在GitHub个人主页…...

云短信平台优惠活动

题目描述 某云短信厂商&#xff0c;为庆祝国庆&#xff0c;推出充值优惠活动。 现在给出客户预算&#xff0c;和优惠售价序列&#xff0c;求最多可获得的短信总条数。 输入描述&#xff1a; 第一行客户预算 M M M&#xff0c;其中 0 < M < 1000000 0<M<100000…...

Pyecharts使用本地文件绘制美国地图

访问我的github仓库outer_resources中的USA.json文件: big_data_analysis/outer_resources/USA.json at main Just-A-Freshman/big_data_analysis 保存到当前目录下; 随后运行代码: from pyecharts import options as opts from pyecharts.charts import Map from pyechar…...

lanqiaoOJ 3255:重新排队 ← STL list 单链表

【题目来源】https://www.lanqiao.cn/problems/3255/learning/【题目描述】给定按从小到大的顺序排列的数字 1 到 n&#xff0c;随后对它们进行 m 次操作&#xff0c;每次将一个数字 x 移动到数字 y 之前或之后。请输出完成这 m 次操作后它们的顺序。【输入格式】第一行为两个数…...

解决虚拟机启动报:此主机支持AMD-V,但AMD-V处于禁用状态

首先要知道你自己使用的主板型号&#xff0c;如果是京东购买的&#xff0c;可以直接上京东去问客服。如果没有订单号&#xff0c;如果能提供正确的主板型号&#xff0c;他们应该也是会帮忙解答的。 您好&#xff0c;AMD 平台与 Intel 平台以及部分新老主板开启虚拟化的步骤和细…...

【安装配置教程】二、VMware安装并配置ubuntu22.04

一、准备&#xff1a; 虚拟机安装ubuntu&#xff0c;首先要先找到一个镜像&#xff0c;可以去ubuntu官方下载一个&#xff0c;地址&#xff1a;下载Ubuntu桌面系统 | Ubuntu&#xff0c;下载好iso的镜像文件后保存好&#xff0c;接下来打开VMware。 二、安装&#xff…...

‌5G SSB(同步信号块)位于物理层‌

‌5G SSB&#xff08;同步信号块&#xff09;位于物理层‌。在5G NR中&#xff0c;SSB由主同步信号&#xff08;PSS&#xff09;、辅同步信号&#xff08;SSS&#xff09;和物理广播信道&#xff08;PBCH&#xff09;组成&#xff0c;这些信号共同构成了SSB。SSB的主要功能是帮…...

40.第二阶段x86游戏实战2-初识lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…...

官方redis安装

网址&#xff1a;1-https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/ 查看是否有redis ubantu&#xff1a;apt-cache policy redis-server centos&#xff1a;yum list redis 或 yum list installed | grep redis apt查…...

OpenEuler 使用ffmpeg x11grab捕获屏幕流,rtsp推流,并用vlc播放

环境准备 安装x11grab(用于捕获屏幕流)和libx264(用于编码) # 基础开发环境&x11grab sudo dnf install -y \autoconf \automake \bzip2 \bzip2-devel \cmake \freetype-devel \gcc \gcc-c \git \libtool \make \mercurial \pkgconfig \zlib-devel \libX11-devel \libXext…...

呼叫中心报工号功能有没有价值?有没有更好的方案?

呼叫中心报工号功能有没有价值&#xff1f;有没有更好的方案&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 呼叫中心报工号功能确实具有一定的价值&#xff0c;主要体现在以下几个方面&…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...