查找有向循环图中的所有路径作为正则表达式

时间:2014-07-10 16:47:37

标签: regex graph-algorithm directed-graph kleene-star

设G =(V,E,r)有根有向图,由一组顶点V和一组边E定义,具有指定的根节点r。 图表可能包含周期。任务:给定V中的两个顶点x和y,找到从x到y的所有路径。

由于允许循环,路径集显然可以是无限的。因此,我想以正则表达式(Kleene Algebra)的形式找到路径集。以下是一些示例:Examples graphs。乘法表示序列,因此路径abc表示先是a,然后是b,然后是c。一组路径a(b + c + d)表示首先是a,然后是b,c或d。克莱恩星a *表示a重复零或更多,a +重复一次或多次。

现在我正在寻找一种通过算法构建这些表达式的方法。到目前为止我想出了什么:

  • 构造新的表达式树T.
  • 在结束节点y开始搜索。
  • 找到所有前辈p到y。
  • 每个p
    • 将p作为子节点添加到T中的y。
    • 从p向根向上追溯树的路径。如果沿途发现y,则从y到p有一个循环。因此,不仅p是y的前身,而且 (路径)*也是p的前身。因此,将(path)*添加为p。
    • 的子节点
    • 对于所有非循环前辈,使用y:= p作为新的结束节点进行递归调用。

最后:

  • 反转树,使其以结束节点结束
  • 将表达式树转换为表达式(直截了当)

不确定这是否会起作用,但是,最坏情况的复杂性也会超过2 ^ n。有没有人知道这个或类似问题的算法?

1 个答案:

答案 0 :(得分:0)

您的算法的一般想法似乎是合理的。但是,我猜测在你需要编写代码的反向跟踪步骤中可能会有很多特殊情况。特别是,我没有看到一个简单的方法来考虑周期内的周期,即(路径)*本身包含一个需要Kleene星的术语。

我有单独的建议。该图表可以转换为NFA,允许使用任何well known algorithms将NFA转换为正则表达式。

将图表转换为NFA:

  • 将节点x设置为开始状态。
  • 将节点y设置为唯一的接受状态。
  • 对于每个节点 a ,标记其所有传入边 a