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

数据结构与算法07-图

介绍

图是一种善于处理关系型数据的数据结构,使用它可以很轻松地表示数据之间是如何关联的。
在这里插入图片描述
图的实现形式有很多,最简单的方法之一就是用散列表。

friends = {
"Alice" => ["Bob", "Diana", "Fred"],
"Bob" => ["Alice", "Cynthia", "Diana"],
"Cynthia" => ["Bob"],
"Diana" => ["Alice", "Bob", "Fred"],
"Elise" => ["Fred"],
"Fred" => ["Alice", "Diana", "Elise"]
}

因为从散列表里查找一个键所对应的值只需要 1 步,所以查找 Alice 的朋友能以 O(1)的时间复杂度完成,如下所示。
friends[“Alice”]

实现方式

尽管只用散列表也可以实现一个图,但是以面向对象的方法来写会更加健壮。

广度优先搜索

如图所示,Alice 能直接联系到 Bob,Bob 能直接联系到 Cynthia。但 Alice 无法直接联系到
Cynthia。由于她们之间的联系要经过 Bob,因此 Cynthia 是 Alice 的二度联系人。
在这里插入图片描述
图有两种经典的遍历方式:广度优先搜索深度优先搜索

这里主要介绍下前者:

加权图

还有一种图叫作加权图。它跟普通的图类似,但边上带有信息。
以下这个包含了美国几个主要城市的简陋地图,就是一个加权图。
在这里插入图片描述
此图中,每条边上都有一个数字,它表示那条边所连接的两个城市相距多少英里。例如,Chicago和 New York City 之间的距离为 714 英里。

加权图可以是有方向的。以下图为例,尽管从 Dallas 飞到 Toronto 只要 138 美元,但从 Toronto飞到 Dallas 要 216 美元。
在这里插入图片描述

Dijkstra 算法

解决最短路径问题的算法有好几种,其中一种有趣的算法是由 Edsger Dijkstra(念为“dike’struh”)于 1959 年发现的。该算法也很自然地被称为 Dijkstra 算法。

例如:用python实现一个图结构,实现广度优先搜索,找出从任意城市A出发到B城市最便宜的飞机票价格

from collections import dequedef cheapest_flight(graph, start_city, end_city):"""使用广度优先搜索找到从start_city到end_city的最便宜机票价格。:param graph: 一个字典,表示城市间的航班图,格式如{'城市A': [(城市B, 价格), (城市C, 价格)]}:param start_city: 起始城市名称:param end_city: 目标城市名称:return: 最便宜的机票价格,如果不存在这样的路径则返回None"""if start_city not in graph or end_city not in graph:return None  # 起始或结束城市不存在于图中queue = deque([(start_city, 0)])  # 初始化队列,存放当前城市及到该城市的路径价格visited = set()  # 记录已访问的城市,避免循环访问while queue:current_city, current_cost = queue.popleft()if current_city == end_city:return current_cost  # 找到目标城市,返回最低价格if current_city not in visited:visited.add(current_city)for neighbor, price in graph[current_city]:if neighbor not in visited:queue.append((neighbor, current_cost + price))  # 将邻居加入队列并更新路径价格return None  # 没有路径到达目标城市# 示例图结构
graph_example = {'A': [('B', 100), ('C', 200)],'B': [('C', 50), ('D', 150)],'C': [('D', 100)],'D': []
}# 查找从城市A到城市D的最便宜机票价格
print(cheapest_flight(graph_example, 'A', 'D'))  # 应输出250,因为A->B->D的总价格是100+150=250,是最便宜的路径

相关文章:

数据结构与算法07-图

