在有其他限制的情况下向有向无环图添加边

2024-05-06

我有一个 DAG。我有这个操作来在两个节点之间添加一条边。

如果 A 可从 B 到达,则 B 是 A 的父级。如果 A 可以从 B 到达,而无需通过另一个节点,则 B 是 A 的直接父节点。

该图的要求是:

  1. 没有循环。
  2. 对于任何节点,都有一个直接父节点列表 P[1],P[2],P[3]... 对于任何 i 和 j,P[i] 都不是 P[j] 的父节点。

如果添加一条边,则不满足要求1,则不构造该边。 如果添加一条边,则不满足要求 2,则构造该边,但将以满足要求 2 的方式修改直接父级。

例如有3个节点

  • A、直系父母:无
  • B、直系父母:A
  • C、直系父母:A

现在,如果我在 B 和 C 之间添加一条边,我们有

  • C、直系父母:A、B

但 A 是 B 的父代,不满足要求 2,因此 A 从 C 的直接父代中删除,我们有

  • C、直系父母:B

目前这是我所做的: 添加从 A 到 B 的边(此 A 成为 B 的父级)

  1. 通过 BFS 检查 B 是否是 A 的父级。如果是这样,请不要添加边缘。(这确保没有循环)
  2. 通过 BFS 检查 A 是否已经是 B 的父级。如果是这样,请勿添加边缘。
  3. 找到 A 的父级与 B 的直接父级的交集。这是通过 BFS 找到 A 的每个父级来完成的。删除 B 的直接父级的交集,并将 A 添加为 B 的直接父级。(2 和 3 确保它满足要求 2)

这很慢。它在 5k 节点级别崩溃(我正在寻找它来处理任何少于 100k 节点的图),速度变得不可接受,添加节点边缘需要 0.02 秒。

我有一种感觉,第 1 步和第 2 步可以使用其他算法一步完成。

我想过使用拓扑排序,但它必须横贯整个图,这是我的步骤 1 和 2 中最糟糕的情况。当添加新节点时,顺序将被打乱。所以我每次插入时都必须运行拓扑排序,因此它不会产生任何好处。 对于第 3 步,必须找到 A 的整个父母集。这个过程相当缓慢,因为平均来说它横穿了图表的相当一部分。

我怎样才能使这个更有效率?


您的问题归结为“在 DAG 中插入边能否比 O(v+e) 更快完成?”按要求(1)。要求 (2) 是一个更局部的约束,不需要检查整个图。

我认为答案是否定的:你不能做得更好O(v+e)在最坏的情况下(其中v是节点/顶点的数量,e是边数)。

毫无疑问,有一些技巧可以提高预期性能,具体取决于 DAG 的属性及其随时间的变化情况。这似乎是一个活跃的研究课题。例如,我想对于某些图来说,它可能对集群节点有益。然后,在集群内插入边只需要在集群子 DAG 内进行检查。但是,您需要一个适当的集群策略,并支持在添加节点等时以廉价的方式更新集群。

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

