鉴于:
- 仅包含从to字符的 char 字符串
S
长度l
'a'
'z'
- 一组
ordered
替换规则R
(格式为X->Y
),其中x
,y
是来自的单个字母'a' to 'z'
(例如,'a' -> ' e'
可能是有效规则,但'ce'->'abc'
永远不会是有效规则)
当应用规则inr
时,如果规则导致任何替换 in ,则所有与规则的字母相等的字母都将被替换为中的字母。R
S
S
left side
r
right side
r
r
S
r
triggered rule
流程图(算法):
(1) 在 上交替应用all
规则R
(按照规则的顺序R
)S
。
(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 = 26
26 是从“a”到“z”的字母数——但我无法证明它是真的(或不是)。(我希望它会类似于 Bellman-Ford 算法,它以固定的步数确定负循环,..)你呢?请帮我找到答案(这不是作业)
谢谢你的阅读。