微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无赖图的支配树

如何解决无赖图的支配树

是否有一种使用命令式方法Graph type计算支配树的方法?该语言是否支持直接创建此类数据结构?

我正在尝试使用以下算法(here is the link for the original article)从Graph中提取支配树:

dominance tree algorithm

但是我在适应那些python -m pip install jupyterlabfor语句时遇到麻烦。

解决方法

有一些选择,例如如何表示输出控制树。一种典型的方法是再次选择图。以后,如果愿意,可以将Graph转换为构造函数树。

考虑到Graph [&T]的选择,以下模板可以变成给定算法到Rascal的字面翻译:

Graph[&T] dominators(Graph[&T] graph,&T root) {
  result = {};
  V = carrier(graph);
  Pred = graph<to,from>;

  solve(result) {
     for (v <- V,u <- Pred[v]) {
        if (...)
     }
  }
  return result;
}{

但是,不必通过先反转图形然后连续查找前任图形来变为图形的“ pred”形式,我们也可以直接在边上循环,这要快得多:

Graph[&T] dominators(Graph[&T] graph,&T root) {
  result = {};
  
  solve(result) {
     for (<u,v> <- graph) { // u is the predecessor of v
        if (...) {
          result += { };
        }
     }
  }

  return result;
}

直接从Dragon书中的定义(以及您引用的论文中的方程3.2)定义的基本不动点求解器。 (请注意,我只是输入了此内容,尚未对其进行测试,因此可能有问题):

rel[&T,set[&T]] dominators(graph[&T] graph) {
  nodes = carrier(graph);
  result = {};
  preds = graph<to,from>;

  solve(result) {
    for (n <- nodes) {
      result[n] = {n} + intersect({result[p] | p <- preds[n]?{}});
    }
  }

  return result;
}

(与Set模块的库函数相交)

这是一个“关系演算”解决方案,它使用reachX库函数解决了该问题,并从每个节点返回了它所控制的节点集的关系(取自Rascal文档文件):>

rel[&T,set[&T]] dominators(rel[&T,&T] PRED,&T ROOT) {
  set[&T] VERTICES = carrier(PRED); 
  return { <V,(VERTICES - {V,ROOT}) - reachX({ROOT},{V},PRED)> | &T V : VERTICES};
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?