在有其他限制的情况下向有向无环图添加边 的相关文章

  • NetworkX:在 DAG 中查找最长路径,返回最大的所有关系

    我无法弄清楚如何更新 networkx dag find longest path 算法以返回 N 表示关系 而不是返回找到的第一个最大边 或返回与最大权重相关的所有边的列表 我首先从 pandas 数据帧创建了一个 DAG 其中包含如下子
  • 为什么允许对角线移动会使 A* 和曼哈顿距离不可接受?

    我对使用 A 和曼哈顿距离度量的网格中的对角线移动有点困惑 有人可以解释为什么使用对角线移动会使其不可接受吗 进行对角线运动不会找到更好的最佳解决方案 因为比上下左右移动更少的步骤即可达到目标状态 还是我错过了一些东西 正如烧杯的评论所指出
  • 为什么贪心算法找不到二分图的最大独立集?

    我试图使用贪心法解决二分图上的最大独立集问题 所以发现这篇文章正是我想做的 但我只关注二分图 答案中的反例不是二部图 是否有任何二分图无法使用 Greedy G S While G is not empty Let v be a node
  • 将图划分为具有最小割的相同大小的不相交集

    是否有任何算法或代码将图节点划分为两个或多个满足以下条件的不相交集合 首先 只允许删除边缘 其次 对边进行加权 并且要删除的边必须具有最小权重 最小切割算法 第三 所需的不相交集尽可能长地具有相同的大小 看起来您正在尝试解决最小二分问题 其
  • 解决这个分配珠子难题的算法?

    假设你有一个圆圈 如下所示 N点 并且你有N珠子分布在槽中 Here s an example 每个珠子都可以顺时针移动X插槽 这需要花费X 2美元 您的目标是最终在每个槽中获得一颗珠子 完成这项任务至少需要花多少钱 这个问题更有趣的变体
  • 网络直径是什么意思?

    上图所示这个链接 http en wikipedia org wiki Vertex 28graph theory 29的 具有 6 个顶点和 7 个边的图 其中最左侧的 6 号顶点是叶顶点或下垂顶点 有直径4吗 对还是错 定义是 图的直径
  • 如何计算两个单词之间的“最短距离”?

    最近我参加了一次面试 我被要求编写一个算法来找到从特定单词到给定单词的 1 个字母变化的最小数量 即 Cat gt Cot gt Cog gt Dog 我不想要问题的解决方案 只是引导我了解如何在该算法中使用 BFS 根据这个拼字游戏列表
  • 有向无环图遍历...有帮助吗?

    有点超出我的深度 需要给朋友打电话 我有一个需要遍历的有向非循环图 这是我第一次接触图论 我最近读了很多关于它的文章 但不幸的是我没有时间从学术上解决这个问题 有人可以给我一些关于如何处理这棵树的帮助吗 规则如下 有n根节点 我称之为 源
  • 检查 DI-Graph 中是否存在任何路径

    如果我有一个有向图 如何检查所有节点对 a b 是否创建路径 Example Input v1 v2 v5 v6 v2 v3 v3 v4 v4 v5 v0 v1 我需要检查该图中是否存在至少一条路径 而无需多次访问每个节点 我已经尝试过回溯
  • 有什么方法可以监控 Airflow DAG 的执行时间吗?

    我想将 Airflow 与 Statsd 和 DataDog 一起使用来监控 DAG 是否需要例如是之前执行的两倍 所以 我需要某种用于 DAG 的实时计时器 或者operator 我知道 Airflow 支持一些指标 https airf
  • 是否可以向 networkx 中的图形对象添加无向和有向边?

    我正在致力于实现一种算法来确定数据集的图形结构 数据集的变量之间可以有无向或有向边 我可以用 Python 创建自己的图形对象 但我很好奇 Networkx 是否具有此功能 据我所知 Networkx 只有一个 Graph 对象 仅无向边
  • 大型 DAG 上的拓扑排序示例

    我正在寻找现实世界的应用程序拓扑排序执行于大图 sizes 我想象您可以找到此类实例的一些领域是生物信息学 依赖性解析 数据库 硬件设计 数据仓库 但我希望你们中的一些人可能遇到或听说过任何需要的特定算法 项目 应用程序 数据集顶排序 即使
  • 使用 Networkx 绘制带边的图

    我一直被一件很简单的事情所困扰 我正在尝试绘制并显示一个具有 2 个节点和 1 个边的图 但我收到这个错误 Traceback most recent call last File
  • 如何快速识别 Snakemake 中的规则是否需要输入函数

    我正在关注其文档页面上的 Snakemake 教程 并且确实陷入了输入函数的概念https snakemake readthedocs io en stable tutorial advanced html step 3 input fun
  • python 中的图谱聚类

    我想使用谱聚类在 python 中对图进行聚类 谱聚类是一种更通用的技术 不仅可以应用于图形 还可以应用于图像或任何类型的数据 但是 它被认为是一种特殊的技术graph聚类技术 遗憾的是 我无法在线找到 python 中的谱聚类图的示例 S
  • 如何删除未加权有向图中的循环,以使边数最大化?

    令 G 为包含环的未加权有向图 我正在寻找一种算法 它可以找到 创建所有非循环图 G 由 G 中的所有顶点和 G 的边子集组成 足够小以使 G 非循环 更正式 所需的算法消耗 G 并创建一组非循环图 S 其中 S 中的每个图 G 满足以下属
  • 如何在 O(n+m) 时间内找到有向图中的母顶点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有向图 G V E 中的母顶点是顶点 v 使得所有其他顶点 顶点 G 可以通过从 v 出发的有向路径到达 给出一个 O n m 算法来
  • 任务之间的气流延迟

    As you can see in the image airflow is making too much time between tasks execution it almost represents 30 of the DAG e
  • 求矩阵 (n x n) 的最小总和,在每一行和每一列中只选择一个

    这是与动态规划相关的另一个算法问题 问题是这样的 找到给定矩阵的最小总和 以便在每一行和每一列中选择一个 例如 3 4 2 8 9 1 7 9 5 最小的一个 4 1 7 我认为解决方案是网络流量 最大流量 最小切割 但我认为它不应该那么难
  • 使用不同间隔的任务运行 DAG

    我有 3 个任务 A B 和 C 我只想运行任务 A 一次 然后每月运行任务 B 直到 end date 然后仅运行任务 C 一次以进行清理 这与这个问题类似 但不适用 如何在气流中的单个 Dag 上处理不同的任务间隔 https stac

随机推荐