【问题标题】:Letter substitutions termination字母替换终止
【发布时间】:2016-06-06 17:10:58
【问题描述】:

给定:

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

R 中的规则r 应用于S 时,与规则rleft side 相等的S 的所有字母都将替换为@987654339 中的字母@ of r,如果规则 r 导致 S 中的任何替换,则 r 称为 triggered rule

流程图(算法):
(1) 在S 上交替应用R 中的all 规则(按照R 中的规则顺序)。
(2) (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.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) 期间有 2 个替换
(1.3): ......那将永远是一样的 (1.1)......
永远不会到达步骤 (3)(终止)。
=> 算法不会以给定的 S 和 R 终止。

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

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

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

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

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

    感谢您的阅读。

【问题讨论】:

    标签: string complexity-theory substitution halting-problem


    【解决方案1】:

    解决这个问题的一个简单方法是考虑一个长度为 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 次迭代后停止,您也可以使用它。

    【讨论】:

    • 感谢@bill-provine 的帮助。它帮助我。但是您能否解释一下为什么“我们也可以在 26 次迭代后停止”而“它需要 26* |R| 操作)- 为什么不是 26*|R| ?(对不起,如果这是一个愚蠢的问题,但我没有说出来,真的。)
    • 啊。我已经明白你的意思了。 26 iterations through the entire sequence from R 表示26* |R| iterations in total
    猜你喜欢
    • 2023-03-11
    • 2017-11-05
    • 2016-12-22
    • 2019-02-01
    • 2017-05-16
    • 2021-06-05
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多