假设:
- 字符串
中的字符S
长度l
仅包含'a'
到'z'
- 一组
ordered
替换规则R
(X->Y
形式)x
,y
是来自'a' to 'z'
的单个字母(例如,'a' -> ' e'
可能是有效规则,但'ce'->'abc'
永远不会是有效规则)
当r
上的R
规则应用于S
时,S
的所有字母都等于规则的left side
{{1}如果r
规则导致right side
中的任何替换,r
被称为r
,则会被S
r
中的字母替换}}
流程图(算法):
(1)在triggered rule
上all
中按照R
中的规则顺序)交替应用R
规则。
(2)S
:重复(1)
(3)终止
问题是:有没有办法确定使用给定字符串S和设置R,算法是否会终止(永远运行)
示例1 :(手动执行)
S =
(there exists any 'triggered rule' DURING (1) )
R ='abcdef'
(该命令暗示了每条规则从左到右的出现顺序)
A和S上的运行算法:
(1.1):{ 'a'->'b' , 'b' -> 'c' }
(2.1):重复(1)因为在(1.1)期间有2个替换
(1.2):'abcdef' --> 'bbcdef' --> 'cccdef'
(2.2):继续(3)因为(1.2)中没有替换
(3):终止算法
=>算法以给定的S和R
结束
例2:
S =
'cccdef'
R ='abcdef'
(该命令暗示了每条规则从左到右的出现顺序)
A和S上的运行算法:
(1.1):{ 'a'->'b' , 'b' -> 'a' }
(2.1):重复(1)因为在(1.1)期间有2个替换
(1.2):'abcdef' --> 'bbcdef' --> 'abcdef'
- > 'abcdef
- > 'bbcdef'
(2.2):重复(1)因为(1.2)中有2个替换
(1.3):......永远相似(1.1)....
永远不会达到步骤(3)(终止)
=>该算法不会以给定的S和R终止。
我想到的第一个想法是'abcdef'
个字母
在"find cycle"
,但规则的数量可能太大
这个想法是理想的。
第二个是提出triggered rules
的时间
重复一次,如果超过阈值,我们就算结束了算法
不会终止。
可以随机选择"threshold"
(只要它很大
足够了 - 这种做法并不十分引人注目。
我在想,如果有"threshold"
的话
upper bound
确保我们始终得到正确的答案。
我提出了"threshold"
,其中26是数字
从'a'到'z'的字母 - 但我不能证明它是真的(或不是)。
(我希望它会像Bellman-Ford算法那样在固定的步数中确定负循环,...)
你呢?请帮我找到答案(这不是一个答案 家庭作业)
谢谢你的阅读。
答案 0 :(得分:0)
考虑解决这个问题的一个简单方法是考虑一个长度为1的字符串,看看问题是否可以循环任何给定的起始字母。由于字符串的长度永远不会改变,并且应用规则独立地应用于S中的每个字符,因此只需考虑长度为1的字符串就足够了。
现在,从具有26个状态的状态图开始 - 每个字母表的字母为1。现在,对于状态转换,请考虑以下过程:
按顺序一次应用R 1的过渡,直到你到达R的结尾。如果从特定的状态(字母),你没有到达一个新的字母,你知道如果你到达起始字母,你终止了。否则,在应用R的整个序列后,您将得到一个新的字母。这将是你的新州。
请注意,所有状态转换都是确定性的,因为我们应用R的整个序列,而不仅仅是单个转换。如果我们应用了单个转换,我们可能会感到困惑,因为我们可能会有 - > b,b-> a,a-> c。在查看单个操作时,我们可能会认为有两种可能的转换(从a到b或c),但实际上,考虑到整个序列,我们明确地看到转换为c。
在考虑每个起始字母的下一个状态后,您将完成创建状态图。以这种方式创建整个状态图需要26 * | R |操作。如果状态图包含一个循环,那么如果字符串S包含循环中的任何字母,那么它将无法停止,否则它将停止。
或者,如果您只考虑在R中完成整个序列的26次迭代后暂停,您也可以使用它。