针对某些图操作的最简单算法的建议

2024-01-01

这个项目的截止日期很快就到了,我没有太多时间来处理剩下的事情。因此,我不是寻找最好的(可能更复杂/耗时)算法,而是寻找最简单的算法来实现图结构上的一些操作。

我需要做的操作如下:

  • 列出给定距离 X 的图网络中的所有用户
  • 列出给定距离 X 和关系类型的图网络中的所有用户
  • 给定一种关系,计算图网络上 2 个用户之间的最短路径
  • 计算图网络上2个用户之间的最大距离
  • 计算图网络上最远连接的用户

关于我的 Graph 实现的一些注意事项:

  • 边缘节点有2个属性,一个是类型char和另一个int。它们分别代表关系类型和权重。
  • 该图的顶点和边都是通过链表实现的。我的意思是,每个顶点都指向下一个顶点,每个顶点还指向不同链表的头,即该特定顶点的边。

我所知道的我需要做什么:

  • I don't know if this is the easiest as I said above, but for the shortest path between 2 users, I believe the Dijkstra algorithm is what people seem to recommend pretty often so I think I'm going with that.
    • 我一直在搜索和搜索,发现很难实现这个算法,有谁知道任何教程或易于理解的东西,以便我可以自己实现这个算法?如果可以的话,有C源代码示例,会有很大帮助。我看到很多带有数学符号的例子,但这让我更加困惑。
    • 您认为如果我将图“转换”为邻接矩阵来表示链接权重和关系类型会有帮助吗?在其上执行算法而不是链表会更容易吗?我可以轻松地实现一个函数来在需要时进行转换。我这么说是因为我感觉在阅读了几页有关该主题的内容后会更容易,但我可能是错的。
  • 我对其他 4 个操作没有任何想法,有建议吗?

列出给定距离 X 的图网络中的所有用户

一段距离X从何而来?从起始节点或距离X他们之间?你能给个例子吗?这可能会也可能不会像进行 BF 搜索或运行 Dijkstra 那样简单。

假设您从某个节点开始并想要列出具有距离的所有节点X到起始节点,只需运行BFS http://en.wikipedia.org/wiki/Breadth-first_search从起始节点开始。当要向队列中插入新节点时,检查起始节点到要插入新节点的节点的距离是否+要插入新节点的节点到的边的权重新节点X。如果它严格较低,则插入新节点,如果相等,则仅打印新节点(并且仅当边缘权重也可以为 0 时才插入)。

列出给定距离 X 和关系类型的图网络中的所有用户

往上看。只需考虑 BFS 中的关系类型:如果父节点的类型与您尝试插入队列的节点的类型不同,则不要插入它。

给定一种关系,计算图网络上 2 个用户之间的最短路径

该算法取决于许多因素:

  • 您需要多久计算一次?
  • 你有多少个节点?

既然你想要简单,最简单的是 Roy-Floyd 和 Dijkstra。

  • 使用 Roy-Floyd 的节点数量是立方的,因此效率低下。仅当您有能力运行一次并在 O(1) 内回答每个查询时才使用它。如果您有能力在内存中保留邻接矩阵,请使用此选项。
  • 如果您想保持简单,Dijkstra 的节点数量是二次方,但每次您想要计算两个节点之间的距离时都必须运行它。如果您想使用 Dijkstra's,请使用邻接表。

以下是 C 实现:罗伊-弗洛伊德 http://www.joshuarobinson.net/docs/fwarsh.html and 迪克斯特拉_1 http://snippets.dzone.com/posts/show/4832, 迪克斯特拉_2 http://vinodcse.wordpress.com/2006/05/19/code-for-dijkstras-algorithm-in-c/。你可以在谷歌上找到很多"<algorithm name> c implementation".

Edit:对于 18 000 个节点,Roy-Floyd 是不可能的,邻接矩阵也是如此。构建会花费太多时间和太多内存。最好的选择是对每个查询使用 Dijkstra 算法,但最好使用堆来实现 Dijkstra - 在我提供的链接中,使用堆来查找最小值。如果您对每个查询运行经典的 Dijkstra,这也可能需要很长时间。

