从DAG中采样随机节点

时间:2010-08-19 13:42:42

标签: algorithm language-agnostic graph directed-acyclic-graphs

我有一个大的有向图(DAG),我想根据以下标准有效地绘制一个样本节点:

  1. 我指定一个绝不能被采样的固定节点
  2. 直接或间接引用A的节点从未被采样
  3. 以相同的概率对所有其他节点进行采样
  4. 节点存储为具有指向其引用的其他节点的对象的对象,整个图形可以从直接或间接引用其他所有节点的单个根节点到达。

    有一个很好的算法吗?理想情况下,由于DAG很大,所以不需要大量的额外内存!

2 个答案:

答案 0 :(得分:2)

我能想到的唯一解决方案是

  1. 将节点放入哈希集
    中 (使用,例如,广度首次遍历从根遍历),O(| E | + | V |)

  2. 从节点A开始,通过向后遍历边缘来删除所有前任 (再次O(| E | + | V |))

  3. 从其余节点中选择一个随机节点。

  4. 这将导致O(| E | + | V |)算法具有O(| V |)内存要求。

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

答案 1 :(得分:0)

我不是这方面的专家,但我认为您可能想要Monte Carlo Markov chain sampling methodMetropolis-Hastings算法等Gibbs sampling

您可以在线找到一些代码示例,您可能需要修改代码才能完全按照您的意愿执行操作。关于这个主题有一些很好的演示,比如this

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

我不知道你对图论的熟悉程度,所以我不确定你实现它有多困难。

希望这有用......