图论其实不难入门

对于有多年的编程经验的开发者来说,图的概念并不陌生。许多顶级公司在技术面试中测试对图论的理解。 其实,开发者无需处理高级问题即可利用这些概念。要想明白这一点,我们可以先回顾一下为什么图是流行的数据结构以及如何在代码中实现它们。

关系模型

无论编码经验如何,开发者都应该对数组和字典的数据类型有所了解。 这些集合是大多数语言中使用的标准概念,在呈现基于列表的内容时效果很好:

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

图论其实不难入门 

大多数情况下,列表是从数据库或基于 REST 的查询中显示信息的完美解决方案。 然而,有时列表需要提供存在相互关联的上下文的记录。此时,将数据组织为图表变得方便。

对于图表,主要目标不是列出信息(尽管这一点可以做到),而是定义对象之间的关系。为什么定义对象之间的关系会有用?不妨看看以下几个例子。

图论其实不难入门 

一个有两个顶点和一个边的无向图

(1)地图应用程序

如果在技术面试中被问到,你将如何组织数据,以便重新创建地图服务(如 Apple 或 Google Maps)?除了在数据库中提供所有已知道路的列表外,你创建的模型还需要根据一天中的时间、交通和单行道等因素确定到达目的地的最佳方式。要使这大量的数据有效,您需要知道一条道路与模型中的所有其他街道之间的关系。

(2)社交媒体

一个社交媒体的价值,通常由用户关注或关注用户的人数来衡量。像Twitter这样的网络平台可以让用户与任何人联系,并接收他们的最新动态,从而吸引了大量用户。

 LinkedIn模型更为详细,因为除非接收者接受用户的连接请求,否则用户无法将某人添加到该用户的网络中。在这种情况下,LinkedIn连接代表双向关系。顺着这个思路,用户也可以搜索其人际网络中是否有人与其想要的工作机会相关联。在这种情况下,“网络”可能意味着直接或间接的联系。这样一个强大的模型不仅仅是基于一个简单的列表,它还包含了确定所有配置文件如何关联的智慧。

图形组件

现在我们已经了解了图在日常应用程序中的使用方式,下面我们来介绍图的组成部分。

图中的节点称为顶点。虽然可以将图构建为单个顶点,但包含多个顶点的模型可以更好地代表现实世界的应用。

图中的对象通过称为边的连接相互关联。

根据您的需求,顶点可以通过边连接到一个或多个物体上,也可以创建一个没有边的顶点。

最后,与堆栈或队列等其他标准结构不同,图通常没有指定的起点或终点。 以下是一些示例图形配置:

图论其实不难入门 

一个有两个顶点和一个边的无向图

图论其实不难入门 

一个有两个顶点和一个边的无向图

图论其实不难入门 

一个有两个顶点和一个边的无向图

有向与无向

在无向图中,源顶点和目标之间的连接是相等的。这些模型代表双向连接——类似于地图应用程序中的双向街道。

要定义单向连接,我们可以使用线和箭头将模型更新为有向图:

图论其实不难入门 

三个顶点和三个边的有向图

连通性水平

有时,我们必须表示图中顶点之间的连接程度。这种技术在量化节点之间的距离、时间或严重性时效果很好。权值通常与一条边相关,是一个用于跟踪的比较变量。 。

图论其实不难入门 

三个顶点和三个边的有向图,其中边加权

 

图顶点

有了对图论的基本了解后,让我们看看如何在代码中复制这些模型。下面我们创建了一个支持自定义通用对象 (T) 的顶点。 tvalue变量表示该类型保存的数据,包括单个字符串、int或自定义类型(例如,街道名称或社交媒体资料)。

另外,注意要让我们的类型符合流行的Equatable协议 (Swift)。这可以让我们在需要时比较特定顶点实例是否相等。

