Algorithm O(n*log(n))图灵机,正好有一个磁带用于;相等数量的a';s和b';在一个给定的单词中是什么;?

Algorithm O(n*log(n))图灵机,正好有一个磁带用于;相等数量的a';s和b';在一个给定的单词中是什么;?,algorithm,time-complexity,turing-machines,Algorithm,Time Complexity,Turing Machines,我需要为语言L={w | w是一个a和b数量相同的单词,例如:abba,aababb} TM必须只有1个磁带,并且必须在O(nlog(n))时间内运行。我知道如何在O(n^2)中实现它,但我不知道如何使其成为nlog(n) 例如,如果我有输入w=“aaaa…abbbb…bb”,其中w=a^n/2*b^n/2(这是最坏的情况),那么每次我都会后退(为每个b删除每个a),所采取的步骤大小将为1,2,3,4….n。和(1到n)是O(n^2) 帮忙?有什么想法吗?在高层次上,我想到的解决方案是按从左到右

我需要为语言L={w | w是一个a和b数量相同的单词,例如:abba,aababb}

TM必须只有1个磁带,并且必须在O(nlog(n))时间内运行。我知道如何在O(n^2)中实现它,但我不知道如何使其成为nlog(n)

例如,如果我有输入w=“aaaa…abbbb…bb”,其中w=a^n/2*b^n/2(这是最坏的情况),那么每次我都会后退(为每个b删除每个a),所采取的步骤大小将为1,2,3,4….n。和(1到n)是O(n^2)


帮忙?有什么想法吗?

在高层次上,我想到的解决方案是按从左到右的顺序处理单词。在任何时候,都有一个已处理单词的前缀和一个未处理单词的后缀。让
delta
为前缀中
a
s的数量减去
b
s的数量,磁带在每次迭代开始时看起来如下所示:

<big-endian abs(delta)><sign(delta)><suffix>
                                    ^
                                tape head

^
磁带头
要处理下一个字母(即后缀中的第一个字母),请根据字母是
a
还是
b
以及符号是
+
还是
-
,从
delta
中添加/减去一个字母,并在处理过程中将
delta
的表示向右移动一个空格。最后,检查
delta
是否为零


如果假设最左边的数字无限重复,那么使用2的补码表示可能更容易,但我不确定是否有任何隐藏的障碍。

这是一个非常简单的解决方案!这几乎就是你在普通计算机上写代码的方式,除了在内存中向上移动计数器的部分。