我需要为语言L = {w |构建一个带有1个磁带的TM w是一个包含相同数量的a和b的单词,例如:abba,aababb}
TM必须只有1个磁带,并且必须在O(n log(n))时间内运行。我知道如何在O(n ^ 2)中做到这一点,但我不知道如何使它 log(n)。
如果我有输入w =" aaaa .... abbbbb .... bb"例如,在w = a ^ n / 2 * b ^ n / 2(这是最坏的情况)的情况下,我每次都会倒退(为每个b删除每个a),所采取的步骤将是1, 2,3,4 .....ñ。 Sum(1到n)是O(n ^ 2)......
帮助?任何想法?
答案 0 :(得分:3)
在高层次上,我想到的解决方案从左到右按顺序处理。在任何时候,都有一个已处理的单词的前缀,以及尚未处理的单词的后缀。假设delta
是前缀中a
的数量减去b
的数量,磁带在每次迭代开始时都是这样的:
<big-endian abs(delta)><sign(delta)><suffix>
^
tape head
要处理下一个字母(即后缀中的第一个字母),请根据字母是delta
还是a
来添加/减去b
中的一个字母,以及是否签名是+
或-
,在此过程中将delta
一个空格的表示移动到右侧。最后,检查delta
是否为零。
使用双补码表示可能更容易,其中最左边的数字被假定为无限重复,但我不确定是否有任何隐藏的障碍。