介绍 图是一种善于处理关系型数据的数据结构,使用它可以很轻松地表示数据之间是如何关联的。 图的实现形式有很多,最简单的方法之一就是用散列表。 friends { "Alice" > ["Bob", "Diana", "Fred"], &quo…...

springboot项目部署需要redis集群问题

本来直接将redis为单独启动模式转为配置 yml文件 spring.redis.cluster.nodes: 192.168.12.78:8001,192.168.12.78:8002,192.168.12.78:8003, java文件 package io.sirc.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.ann…...

JVMの内存泄漏内存溢出案例分析

1、内存溢出 内存溢出指的是程序在申请内存时,没有足够的内存可供分配,导致无法满足程序的内存需求,常见的内存溢出情况包括堆内存溢出(Heap Overflow)和栈溢出(Stack Overflow): …...

v31支架固定方式

CK_Label_v31 夹子固定方式 底座粘贴固定方式...

Jenkins从入门到精通面试题及参考答案(3万字长文)

目录 什么是Jenkins? Jenkins是如何工作的? Jenkins与持续集成(CI)有什么关系?...

如何使用电阻器?创建任何电阻的简单过程

您可能有一整盒E12 系列电阻器,但仍然无法获得足够接近您所需电阻的值。如果您需要 50 kΩ 电阻,接近的电阻是 47 kΩ。当然,这个误差在 10% 以内,但这对于您的应用程序来说可能还不够好。你会怎样做? 本文将介绍一个…...

学Python,看一篇就够

学Python,看一篇就够 python基础注释变量标识符命名规则使用变量认识bugDebug工具打断点 数据类型输出转义字符输入输入语法输入的特点 转换数据类型pycharm交互运算符的分类赋值运算符复合赋值运算符比较运算符逻辑运算符拓展 条件语句单分支语法多分支语法拓展 if…...

数据仓库核心:维度表设计的艺术与实践

文章目录 1. 引言1.1基本概念1.2 维度表定义 2. 设计方法2.1 选择或新建维度2.2 确定维度主维表2.3 确定相关维表2.14 确定维度属性 3. 维度的层次结构3.1 举个例子3.2 什么是数据钻取?3.3 常见的维度层次结构 4. 高级维度策略4.1 维度整合维度整合:构建…...

SQL实验 连接查询和嵌套查询

一、实验目的 1.掌握Management Studio的使用。 2.掌握SQL中连接查询和嵌套查询的使用。 二、实验内容及要求(请同学们尝试每道题使用连接和嵌套两种方式来进行查询,如果可以的话) 1.找出所有任教“数据…...

【JAVA WEB实用技巧与优化方案】Maven自动化构建与Maven 打包技巧

文章目录 一、MavenMaven生命周期介绍maven生命周期命令解析二、如何编写maven打包脚本maven 配置详解setting.xml主要配置元素setting.xml 详细配置使用maven 打包springboot项目maven 引入使用package命令来打包idea打包三、使用shell脚本自动发布四、使用maven不同环境配置加…...

详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读: 数据库中增…...

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部,刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…...

组织病理学结合人工智能之后,如何实际应用于临床?|顶刊精析·24-06-06

小罗碎碎念 今天这篇文章选自21年5月发表的nature medicine,标题名为——Deep learning in histopathology: the path to the clinic,这篇文章也是我规划的病理组学文献精析的第三篇,如果你能坚持把七篇都看完,相信你脑海中一定会…...

VCAST创建单元测试工程

1. 设置工作路径 选择工作目录,后面创建的 UT工程 将会生成到这个目录。 2. 新建工程 然后填写 工程名称,选择 编译器,以及设置 基础路径。注意 Base Directory 必须要为代码工程的根目录,否则后面配置环境会失败。 这样工程就创建好了。 把基础路径设置为相对路径。 …...

数据结构之归并排序算法【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …...

设计模式基础

什么是设计模式 设计模式是一种在软件设计过程中反复出现的问题和相应解决方案的描述。它是一种被广泛接受的经验总结,可以帮助开发人员解决常见的设计问题并提高代码的重用性、可维护性和可扩展性。 设计模式可以分为三类: 创建型模式(Crea…...

Glide支持通过url加载本地图标

序言 glide可以在load的时候传入一个资源id来加载本地图标,但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…...

网络安全形势与WAF技术分享

我一个朋友的网站,5月份时候被攻击了,然后他找我帮忙看看,我看他的网站、网上查资料,不看不知道,一看吓一跳,最近几年这网络安全形势真是不容乐观,在网上查了一下资料,1、中国信息通…...

【实战JVM】-实战篇-06-GC调优

文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…...

深入解析智慧互联网医院系统源码:医院小程序开发的架构到实现

本篇文章,小编将深入解析智慧互联网医院系统的源码,重点探讨医院小程序开发的架构和实现,旨在为相关开发人员提供指导和参考。 一、架构设计 智慧互联网医院系统的架构设计是整个开发过程的核心,直接影响到系统的性能、扩展性和维…...

SecGPT-14B提示工程:OpenClaw自动化测试不同提问方式的安全分析效果

SecGPT-14B提示工程:OpenClaw自动化测试不同提问方式的安全分析效果 1. 为什么需要自动化提示工程测试 去年我在做安全审计时,发现同一个漏洞用不同方式提问SecGPT-14B,得到的响应质量差异巨大。比如问"这段代码有漏洞吗?&…...

Qwen3-ASR-1.7B保姆级教程:一键部署,轻松实现中英日韩语音转文字

Qwen3-ASR-1.7B保姆级教程:一键部署,轻松实现中英日韩语音转文字 1. 引言:为什么选择Qwen3-ASR-1.7B? 语音识别技术正在改变我们处理信息的方式,但大多数解决方案要么需要联网调用云端API,要么部署复杂难…...

OpenClaw自动化报告:Phi-3-mini-128k-instruct数据分析与可视化

OpenClaw自动化报告:Phi-3-mini-128k-instruct数据分析与可视化 1. 为什么需要自动化数据分析 上周我接手了一个紧急任务:需要从300多份客户反馈的CSV文件中提取关键洞察,并制作成PPT向团队汇报。手动操作不仅耗时,还容易遗漏重…...

Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校

Lenovo Legion Toolkit终极指南:从零开始掌握拯救者笔记本性能调校 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

实测GLM-TTS:方言克隆效果惊艳,情感表达自然流畅

实测GLM-TTS:方言克隆效果惊艳,情感表达自然流畅 1. 语音克隆技术的新突破 近年来,语音合成技术取得了显著进展,但传统方案在方言支持和情感表达方面仍存在明显短板。GLM-TTS作为智谱AI开源的文本转语音模型,通过创新…...

BGE Reranker-v2-m3实战教程:与Milvus/Pinecone向量库联动,构建混合检索Pipeline

BGE Reranker-v2-m3实战教程:与Milvus/Pinecone向量库联动,构建混合检索Pipeline 1. 项目概述与核心价值 BGE Reranker-v2-m3是一个基于FlagEmbedding库和BAAI/bge-reranker-v2-m3模型开发的本地文本相关性重排序工具。这个工具专门处理「查询语句-候选…...

OpenClaw对接Qwen3.5-9B实战:5步完成本地AI助手部署

OpenClaw对接Qwen3.5-9B实战:5步完成本地AI助手部署 1. 为什么选择OpenClawQwen3.5-9B组合? 去年冬天第一次听说OpenClaw时,我正在为重复性的文件整理工作头疼。作为技术博主,每天要处理几十个Markdown草稿、截图和参考文献&…...

低空智联网:构建未来空中信息高速公路的架构蓝图

1. 低空智联网:重新定义空中信息高速公路 想象一下这样的场景:数百架无人机在城市上空有序穿梭,有的在配送快递,有的在监测空气质量,还有的在执行紧急救援任务。它们彼此之间能够实时通信,自动避让&#xf…...

HC-SR04测距不准?STM32定时器输入捕获模式详解与精度提升技巧

HC-SR04测距不准?STM32定时器输入捕获模式详解与精度提升技巧 超声波测距模块HC-SR04因其低成本、易用性在嵌入式领域广泛应用,但许多开发者发现实际测量结果常出现波动大、数据不准的问题。本文将深入分析误差来源,并基于STM32定时器的输入捕…...

Python flask django房屋租赁管理系统在线聊天

目录同行可拿货,招校园代理 ,本人源头供货商功能需求分析技术实现方案安全与扩展功能性能优化项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能需求分析 用户身份区分 系统需区分房…...