图算法系列1: 图算法的分类有哪些?(上)

news2025/1/10 23:50:25

 大约在公元9世纪上半叶,来自中亚古国花剌子模的波斯数学家花剌子米(al-Khwarizmi)先后出版了两本对数学界有深远影响的书籍《印度数字算术》与《代数学》​,前者在12世纪被翻译为拉丁文传入欧洲,十进制也因此传入欧洲,最终所形成的英文中的“算法”一词实际上是花剌子米的名字的拉丁文转译,后传入法国,大概在14世纪末传入英国,直至19世纪固定后形成了今天的“算法”一词。这个例子告诉我们,很多时候,人类的知识就像是通过一张“以讹传讹”的网络得以扩散和传播的。

算法的由来

所有的图算法在本质上都是对更为基础的图上的计算、分析与查询操作的高度概括与集成。那么,什么是基础的图上的计算、分析与查询操作呢?可以简单概括为以下两类操作。

❑ 面向元数据的低维、离散的操作。典型的例如面向顶点或边的聚合、排序等操作。

❑ 面向高维数据的操作。典型的例如路径、子图、网络查询以及图算法等操作。从图计算的视角,面向元数据的操作与之前所有SQL或NoSQL数据库没有本质区别,因此并不是本书的重点。

❑ 面向高维数据的操作,指的是从关联数据的角度,查询数据之间的关联关系、关联路径和影响力范围,例如我们常说的根因分析(Root-cause Analysis)、贡献度分析(ContributionAnalysis)、归因分析(Attribution Analysis)、影响力分析(Impact Analysis)、溯源分析(Backtracing)等。通过构建图数据模型,然后进行图上的查询与分析,通常会获得更高效、更灵活、更白盒化且更具可解释性的效果。

高维数据的查询有3个子类。

❑邻居查询:如最典型的k邻查询。

❑路径查询:如最短路径、环路、权重路径等。

❑展开、组网等其他较复杂查询:如从某顶点展开、多顶点组网等。

当然,所有的高维查询都可以通过拆解或分而治之的方式降维为低维查询,因为它们都是从某个或某类元数据(如顶点、边或其属性字段)开始操作的,而这些高维查询再进行组合、聚合、变形, 就形成了我们所谓的图算法。例如度算法中的全图入度查询,本质上就是计算所有顶点的入度。显然,在一张大图上,这个看似简单的算法的计算复杂度可能会非常高,如何进行加速就变成了重要的议题,我们会在第3章中进行详细分析。再比如全图k邻查询(k-Hop Neighbors,k跳邻居)​,在连通度较高的图中,即便是查询1个顶点的3跳、5跳邻居都可能会非常耗时(假如1个顶点的1跳邻居有20个,2跳邻居有400个,3跳邻居有8000个,而5跳邻居已经在3200000个的量级)​,如果有10000000个顶点,那么运行完这个算法的耗时和复杂度将是天文量级的。不经优化的图算法很多都是不具备实用性的,而优化可以获得指数级的性能提升与耗时降低—可能原来需要运行1个月的算法,如果在不增加硬件投入的前提下能提速1000倍,降低至0.7h(约40min)内完成,其意义是不言而喻的!这也是为什么图算法的性能优化如此重要。

在剖析图算法的具体分类之前,我们先了解一个设计良好的图算法应该具备的特征。通过梳理过去一个半世纪以来多位数学家和计算机学家对于算法特征的共性探讨,我们总结了如下5点:

1)无歧义,即确定的操作逻辑。

2)清晰、明确的操作步骤。

3)具备良好的可行性(如时间、空间、复杂度与效率)​。

4)定义了明确的输入、输出规则,以及可验证正确性。

5)在有限步骤内可以完成。

关于图算法的分类,业界并没有严格意义上的共识。有的侧重于学术研究的图计算框架,甚至会把广度优先搜索(BFS)或深度优先搜索(DFS)作为算法单列,尽管它们更适合作为一种图遍历模式存在。还有的如最短路径算法,在20世纪计算机发展的前30年间(20世纪40年代至70年代)​,最短路径算法不断推陈出新,对于计算机体系架构的发展有相当大的推动作用。图2-2示意了一种典型的在图上寻路所对应的算法分类情况。如图2-2所示,DFS算法实现的是一种随机游走式的寻路,且不关心路径是否最短。BFS算法实现的是无权重最短寻路,而Dijkstra算法则实现的是有权重最短寻路。

 

我们在研究图算法的分类时,一般都把图算法归类为组合数学算法的一部分,因为组合数学涉及的领域相当广泛,而图论是其中相当重要且有代表性的一部分。在组合数学中,几乎所有的著名问题,如旅行商问题、地图着色、任务分配、线性规划(过河问题)等,都与图论或离散数学相关。按照在组合数学中的图论类算法,可以简单地把算法作如下分类。
❑图路由类算法:最小生成树类算法、最短路径问题、最长路径问题、旅行商问题等。
❑网络分析与网络流算法:链接分析、网页排序算法、网络最大流问题等。
❑图搜索类算法:A*、B*、暴力搜索、回溯问题、双向搜索算法等。
❑子图类算法:强链接子图、团(Clique)、同态子图等。
❑图可视化类算法:力导向图、频谱布局、分层渲染、弧式图等。
❑其他图算法:染色类算法、拓扑排序算法、图匹配算法、最大势问题等。
我们还可以按照如下五大维度分别对图算法进行分类,每个分类下又有一些典型子类算法。


