0

鉴于:

  • 仅包含从to字符的 char 字符串 S长度l'a''z'
  • 一组ordered替换规则R(格式为X->Y),其中x,y是来自的单个字母'a' to 'z'(例如,'a' -> ' e'可能是有效规则,但'ce'->'abc'永远不会是有效规则)

当应用规则inr时,如果规则导致任何替换 in ,则所有与规则的字母相等的字母都将被替换为中的字母。RSSleft siderright siderrSrtriggered rule

流程图(算法):
(1) 在 上交替应用all规则R(按照规则的顺序RS
(2) While (there exists any 'triggered rule' DURING (1) ): 重复 (1)
(3) 终止

问题是:有没有办法确定给定字符串 S 和集合 R,算法是否会终止(永远运行)

示例1:(手动执行)

S = 'abcdef' R = { 'a'->'b' , 'b' -> 'c' }
(顺序隐含每条规则从左到右出现的顺序)

在 S 和 R 上运行算法:
(1.1): 'abcdef' --> 'bbcdef' --> 'cccdef'
(2.1): 重复 (1) 因为在 (1.1) 期间有 2 个替换
(1.2): 'cccdef'
(2.2): 继续 (3) 因为在 (1.1) 期间没有替换(1.2)
(3) : 终止算法
=> 算法以给定的 S 和 R 终止示例 2

S = 'abcdef'R = { 'a'->'b' , 'b' -> 'a' }
(顺序隐含每条规则从左到右的出现顺序)

在 S 和 R 上运行算法:
(1.1): 'abcdef' --> 'bbcdef' --> 'abcdef'
(2.1): 重复 (1) 因为在 (1.1) 期间有 2 个替换
(1.2): 'abcdef--> 'bbcdef' --> 'abcdef'
(2.2): 重复 (1) 因为有在 (1.2) (1.3) 期间有 2 次替换
:......这将永远是 (1.1)....
步骤 (3) (terminate) 永远不会到达。
=> 算法不会以给定的 S 和 R 终止。

  • 我对此进行了研究,发现“如果算法停止”这个问题没有有效的算法。
  • 我想到的第一个想法是对 "find cycle"其中的字母,triggered rules但规则的数量可能太大,以至于这个想法不理想。

  • 第二个是为"threshold"重复的时间提出一个,如果超过阈值,我们得出结论算法不会终止。

  • 可以随机选择,"threshold"(只要它足够大) - 这种方法并不是很有吸引力。

  • 我在想,如果有任何东西upper bound可以 "threshold" 确保我们总是得到正确的答案。我想出了 threshold = 2626 是从“a”到“z”的字母数——但我无法证明它是真的(或不是)。(我希望它会类似于 Bellman-Ford 算法,它以固定的步数确定负循环,..)

  • 你呢?请帮我找到答案(这不是作业)

    谢谢你的阅读。

4

1 回答 1

0

考虑解决此问题的一种简单方法是考虑长度为 1 的字符串,并查看问题是否可以针对任何给定的起始字母循环。由于字符串的长度永远不会改变,并且应用规则独立地应用于 S 中的每个字符,因此只考虑长度为 1 的字符串就足够了。

现在,从具有 26 个状态的状态图开始 - 字母表中的每个字母 1 个。现在,对于您的状态转换,请考虑以下过程:

依次应用从 R 1 开始的转换,直到到达 R 的末尾。如果从特定状态(字母)开始,您永远不会到达新字母,您知道如果到达起始字母,则终止. 否则,在应用整个R 序列后,您将得到一个新字母。这将是你的新状态。

请注意,所有状态转换都是确定性的,因为我们应用了整个 R 序列,而不仅仅是单个转换。如果我们应用单独的转换,我们可能会感到困惑,因为我们可能有 a -> b、b->a、a->c。在查看单个操作时,我们可能认为从 a (到 b 或到 c)有两种可能的转换,但实际上,考虑到整个序列,我们明确地看到 a 到 c 的转换。

在考虑每个起始字母的下一个状态后,您将完成创建状态图。以这种方式创建整个状态图需要 26 * |R| 操作。如果状态图包含一个循环,那么如果字符串 S 包含循环中的任何字母,则它无法停止,否则它将停止。

或者,如果您只考虑在 R 的整个序列中进行 26 次迭代后停止,您也可以使用它。

于 2016-06-07T02:33:07.423 回答