另一种选择是使用贝尔曼-福特 http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm每个查询的算法,这会给你O(Nodes*Edges)每个查询的运行时间。然而,如果您没有按照维基百科的要求实现它,那么这就是一个很大的高估。相反,请使用类似于 BFS 中使用的队列。每当一个节点更新其与源的距离时,将该节点插入回队列中。这在实践中会非常快,并且也适用于负权重。我建议您使用此方法或带有堆的 Dijkstra,因为经典的 Dijkstra 可能在 18000 个节点上花费很长时间。

计算图网络上2个用户之间的最大距离

最简单的方法是使用回溯:尝试所有可能性并保留找到的最长路径。这是 NP 完全的 http://en.wikipedia.org/wiki/Longest_path_problem,所以多项式解不存在。

如果你有 18000 个节点,这真的很糟糕,我不知道有任何算法(简单或其他)可以对这么多节点运行得相当快。考虑使用贪心算法对其进行近似。或者您的图表可能具有您可以利用的某些属性。例如,它是 DAG(有向无环图)吗?

计算图网络上最远连接的用户

这意味着您想要找到图形的直径。最简单的方法是找到每两个节点之间的距离(所有对最短路径 - 在每两个节点之间运行 Roy-Floyd 或 Dijkstra,并选择距离最大的两个)。

同样,对于节点和边的数量来说,这很难快速完成。恐怕您在最后两个问题上运气不佳,除非您的图表具有可以利用的特殊属性。

您认为如果我将图“转换”为邻接矩阵来表示链接权重和关系类型会有帮助吗?在其上执行算法而不是链表会更容易吗?我可以轻松地实现一个函数来在需要时进行转换。我这么说是因为我感觉在阅读了几页有关该主题的内容后会更容易,但我可能是错的。

不,除非您的应用程序针对超级计算机,否则邻接矩阵和 Roy-Floyd 是一个非常糟糕的主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对某些图操作的最简单算法的建议 的相关文章