public class Vertex  : Equatable {

​var tvalue: T?
​var neighbors = Array<Edge>()
​let uuid = UUID()

​public init(with name: T) {
self.tvalue = name
​}

​//equatable conformance
​public static func == (lhs: Vertex, rhs: Vertex) -> Bool {
return lhs.uuid == rhs.uuid
​}
}

 

邻接表

邻接表表示与其他顶点的连接。如前面所述,每个顶点可以连接到一个或多个邻接的点。 这种关系列表有时称为“邻接表”,可以用来解决许多高级问题。

var neighbors = Array<Edge>()

图边

在创建顶点时,我们添加了一个邻接属性来存储自定义边类型的数组。 下面一条边为后续的相邻顶点及其潜在的边的权值提供参考。

public class Edge  {

​var neighbor: Vertex
​var weight: Int

​init() {
weight = 0
self.neighbor = Vertex()
​}
}

构建画布

有了顶点和边对象,我们现在可以将它们添加到中央存储结构中,我们称之为图形画布。尽管我们的画布在技术上是一个数组,但我们的目标是将集合可视化为一组关系。 借助addVertex 函数,我们可以向画布添加单个通用顶点,同时addEdge方法可提供边所需的参考信息。

最后,我们的代码假设图是有向的,因为边(仅)被添加到源顶点邻接表中。

public class Graph  {

​var canvas: Array<Vertex>

public init() {
canvas = Array()
​}

​//add vertex to graph canvas
​public func addVertex(element: Vertex) {
canvas.append(element)
​}
/add edge
​public func addEdge(source: Vertex, neighbor: Vertex, weight: Int) {

//create a new edge
let newEdge = Edge()

//connect source vertex to neighboring edge
newEdge.neighbor = neighbor
newEdge.weight = weight

source.neighbors.append(newEdge)
​}
}

总之,我们介绍了图的有关知识,并了解了如何使用它们来表示对象之间的关系,还回顾了配置图的几种方法以及用于描述不同模型的组件。

定义了模型后,我们就为更高级的功能奠定了基础,包括图形导航和遍历算法,如广度优先搜索。

译者介绍

康少京,51CTO社区编辑,目前从事通讯类行业,底层驱动开发岗位,研究过数据结构,Python,现对操作系统和数据库等相关领域感兴趣。

 原文标题:The complete beginner’s guide to graph theory,作者:Wayne Bishop

链接:

https://stackoverflow.blog/2022/05/26/the-complete-beginners-guide-to-graph-theory/

以上就是图论其实不难入门的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/564170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 02:28:37
下一篇 2025年11月10日 02:30:06

