【问题标题】:Understanding epsilon closure algorithm pseudocode理解 epsilon 闭包算法伪代码
【发布时间】:2016-02-28 14:09:16
【问题描述】:

以下伪代码来自Java World 中的编译器构造简介一书。该算法应该输出非确定性有限机器的一组状态的 epsilon 闭包(最终将其转换为确定性机器)。

# Input: a set of states, S
# Output: epsilon_closure(S)

    Stack P.addAll(S) #a stack containing all states in S
    Set C.addAll(S)   #the closure initially contains the states in S

    while ! P.empty() do
         s = P.pop()
         for r in m(s, epsilon) do
            # m(s, epsilon) is a set of states
            if r not in C then
                P.push(r)
                C.add(r)
            end if
        end for

    end while
    return C

我知道什么是 epsilon 闭包,但不幸的是我很难理解这段代码是如何工作的。

注意:代码中的m()是机器的转换函数。

【问题讨论】:

    标签: algorithm pseudocode finite-automata dfa nfa


    【解决方案1】:

    它只是将转换函数应用于 S 中的每个状态。从该应用程序产生的状态被收集在 C 中。一旦你完成了 P 中的每个状态的查看,C 包含 epsilon 闭包。

    注意输入S不一定是NFA中的完整状态集,所以S和m(s, epsilon)的交集可能不为空。

    【讨论】:

    • C 是一个数组吗?它不是从一开始就已经充满了所有状态(C.addAll(S))吗?如果是这样,r not in C 怎么会是真的?
    • S 是 NFA 状态的子集,不一定是所有状态的集合。
    • 它很简洁,因为没有那么多事情发生。你到底在坚持什么?
    • 很高兴提及 S 是什么,为什么必须在子集构造算法中找到 C,以及传递闭包的工作原理。我不认为 OP 知道这些事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2016-06-13
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多