随机推荐

  • 使用 jax-ws 生成存根失败

    我正在尝试使用 jax ws 为 WSO2 Identity Server 管理服务生成存根https xx xx xx xx 9447 services RemoteUserStoreManagerService wsdl https x
  • bash > 重定向是原子的吗?

    我的 crontab 工作有一个奇怪的问题 我的 crontab 作业执行以下操作 program gt file 然而有时文件会充满我 无法解释的随机数据 我想知道是否可能是之前的 crontab 作业需要更长的时间来运行 并且它以某种方
  • 如何从 SKScene 呈现 UIViewController?

    我通过 Sprite Kit 进入 iOS 我认为这是不明智的 我的目标是在游戏结束时显示 分享 按钮 点击分享按钮应该会出现一个 SLComposeViewController Twitter 分享 场景的内容不应改变 决定 游戏结束 的
  • Zend Form 复选框上的自定义 HTML 输出 setLabel 属性

    我正在渲染一个 Zend Form 复选框 并且我想在其 setlabel 属性处渲染一些自定义 html 我的表单构建模型 terms new Zend Form Element Checkbox confirm terms 在我的视图脚
  • 给定圆心和半径,求圆圆周上点的公式

    我正在编写代码找到圆的圆周上的点 I 有圆的中心点和半径我需要在它周围画一个圆圈 这将帮助我定义边界 请帮我找到圆周上这些点的公式 对于有原点的圆 j k 和半径r x t r cos t jy t r sin t k 你需要运行这个方程t
  • HTTPS 和 SSL 的安全性:-javax.net.ssl.SSLHandshakeException:证书已过期

    我已经尝试过命令进行检查缺少中间证书颁发机构使用这个命令 openssl s client connect mail google com 443 对于我的网站 应该显示证书链 但它只显示一个已经过期的证书 但是当我检查服务器证书配置时ht
  • 如何修复错误-nodemon.ps1 无法加载,因为在此系统上禁用运行脚本(无安全风险)?

    终端错误 nodemon ps1无法加载 因为该系统上禁用了运行脚本 了解更多 信息 请参阅about Execution Policies at https learn microsoft com en us powershell mod
  • Safari CSS 过渡闪烁

    我正在处理的网页出现问题 在 Firefox 上似乎没有任何问题 我有 2 个元素 水平滚动 带有背景图像 这两个元素之间的过渡是使用 CSS3 进行的 transformX 首先 这两个元素重叠 以便您可以看到第二个元素的背景图像 当您单
  • 如何创建读取一个文件并将子字符串写入另一个文件的批处理文件?

    我目前有一个导出的文本文件 output txt 来自我需要解析的 Clear Case 命令 它看起来像这样 Comparing the following R1 PROD V1 VOB pvob R2 PROD V1 VOB pvob
  • 如何将适用于不同数字类型的 C 函数库包装到 C++ 模板类中

    我想使用 C 库中的代码 我的具体示例 FFTW http www fftw org 来实现 C 类模板 C 库定义了一些执行相同操作的数据类型和函数 但针对不同种类的原始数字类型 例如fftw complex 双精度数对 与 fftwf
  • 之间的确切区别是什么?和 ?: 角度运算符

    我没有考虑 三元运算符 有时我会在 YouTube 教程中观看人们使用的 HTML页面中的运算符 有时他们会使用 在 TS 打字稿 页面中 我不太清楚它们到底有什么不同 那么使用 时有区别吗 在 Angular 中 您可以参考以下三种用法
  • 使用 Socket.io 更新所有客户端?

    是否可以强制所有客户端使用 socket io 进行更新 我已尝试以下操作 但当新客户端连接时它似乎不会更新其他客户端 服务器端 JavaScript 我正在尝试向所有客户端发送一条消息 其中包含当前连接的用户数量 它正确地发送了用户数量
  • 使用 PHP include 时如何避免空格?

    我有一些文件需要包含在几个页面中 所以我使用类似的东西 div Hello this is a webpage div div Some more text div div Even more text div 问题是每个include 我
  • 如何捕获 PhantomJS 获取的页面中生成的 JavaScript 错误?

    我有一个 PhantomJS 脚本 它加载本地 HTML 文件 注入一些 javascript 文件 然后在页面上下文中执行一些 javascript 运行的 javascript 会生成异常 但我只从控制台获得输出 这似乎无法区分错误和正
  • Django pdf 问题与 pisa

    我想使用 pisa 生成 pdf 文件的 html 模板 我相信我拥有所需的所有软件包 但我似乎在这样做时遇到了问题 这是我的观点如下 到目前为止我所做的一切 EDIT 这是我最新的网址 视图和模板 url py r index rende
  • WPF Datepicker 仅提供可选择的日期列表

    我不确定这是否可行 但是是否可以在 wpf 日期选择器中仅选择日期列表 我需要确保用户只能从一定数量的日期中进行选择 我可以使用下拉列表来完成此操作 但使用日期选择器会更好 有任何想法吗 The DatePicker具有以下属性来控制应选择
  • Angular 路由器:从 navigatorbyurl 返回的承诺被忽略

    使用此代码 this router navigateByUrl login 我收到以下警告 从 navigatorbyurl 返回的承诺被忽略 我想如何以及何时处理这里的承诺 附 我在 AuthGuard 中使用这个canActivate
  • 在 Windows 上使用 Docker 进行网络连接

    我使用这个官方指南在 Windows 7 机器上设置 Docker https docs docker com windows started https docs docker com windows started 我成功从 docke
  • 安装后没有名为“tensorflow_examples”的模块

    在我的笔记本的第一个单元格中 我写道 pip install git https github com tensorflow examples git pip install U tfds nightly 在下一个单元格上 import t
  • 针对某些图操作的最简单算法的建议

    这个项目的截止日期很快就到了 我没有太多时间来处理剩下的事情 因此 我不是寻找最好的 可能更复杂 耗时 算法 而是寻找最简单的算法来实现图结构上的一些操作 我需要做的操作如下 列出给定距离 X 的图网络中的所有用户 列出给定距离 X 和关系