我正在尝试使用图灵模拟来编写,其形式如下:
0 1 * r 0
0 0 * r 0
0 # * * 3
0 x * r 0
0 y * r 0
...一个程序,它采用由">"分隔的两个二进制值。例如1010> 111,如果向左>右,则停止 - 是,并且向左和向右停止 - 停止。
我想比较解决方案,如果您有兴趣,请留下您的解决方案。
答案 0 :(得分:0)
我可能会使用某种方法的伪代码:
通过用一些符号替换LHS和RHS中的所有前导零 - (不是空白但不是0,1或者>)。
检查以确保LHS和RHS中的剩余位数相同。如果没有,我们可以立即说明LHS是否> RHS与否取决于相对长度。通过来回弹跳并改变0,1到0',1'来做到这一点,直到/除非你在没有标记的情况下在一边跑出去。
如果我们还在检查,现在过程很简单:比较LHS和RHS的第一个数字;如果LHS(1)> RHS(1),然后是LHS> RHS;如果LHS(1)< RHS(1),LHS< RHS。如果LHS(1)= RHS(1),则删除这两个,并再次执行步骤3。如果所有数字都消失了,那么数字是相等的,你就停止了 -
步骤#1的输入长度为O(n),因为我们可以从左到右进行单次扫描。然后我们可以回到磁带的开头。
步骤#2是O(n ^ 2),因为TM基本上是n步,n - 1步,...,2步= n(n + 1)/ 2 - 1步总数来计算LHS和RHS。
步骤#3为O(n ^ 2),因为TM基本上是n / 2步n / 2次,总共约为n ^ 2/4步。
因此时间复杂度为O(n ^ 2),空间复杂度为O(n)(我们将输入用作临时存储器)。