1)按设计模式分类,可分为以下6类:
❑遍历式(列举式)​。在图算法以及图查询模式中,遍历式是最为常见的。像广度优先算法与深度优先算法是最常用的图遍历模式,很多现实世界的问题就是通过这些遍历模式解决的,如象棋、围棋对弈问题。下面的回溯式算法也可以看作遍历式的一种特例。
❑穷举式(暴力计算)​。在海量数据集上,穷举式计算并不一定是可行的,但很多情况下带有过滤(图上剪枝)规则的穷举式计算又是必要的。例如在工商数据集中,搜索一个自然人与一个发行人(上市公司)之间的全部最短关联路径是完全可行的,即便两者之间存在成千上万条路径。❑分而治之。分而治之是算法设计中最经典的思路,把大的问题缩小,把大的数据集缩小,通过递归、并发、分布式等方法来分块处理,最后再汇总来解决全量的问题。二进制搜索、全图k邻算法等都是典型的采用分而治之的模式来解决问题的算法。
❑回溯式、回溯式算法通常用于解决约束满足问题,如各种迷宫或字谜类的益智游戏(如经典的国际象棋八皇后问题、数独问题、背包问题等)​、地图着色问题、最大割问题等。因为有约束条件限定,算法在进行某种随机遍历的过程中可能会通过回退(即回溯或剪枝)来优化遍历以找到正确的结果。
❑随机化。通过随机操作的方式来求解的算法在学术界与工业界都很常见,例如蒙特卡罗类算法在连通图中计算最小割问题的Karger算法,就是通过随机删除图中的边并合并删前相连顶点的方式来实现以多项式时间复杂度(参见下文中的按复杂度分类)求解问题。

❑归约式。归约式算法通过把一个问题转换(如映射)成另一个问题,进而寻求一种更简约的解决问题的方式。例如广度优先搜索求某个(群)顶点的k跳邻居中年龄最大者(或最小,或任意可度量维度或属性)的过程中,需要对结果集进行排序(转换)​,然后选取最大结果值返回,这就是一种典型的先转换再求解的归约式算法。


2)按优化问题模式分类,可分为以下3类:
❑线性规划(LP)。在最优化问题求解的过程中,经常会遇到线性规划问题,如商业管理中的降本增效问题、交通能源与通信领域的最大网络流问题等。
❑动态规划(DP)。在经济学与航空工程学领域经常会遇到动态规划问题。简而言之,动态规划问题一般通过把复杂的问题以递归的方式分解为更小的问题并找到最优解来说明该问题具备最优子结构(Optimal Substructure)。例如,只要能证明贪心算法中的每一步都是最优的,就可以用它来解决具有最优子结构的问题。贪心算法通常可以被看作动态规划类算法的一个特例,最小生成树(MST)类算法就是典型的通过分解子结构来实现的贪心算法。
❑启发式算法。启发式算法是在常规方式无法找到最优解的情况下(太慢或效果太差)​,通过在精度、准确性、完整性、最优性等维度之间进行协调取舍,进而实现一种近似最优解的算法方案。3)按复杂度分类。可分为以下5类:
❑恒定时间。复杂度O(1)就是典型的恒定时间。比如,无论数据集大小,通过数组或向量数据结构访问任一顶点所需的时间恒定为O(1)。

连载文章,未完待续!

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

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

相关文章

DLL文件损坏怎么办?10种DLL修复方法帮你搞定

在日常使用Windows电脑时,我们常常遇到应用程序无法打开、系统崩溃甚至蓝屏的问题,背后原因往往是DLL文件的损坏或丢失。DLL文件是系统和软件运行的关键部分,一旦出现问题,会严重影响我们的日常操作。为了避免这些困扰&#xff0c…

字符串 - 反转字符串

344. 反转字符串 方法一&#xff1a;双指针 /*** param {character[]} s* return {void} Do not return anything, modify s in-place instead.*/ var reverseString function(s) {let l -1, r s.length;while(l < --r) [s[l], s[r]] [s[r], s[l]]; };

车身域测试学习、CANoe工具实操学习、UDS诊断测试、功能安全测试、DTC故障注入测试、DBC数据库、CDD数据库、CAN一致性测试、ECU刷写测试

每日直播时间&#xff1a;&#xff08;直播方式&#xff1a;腾讯会议&#xff09;周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00周六与周日&#xff1a;9&#xff1a;00-17&#xff1a;00 进腾讯会议学习的&#xff0c;可以关注我并后台留言 直播内容&#xff1a;&…

HTB-Permx靶机笔记

