【发布时间】:2016-06-06 17:10:58
【问题描述】:
给定:
- 一个字符字符串
S长度l只包含从'a'到'z'的字符- 一组
ordered替换规则R(形式为X->Y)其中x、y是来自'a' to 'z'的单个字母(例如,'a' -> ' e'可能是有效规则,但@ 987654332@ 永远不会是有效规则)
当R 中的规则r 应用于S 时,与规则r 的left 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