信件替换终止

时间:2016-06-06 17:10:59

标签: string complexity-theory substitution halting-problem

假设:

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

r上的R规则应用于S时,S的所有字母都等于规则的left side {{1}如果r规则导致right side中的任何替换,r被称为r,则会被S r中的字母替换}}

流程图(算法):
(1)在triggered ruleall中按照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算法那样在固定的步数中确定负循环,...)

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

    谢谢你的阅读。

1 个答案:

答案 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次迭代后暂停,您也可以使用它。