Permx靶机笔记 概述 permx靶机是HTB的简单靶机&#xff0c;这台靶机整体考验渗透人员的信息搜集能力&#xff0c;可以收只有信息搜集的快速&#xff0c;才能快速拿到它的flag。 整体是比较简单的靶机 靶机连接&#xff1a;https://app.hackthebox.com/machines/PermX 一、…

B3-111-A 小型挂轨式巡检机器人:智能巡检的突破之

在现代工业自动化与智能化的浪潮中&#xff0c;巡检机器人的应用日益广泛&#xff0c;为各类复杂环境下的设备巡检与运维提供了强有力的支持。杭州旗晟智能科技有限公司推出的B3-111-A小型挂轨式巡检机器人&#xff0c;凭借其小巧的机身、精准的巡检能力和智能化的管理系统&…

无字母数字命令执行

目录 源码 PHP7版本 PHP5版本 发现的现象和思考 源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_…

重修设计模式-行为型-状态模式

重修设计模式-行为型-状态模式 先了解一下状态机的概念&#xff0c;状态机是软件编程中对一种状态场景的抽象表达&#xff0c;构成状态机三要素是&#xff1a;状态&#xff08;State&#xff09;、事件&#xff08;Event&#xff09;、动作&#xff08;Action&#xff09;&…

basic_pentesting_2靶机

靶机地址&#xff1a;Basic Pentesting: 2 ~ VulnHub 攻击机kali和靶机要设在同一网段&#xff0c;查看靶机MAC地址&#xff1a; 一、信息收集 扫描目标主机 arp-scan -l 使用nmap扫描靶机开放的端口&#xff1a; nmap -A -sS -sV -v -p- 192.168.7.127 浏览器访问80端口&a…

数据中心安全建设整体解决方案(DOC原件22页)

数据中心的安全体系建设并非安全产品的堆砌&#xff0c;它是一个根据用户具体业务环境、使用习惯、安全策略要求等多个方面构建的一套生态体系&#xff0c;涉及众多的安全技术&#xff0c;实施过程需要涉及大量的调研、咨询等工作&#xff0c;还会涉及到众多的安全厂家之间的协…

2024接口自动化测试高频面试题!

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

如何判定一个加密软件是否可靠

一、加密算法的安全性 算法类型&#xff1a;选择采用公认的高安全性加密算法的软件&#xff0c;如AES&#xff08;高级加密标准&#xff09;、RSA等。这些算法经过广泛验证&#xff0c;具有强大的加密能力。 密钥长度&#xff1a;较长的密钥长度能够增加破解难度&#xff0c;…

【微信小程序】页面配置

1. 页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的 .json 配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 3. 页面配置中常用的配置项

利用 Splunk 对人工智能数据基础设施进行 Spelunk 分析

概述 在企业数据方面&#xff0c;MinIO Enterprise Object Store 和 Splunk 有着共生关系。Splunk在其数字流处理器中使用MinIO。MinIO 是一个 Splunk SmartStore 端点。MinIO Enterprise Object Store 是一个高性能、兼容 Amazon S3 的分布式对象存储系统。通过遵循超大规模计…

免费【2024】springboot 个人用户博客系统设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

STM32学习笔记11-PWR电源控制

目录 PWR简介 电源框图 上电复位和掉电复位 可编程电压监测器 低功耗模式 模式选择 睡眠模式 停止模式 待机模式 低功耗模式应用 睡眠模式 停止模式 待机模式 PWR简介 PWR&#xff08;Power Control&#xff09;电源控制PWR负责管理STM32内部的电源供电部分&#…

Unity新输入系统结构概览

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 在学习新输入系统之前&#xff0c;我们需要对其构成有个印象 1.输入动作&#xff08;Inputaction&#xff09; 是定义输…

队列---学生信息输入输出

作业&#xff1a;链栈&#xff0c;自己实现一遍&#xff0c;但是节点存储不是整数&#xff0c;存储学生信息&#xff08;年龄&#xff0c;分数&#xff0c;姓名&#xff09;三级引用。 1、建立学生信息结构体&#xff0c;将data改为学生信息结构体类型。 2、循环入栈和入队。…

RPC 和 HTTP 理解

网上充斥着各类类似于这样的文章&#xff1a;rpc 比 http 快了多少倍&#xff1f;既然有了 http&#xff0c;为什么还要用 rpc 调用等等。遇到这类文章&#xff0c;说明对 http 和 rpc 是由理解误区的。 这里再次重复强调一遍&#xff0c;通信协议不是 rpc 最重要的部分&#x…

KubeSphere 部署 Kafka 集群实战指南

本文档将详细阐述如何利用 Helm 这一强大的工具&#xff0c;快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。 实战服务器配置(架构 1:1 复刻小规模生产环境&#xff0c;配置略有不同) 主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库…

命令行参数环境变量

目录 前言&#xff1a; 命令行参数&#xff1a; 现象&#xff1a; 这些参数的意义&#xff1a; 为什么要这么做&#xff1f; 这些事是谁做的呢&#xff1f; 环境变量 现象&#xff1a; 创建环境变量&#xff1a; 结合程序理解&#xff1a; 前言&#xff1a; 我们在前…