Algorithm 从DAG中采样随机节点

Algorithm 从DAG中采样随机节点,algorithm,language-agnostic,graph,directed-acyclic-graphs,Algorithm,Language Agnostic,Graph,Directed Acyclic Graphs,我有一个大的有向无环图(DAG),我想根据以下标准从中高效地绘制一个示例节点: 我指定了一个固定节点a,该节点决不能进行采样 不会对直接或间接引用的节点进行采样 以相同的概率对所有其他节点进行采样 节点作为对象存储,并带有指向它们所引用的其他节点的指针,可以从直接或间接引用其他所有节点的单个根节点访问整个图形 有没有好的算法可以做到这一点?理想情况下不需要大量额外内存,因为DAG很大 无论如何,我都不是这方面的专家,但我认为您可能需要一个类似or算法的解决方案 您可以在网上找到一些代码示例,您可

我有一个大的有向无环图(DAG),我想根据以下标准从中高效地绘制一个示例节点:

  • 我指定了一个固定节点a,该节点决不能进行采样
  • 不会对直接或间接引用的节点进行采样
  • 以相同的概率对所有其他节点进行采样
  • 节点作为对象存储,并带有指向它们所引用的其他节点的指针,可以从直接或间接引用其他所有节点的单个根节点访问整个图形


    有没有好的算法可以做到这一点?理想情况下不需要大量额外内存,因为DAG很大

    无论如何,我都不是这方面的专家,但我认为您可能需要一个类似or算法的解决方案

    您可以在网上找到一些代码示例,您可能需要修改代码,使其完全符合您的要求。关于这个主题有一些很好的介绍,比如

    以下是一些可能对您有所帮助的软件:

    我不知道你是否熟悉图论,所以我不确定你要实现这一点有多困难


    希望这有帮助…

    我能想出的唯一解决办法是

  • 将节点放入哈希集中
    (例如,使用宽度优先遍历从根遍历它们),O(| E |+| V |)

  • 从节点A开始,通过向后遍历边删除所有前置节点
    (还是O(| E |+| V |))

  • 从其余节点中选择一个随机节点

  • 这将导致O(| E |+| V |)算法需要O(| V |)内存


    请注意,您不必在步骤1中复制节点,只需保存对节点的引用。

    多大才算大,您是否有内存限制,引用节点是否可以便宜地找到?p.s.这样做的基本原理是我想随机向,但是需要避免形成任何循环…@Eiko我预计大约有一百万个节点-因此内存/缓存限制可能是一个问题。虽然可以选择添加反向指针,但当前无法廉价地找到引用节点。是否可以沿“反向”方向遍历边?(即,节点是否“双链接”)节点当前没有双/反向链接,但如果需要允许高效执行,添加这些节点可能是一个选项。感谢有趣的链接!然而,我并不是在追求一般的采样理论和工具,而是一个特定的算法来采样一个数据,对此我深表歉意!我认为aioobe有一个很好的解决方案,这是一个基本的蒙特卡罗马尔可夫链解决方案,IIRC。如果你有一个大的图形,为aioobe的步骤3选择一个好的随机数生成器将变得越来越重要。