探索图结构:从基础到算法应用

文章目录

      • 理解图的基本概念
      • 学习图的遍历算法
      • 学习最短路径算法
      • 案例分析:使用 Dijkstra 算法找出最短路径
      • 结论

在这里插入图片描述

🎉欢迎来到数据结构学习专栏~探索图结构:从基础到算法应用


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:数据结构学习
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

图结构是计算机科学中的一项重要内容,它能够模拟各种实际问题,并在网络、社交媒体、地图等领域中具有广泛的应用。本文将引导你深入了解图的基本概念、遍历算法以及最短路径算法的实际应用。
在这里插入图片描述

理解图的基本概念

顶点和边: 图由一组顶点(vertices)和连接这些顶点的边(edges)构成。边可以带有权重(weight),代表两个顶点之间的关系强度或成本。

在这里插入图片描述

有向图与无向图: 有向图中的边是有方向的,从一个顶点指向另一个顶点;无向图中的边没有方向,是双向的。

在这里插入图片描述

权重图: 权重图中的边带有权重,用于表示顶点之间的距离、代价等信息。
在这里插入图片描述

学习图的遍历算法

深度优先搜索(DFS): DFS 是一种遍历图的算法,它从一个起始顶点开始,递归地访问相邻顶点,直到无法继续为止。DFS 的应用包括查找连通分量、拓扑排序等。

在这里插入图片描述

广度优先搜索(BFS): BFS 也是一种遍历图的算法,它从起始顶点开始,逐层访问其邻居顶点。BFS 的应用包括查找最短路径、社交网络中的“六度分隔”等。

学习最短路径算法

Dijkstra 算法: Dijkstra 算法用于查找带权重的图中从一个起始顶点到其他顶点的最短路径。它采用贪心策略,每次选择当前距离最近的顶点进行拓展。Dijkstra 算法的应用包括路由算法、地图导航等。

在这里插入图片描述

Bellman-Ford 算法: Bellman-Ford 算法也用于查找图中的最短路径,但与 Dijkstra 算法不同,它适用于带有负权边的图。Bellman-Ford 算法通过进行多次松弛操作逐步逼近最短路径。

案例分析:使用 Dijkstra 算法找出最短路径

假设我们有一个城市之间的道路网络,每条道路都有对应的时间(权重)。我们想要找到从起始城市到目标城市的最短时间路径。以下是使用 Dijkstra 算法实现这个目标的示例代码:

import java.util.*;public class ShortestPath {public Map<String, Integer> findShortestPath(Map<String, Map<String, Integer>> graph, String start, String end) {PriorityQueue<String> pq = new PriorityQueue<>(Comparator.comparingInt(graph.get(start)::get));Map<String, Integer> distances = new HashMap<>();Map<String, String> predecessors = new HashMap<>();distances.put(start, 0);graph.keySet().forEach(city -> {if (!city.equals(start)) {distances.put(city, Integer.MAX_VALUE);predecessors.put(city, null);}pq.offer(city);});while (!pq.isEmpty()) {String current = pq.poll();for (Map.Entry<String, Integer> neighbor : graph.get(current).entrySet()) {int newDistance = distances.get(current) + neighbor.getValue();if (newDistance < distances.get(neighbor.getKey())) {distances.put(neighbor.getKey(), newDistance);predecessors.put(neighbor.getKey(), current);}}}Map<String, Integer> shortestPath = new HashMap<>();String current = end;while (current != null) {shortestPath.put(current, distances.get(current));current = predecessors.get(current);}return shortestPath;}public static void main(String[] args) {ShortestPath shortestPath = new ShortestPath();Map<String, Map<String, Integer>> graph = new HashMap<>();graph.put("A", Map.of("B", 5, "C", 2));graph.put("B", Map.of("D", 1, "E", 6));graph.put("C", Map.of("B", 1, "D", 4));graph.put("D", Map.of("E", 1));graph.put("E", Collections.emptyMap());String start = "A";String end = "E";Map<String, Integer> result = shortestPath.findShortestPath(graph, start, end);System.out.println("Shortest path from " + start + " to " + end + ": " + result);}
}

结论

图结构在现实世界中有着丰富的应用,从社交网络到交通系统。了解图的基本概念、遍历算法以及最短路径算法,可以让你更好地理解和处理与图相关的问题。通过学习这些知识,你将能够在解决实际问题时更加灵活和高效地运用图结构和算法。


🧸结尾


❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

Jmeter常用线程组设置策略

一、前言 ​ 在JMeter压力测试中&#xff0c;我们时常见到的几个场景有&#xff1a;单场景基准测试、单场景并发测试、单场景容量测试、混合场景容量测试、混合场景并发测试以及混合场景稳定性测试 在本篇文章中&#xff0c;我们会用到一些插件&#xff0c;在这边先给大家列出&…

一款轻量级开发者工具,提高开发效率

Devkits Devkits 是一款轻量级桌面端应用&#xff0c;提供了一系列开发者工具&#xff0c;提高开发效率。 离线。类似的在线工具已经不少了&#xff0c;但是大多数都是在线的&#xff0c;网络不好的时候就很难用了。Devkits 提供了离线使用的功能&#xff0c;可以在没有网络的…

Vue2向Vue3过度Vue3组合式API

目录 1. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势3 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 4 熟悉项目和关键文件5 组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖 6 组合式…

sqlite3 加密访问

