非线性数据结构之图

news2024/11/6 8:34:21

一、有向图(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);
    }
}

总结比较

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

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

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

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

相关文章

虚拟现实技术课程开发思路

文章目录 组队选题立项分工建模说明&#xff1a;场景说明&#xff1a;交互说明&#xff1a; 结语&#xff1a; 前言&#xff1a;最近学弟学妹们反馈水水老师课程开始上强度了。不仅有翻转课堂&#xff0c;还有理论课实验课都要做东西出来。听说理论课是做什么博物馆什么的&…

FPGA视频GTH 8b/10b编解码转PCIE3.0传输,基于XDMA中断架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我已有的 GT 高速接口解决方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图输入Sensor之-->芯片解码的HDMI视频数据组包基于GTH高速接口的视频传输架构GTH IP 简介GTH 基本结构GTH 发送和接收处理…

CSS中常见的两列布局、三列布局、百分比和多行多列布局!

目录 一、两列布局 1、前言&#xff1a; 2. 两列布局的常见用法 两列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 二、三列布局 1.前言 2. 三列布局的常见用法 三列布局的元素示例&#xff1a; 代码运行后如下&#xff1a; 三、多行多列 1.前言 2&…

jmeter结合ansible分布式压测--1数据准备

一、搭建ansible环境 ansible是基于python开发&#xff0c;通过ssh连接客户机执行任务。ansible可以批量系统配置、批量程序部署、批量运行命令等。 1、安装yum install ansible 2、检查ansible的版本:ansible --version 二、利用ansible在其他机器上准备压测数据 1、本地准…

蓬勃发展:移动开发——关于软件开发你需要知道些什么

一、前言 移动开发一直都是软件开发领域中最有趣的领域之一&#xff0c;这是因为&#xff1a; 1、移动开发为“只有一个人”的开发团队提供了一个非常独特的机会&#xff0c;让他可以在相对较短的时间内建立一个实际的、可用的、有意义的应用程序&#xff1b; 2、移动开发也代…

gitmakegdb

git git reset 命令 | 菜鸟教程 (runoob.com) 像嫁接一样 make Makefile | 爱编程的大丙 (subingwen.cn) # 举例: 有源文件 a.c b.c c.c head.h, 需要生成可执行程序 app ################# 例1 ################# app:a.c b.c c.cgcc a.c b.c c.c -o app################# 例…

网络安全认证的证书有哪些?

在网络安全领域&#xff0c;专业认证不仅是个人技术能力的象征&#xff0c;也是职业发展的重要推动力。随着网络安全威胁的日益严峻&#xff0c;对网络安全专业人才的需求也在不断增长。本文将介绍一些网络安全认证的证书&#xff0c;帮助有志于从事网络安全行业的人士了解并选…

初阶数据结构的各种排序方法——冒泡,直接插入,希尔,快排,选择,归并(C语言)

1.交换排序 交换排序基本思想&#xff1a; 所谓交换&#xff0c;就是根据序列中两个记录键值的⽐较结果来对换这两个记录在序列中的位置 交换排序的特点是&#xff1a;将键值较⼤的记录向序列的尾部移动&#xff0c;键值较⼩的记录向序列的前部移动。 1.1冒泡排序 例子&…

qt QFileInfo详解

1、概述 QFileInfo是Qt框架中用于获取文件信息的工具类。它提供了与操作系统无关的文件属性&#xff0c;如文件的名称、位置&#xff08;路径&#xff09;、访问权限、类型&#xff08;是否为目录或符号链接&#xff09;等。此外&#xff0c;QFileInfo还可以获取文件的大小、创…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…

软件压力测试有多重要?北京软件测试公司有哪些?

软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。压力测试是给软件不断加压&#xff0c;强制其在极限的情况下运行&#xff0c;观察它可以运行到何种程度&#xff0c;从而发现性能缺陷。 在数字化时代&#xff0c;用户对软件性能的要求越…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分&#xff0c;图形显示有所变化&#xff0c;美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

进程的调度(超详细解读)

在特别老的操作系统中&#xff0c;进程的调度是根据FIFO调度算法进行调度&#xff0c;先进先出式的调度&#xff0c;其实就是队列&#xff0c;但是不能很好的体现进程的优先级&#xff0c;在上节讲解的进程优先级&#xff0c;知道nice值范围是[-20&#xff0c;19]&#xff0c;然…

【初阶数据结构篇】链式结构二叉树(续)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

【拥抱AI】如何让软件开发在保证数据安全的同时更加智能与高效?

第一、推动软件开发向更加智能化、高效化和创新化方向发展的策略 随着AI技术的不断进步&#xff0c;软件开发正朝着更加智能化、高效化和创新化的方向发展。要实现这一目标&#xff0c;企业需要采取一系列综合性的策略&#xff0c;从技术、管理、文化等多个层面入手。以下是一…

elementUI 点击弹出时间 date-picker

elementUI的日期组件&#xff0c;有完整的UI样式及弹窗&#xff0c;但是我的页面不要它的UI样式&#xff0c;点击的时候却要弹出类似的日期选择器&#xff0c;那怎么办呢&#xff1f; 以下是elementUI自带的UI风格&#xff0c;一定要一个输入框来触发。 这是我的项目中要用到的…

柯桥topik考级韩语培训【韩语干货】表存在的에和에게有什么区别?

相同点 都可以接在体词后&#xff0c;表示存在的地点、场所&#xff0c;以及所有者。 例如&#xff1a; 1&#xff09;여동생이 집에 있어요. 妹妹在家。 2&#xff09; 식당이 도서관 뒤에 있다. 食堂在图书馆后面。 3&#xff09; 언니에게 고급 화장품이 있다. 姐姐有高级…

使用 ABAP GIT 发生 IF_APACK_MANIFEST dump

错误重现 使用经典的 ABAP 系统运行 ZABAPGIT 或者 ZABAPGIT_STANDALONE然后添加在线或者离线项目点击 PullShort dump SYNTAX_ERROR Dump 界面&#xff1a; 解决方案 它发生在 CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname) 语句中。 该语…

多商户电商平台开发指南:基于直播带货系统源码的搭建方案详解

本篇文章&#xff0c;小编将详细解析如何利用直播带货系统源码&#xff0c;快速搭建一套多商户电商平台的解决方案。 一、直播带货系统在多商户电商平台中的应用价值 在多商户电商平台中&#xff0c;直播带货系统可以帮助商家&#xff1a; 1.增加用户互动 2.提升转化率 3.…

【TextIn:开源免费的AI智能文字识别产品(通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等)】

TextIn&#xff1a;开源免费的AI智能文字识别产品&#xff08;通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等&#xff09; 产品的官网&#xff1a;TextIn官网 希望感兴趣以及有需求的小伙伴们多多了解&#xff0c;因为这篇文章也是源于管网介绍才产出的…