相关推荐

  • Phaser 3 游戏画布响应式适配:保持高度控制宽度

    本文旨在提供一种在 Phaser 3 游戏中实现画布响应式适配的方案,核心思路是利用 `Phaser.Scale.HEIGHT_CONTROLS_WIDTH` 缩放模式,使画布高度适应父容器,宽度随之调整,并始终居中显示。这种方法适用于需要保持游戏核心内容在屏幕中央,允许左右裁剪的场景。 在 Pha…

    2025年12月6日 web前端
    000
  • JavaScript Canvas图形渲染性能优化

    优化Canvas性能需减少重绘区域,使用离屏Canvas缓存复杂图形,按属性分组绘制以减少状态切换,并通过对象池和可视裁剪提升绘制效率。 在使用 JavaScript 和 Canvas 进行图形渲染时,性能问题常常成为影响用户体验的关键因素。尤其是当绘制对象数量增多或动画频繁更新时,帧率下降、卡顿等…

    2025年12月6日 web前端
    000
  • 淘宝主图如何添加文字?具体步骤是什么?3种方法详细步骤教程

    在淘宝运营中,主图是吸引买家点击的第一视觉入口。据统计,带有精准文字说明的主图点击率比纯图片高出37%。本文将详细解析淘宝主图添加文字的3种主流方法,手把手教你通过手机端、电脑端及专业设计工具快速完成主图优化。 一、添加文字前的准备工作 建议先完成这3项准备: 1. 图片素材选择 • 分辨率不低于8…

    2025年12月5日
    000
  • AI动画制作工具排行榜 能免费使用的10款AI动画制作工具推荐

    以下是10款免费的AI动画制作工具:1.智影:腾讯推出的在线视频制作平台,提供日漫风格,限时免费。2.Artflow:AI动画创建工具,Story Studio具有视频漫画生成功能,支持12种画面视觉风格。3.Flow Studio:通过文字生成视频片段,支持多种画面风格,新用户有200积分免费生成…

    2025年12月4日 科技
    000
  • Linux实现自动挂载autofs的方法详解

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 目录 实现自动挂载-autofs autofs工具简单使用 autofs配置详细说明 自动挂载资源有两种格式 优化Linux系统性能 安装Tuned 选择调整配置文件 检查系统推荐的调整配置文件…

    2025年12月4日
    000
  • BlenderMCP— 基于 MCP 集成的 3D 建模工具

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ MCP Market MCP Servers集合平台,帮你找到最好的MCP服务器 67 查看详情 BlenderMCP是什么 blendermcp是一种将blender与claude ai通过模…

    2025年12月4日 科技
    000
  • VSCode怎么出现波浪线_VSCode错误提示和语法检查功能说明教程

    VSCode中的波浪线是语言服务、Linter和编译器协同提供的实时反馈,红色表示错误(如语法错误),黄色表示警告(如未使用变量),绿色或下划线表示建议(如代码优化),通过悬停查看提示、检查配置文件(如tsconfig.json、.eslintrc)、使用“问题”面板(Ctrl+Shift+M)定位…

    2025年12月4日
    100
  • CanvaPro图层蒙版怎么用_CanvaPro图层蒙版专业设计应用方法

    Canva Pro虽无直接蒙版按钮,但可通过“裁剪为框架”实现图层蒙版效果。1、选中图片与上方形状,点击“组合”→“裁剪为框架”,形状区域显示图片内容。2、用渐变矩形覆盖图片并设置从白到透明的渐变,可模拟淡出过渡效果。3、将图片与文字组合后裁剪,使图片仅在文字轮廓内显示,适用于创意标题设计。4、通过…

    2025年12月3日 软件教程
    000
  • Logo设计免费课程资源_在线Logo设计学习网站链接入口

    1、通过Canva可画学习Logo设计基础,利用其免费教程和拖拽编辑器实践排版配色;2、参与Logopond和Designspiration等设计社区,分析优秀案例并收集灵感;3、在Udemy和LinkedIn Learning掌握Adobe Illustrator核心技能,重点练习矢量绘图与标志创…

    2025年12月3日 软件教程
    000
  • Canva图层蒙版怎么用_Canva图层蒙版在线设计应用方法

    Canva虽无传统图层蒙版工具,但可通过形状裁剪、渐变叠加和文字组合实现局部隐藏或显示效果。首先将图片与形状定位,用“用此图片填充所选内容”功能创建硬边蒙版;再通过半透明渐变形状叠加,模拟软边过渡;最后利用“置于文本中”组合功能,实现文字镂空透图的复杂遮罩,精准控制图像可见区域。 如果您在Canva…

    2025年12月3日 软件教程
    000
  • 抖音粉丝如何精准引流_抖音粉丝精准引流的实用方法

    通过置顶视频引导私信、创建抖音群聊、主页背景图植入、评论区暗号互动及合集功能命名等合规方式,系统化将抖音粉丝精准引流至私域,提升转化效率。 如果您希望将抖音上的观众转化为真正有价值的私域用户,就必须采取精准且合规的引流策略。粗暴地留下联系方式不仅效率低下,还可能导致账号被限流或封禁。以下是几种经过验…

    2025年12月3日
    000
  • 豆包 AI 官网入口 豆包 AI 使用在线入口

    豆包 AI 的官网入口是 https://www.doubao.com/,使用攻略包括:1. 注册与登录:通过官网注册或第三方账号登录;2. 选择使用方式:网页版、PC 客户端、手机 APP、浏览器插件;3. 基础操作:直接对话、上传图片、使用智能体、保存对话;4. 提问技巧:问题具体化、提供背景信…

    2025年12月2日
    100
  • 豆包 AI 网页端入口 豆包 AI 网页端在线网址

    豆包 AI 网页端入口是 https://www.doubao.com/chat/。其特色功能包括:1. 智能问答,提供各领域的准确答案;2. 内容生成与辅助创作,支持写作和图像生成;3. 搜索与浏览辅助,优化搜索结果并提供网页摘要;4. 对话管理与分享,支持对话分组和分享;5. 本地图片编辑,提供…

    2025年12月2日
    000
  • 豆包 AI 手机客户端入口 豆包 AI 客户端在线入口

    安卓用户可通过应用商店下载或官网下载获取豆包AI客户端,iOS用户通过App Store获取。安装后,打开应用并注册登录即可使用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 入口地址: 1、豆包ai手机客户端入口☜☜☜☜☜点击保存 2、…

    2025年12月2日
    000
  • 如何使用Golang实现桥接模式分离接口实现

    桥接模式通过组合将抽象与实现分离,Golang中用接口定义行为,结构体实现具体逻辑,Shape持DrawingAPI接口,Circle组合Shape并调用DrawCircle,实现图形与绘制解耦,支持扩展新图形或绘制方式。 桥接模式的核心是将抽象部分与实现部分分离,使它们可以独立变化。在Golang…

    2025年12月2日 后端开发
    000
  • 如何用JavaScript进行音频可视化或处理?

    JavaScript可通过Web Audio API实现音频可视化与处理。首先创建音频上下文并加载音频,利用AnalyserNode获取频率和波形数据;接着调用getByteFrequencyData获取频域数据;再结合Canvas绘制柱状频谱图,实时渲染音频可视化效果;同时可使用BiquadFil…

    2025年12月2日
    000
  • DeepSeek如何用函数调用自动化任务_DeepSeek用函数调用自动化任务【任务自动化】

    答案:通过配置API环境、定义函数描述、处理调用请求、回传执行结果及支持多轮协作,可利用DeepSeek函数调用实现任务自动化。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您希望利用DeepSeek的函数调用能力实现任务自动化,可以…

    2025年12月2日 科技
    000
  • CanvaAI怎样用动效词提示加活力_CanvaAI用动效词提示加活力【动效提示】

    通过使用动效词提示,可在CanvaAI中为文字或图形添加动态效果。首先选择预设提示如“淡入”“滑动出现”,系统自动匹配动画;其次输入“旋转入场+渐显”等复合词触发高级动画,AI生成多方案供选;最后调整图层顺序避免遮挡,优化动效呈现层次。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限…

    2025年12月2日 科技
    000
  • GitHubCopilot怎样用函数目标提示加速_GitHubCopilot用函数目标提示加速【目标提示】

    使用注释和类型标注可精准引导代码生成:先通过详细注释说明函数目标,再结合类型声明提升补全准确性,最后利用JSDoc等结构化注释触发包含参数校验与异常处理的完整逻辑建议。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您在编写代码时希望利…

    2025年12月2日 科技
    000
  • CanvaAI怎样用风格词提示改设计_CanvaAI用风格词提示改设计【风格提示】

    通过输入“极简主义”“赛博朋克”等具体风格词,结合主题词如“婚礼邀请函,优雅洛可可风格”,并上传参考图辅助定义,可精准引导CanvaAI生成理想设计。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您希望在CanvaAI中快速调整设计的…

    2025年12月2日 科技
    000

发表回复

登录后才能评论
关注微信