关于sqlite3 加密 一、相关加密用到的sqlcipher 1.1 sqlcipher 是一个数据库加密的开源库 sqlcipher开源地址 我这边是使用的docker镜像&#xff0c;镜像地址&#xff1a; https://hub.docker.com/r/pallocchi/sqlcipher 加密格式 docker run -v <workdir>:/sqlcip…

反射机制-体会反射的动态性案例(尚硅谷Java学习笔记)

// 举例01 public class Reflect{ // 静态性 public Person getInstance(){return new Person(); }// 动态性 public T<T> getInstance(String className) throws Exception{Calss clzz Class.forName(className);Constructor con class.getDeclaredConstructor();con…

linux————haproxy

一、概述 HAProxy是一个免费的负载均衡软件&#xff0c;可以运行于大部分主流的Linux操作系统上&#xff08;CentOS、Ubuntu、Debian、OpenSUSE、Fedora、麒麟、欧拉、UOS&#xff09;。 HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力&#xff0c;具备丰富的功能。HAProxy具…

无涯教程-PHP.INI File Configuration函数

PHP配置文件php.ini是影响PHP功能的最终且最直接的方法。每次初始化PHP时都会读取php.ini文件。换句话说,无论是模块版本的httpd重新启动还是CGI版本的每次脚本执行都重新启动。如果未显示您的更改,请记住停止并重新启动httpd。 该配置文件已注释完整。键区分大小写,关键字值不…

vite配置electron、ElementPlus或者AntDesignVue

这是全部的配置原文&#xff1a; import { defineConfig } from vite; import vue from vitejs/plugin-vue; import electron from "vite-plugin-electron"; import electronRenderer from "vite-plugin-electron-renderer"; import polyfillExports from…

python实现的淘宝自动发货脚本

pyhton # 文件用ini # 自动应答&#xff0c;自动点发货

writeback: 1. 初始化

init 源码基于5.10 default_bdi_init static int __init default_bdi_init(void) {int err;// 分配wq实例bdi_wq alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_UNBOUND |WQ_SYSFS, 0);if (!bdi_wq)return -ENOMEM;// 初始化noop_backing_dev_info&#xff…

数据库索引的作用

1、解释一下数据库索引的作用。 数据库索引是一种数据结构&#xff0c;它可以帮助数据库系统快速查找和检索数据。索引可以加速对数据库表的查询操作&#xff0c;从而提高系统的性能。 在数据库中&#xff0c;索引通常被用于以下情况&#xff1a; 快速查找特定值&#xff1a…

Java中怎样将bytes转换为long类型?

在Java中将字节数组(bytes)转换为long类型&#xff0c;可以使用Java的ByteBuffer类来实现。ByteBuffer类提供了一种方便的方式来处理原始数据类型的字节序列。 以下笔者用具体的代码来演示下如何将bytes转换为long类型&#xff1a; import java.nio.ByteBuffer;public class …

leetcode496. 下一个更大元素 I 【单调栈】

【简单题】&#xff08;暴力遍历法很简单&#xff09;但是时间复杂度很高&#xff0c;n的立方级别了。。。 代码&#xff1a; class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int&g…

gitee远程仓库——Git常用远程仓库托管服务

远程仓库 我们的代码不能总是放在本地&#xff0c;因为总是放在本地&#xff0c;一旦电脑出现故障&#xff0c;数据将丢失&#xff0c;怎么共享呢&#xff1f;这里我们需要一个服务器&#xff0c;我们可以把代码放到服务器上&#xff0c;然后让别人下载&#xff0c;这样我们既…

Java人脸识别技术探索与实践

人脸识别技术作为生物特征识别领域的一项重要应用&#xff0c;近年来在安全、便捷以及科研等方面取得了显著的进展。在Java编程领域&#xff0c;人脸识别也得到了广泛的关注和应用。本文将介绍Java中人脸识别技术的基本概念、常用库以及实际示例代码&#xff0c;带您深入了解这…

Android Bitmap压缩

Android View截屏长图拼接&#xff08;RecyclerView&#xff09; 我们在实际使用中&#xff0c;往往图片转化成Bitmap&#xff0c;对Bitmap操作的时候&#xff08;如:截屏分享等&#xff09;&#xff0c;可能Bitmap会过大&#xff0c;导致无视实现对应功能。那么我们就需要对B…

k8s-dashboard使用指导手册

一、访问 dashboard http://172.66.209.101:32001 二、选择 Namespace 如下图&#xff1a; 1 在①搜索框中输入 spms 2 在②选择 spms-cloud 三、查找 pod 1 打开 pod 列表 2 打开过滤窗口 3 搜索 pod 在打开的搜索框中输入 pod的关键字&#xff0c;支持模糊搜索 如搜索…

Camunda 7.x 系列【28】启动事件

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 空启动事件3. 定时器启动事件3.1 固定时间日期3.2 持续时间3.3 重复间隔4. 消息启…

“石头剪刀布”游戏:while、函数自调用实现循环游戏

if…else实现“石头剪刀布”游戏&#xff0c;while、函数自调用实现循环游戏。 (本笔记适合学过if…else的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c…

ArcGIS学习总结(19)——要素转点与空间连接(属性表字段映射)

1.在新创建的面矢量数据的属性表中没有对应的字段信息&#xff0c;为了能够和有属性信息的数据进行匹配&#xff0c;使其具有对应字段的信息。 2.需要匹配的矢量文件属性表信息。 3.对新创建的矢量文件执行要素转点&#xff1a;数据管理工具→要素→要素转点。 4.选择分析工…