Algorithm 如何在图灵中找到最大的子序列?

Algorithm 如何在图灵中找到最大的子序列?,algorithm,computer-science,turing-machines,Algorithm,Computer Science,Turing Machines,在大学里我遇到了这个问题,我似乎找不到答案,但这不是一个家庭作业,只是一个谜。 假设您在图灵机中有输入: 01001101 8位序列 如何计算此类输入中的最大子序列,并获得正确的输出201001101?2因为有两个离得很近 我可以正确地计算和写入第一个子序列,因此我在磁带上记录了: 101001101 但是,我不知道如何计算1的其他子序列,并且不使用最后一个子序列的较小数目覆盖结果。你有什么想法吗 编辑:只有一条刮擦带可以处理。这在概念上很容易,但在图灵机器上编程却相当麻烦。下面是一个算法的概要

在大学里我遇到了这个问题,我似乎找不到答案,但这不是一个家庭作业,只是一个谜。 假设您在图灵机中有输入:

01001101 8位序列

如何计算此类输入中的最大子序列,并获得正确的输出201001101?2因为有两个离得很近

我可以正确地计算和写入第一个子序列,因此我在磁带上记录了:

101001101

但是,我不知道如何计算1的其他子序列,并且不使用最后一个子序列的较小数目覆盖结果。你有什么想法吗


编辑:只有一条刮擦带可以处理。

这在概念上很容易,但在图灵机器上编程却相当麻烦。下面是一个算法的概要:

N = Max = 0
for all x in the input:
    if x == 0:
        N += 1
    else:
        Max = max(N, Max)
        N = 0
output Max
确保有两个刮擦带,一个用于存储读取头下零的运行长度,一个用于存储看到的最长运行时间。让我们调用磁带N和Max,并在这两个磁带上存储一元数字。两者最初都是空的。 当你看到一个零,多写一个1到N。 当您看到一个时,倒带Max和N,然后将N的内容写入Max,使内容超出N的末尾,因此在1111上复制111将保留1111,但在其上复制11111将产生11111。然后擦。 在结束时,将Max的内容复制到主磁带的开头,并将其转换为二进制文件。 这实际上是对直截了当的算法的翻译:

N = Max = 0
for all x in the input:
    if x == 0:
        N += 1
    else:
        Max = max(N, Max)
        N = 0
output Max

变量被暂存带替换。

<4294967289,这就是答案,不要相信我在图灵上给那个数字加1,它会说数字太大了。

很抱歉我忘了提到我只有一个磁带要处理。@GrzegorzOlechwierowicz一个磁带还是一个暂存带?在这两种情况下,都有标准的结构,一个磁带TMs来自多个磁带TMs。我相信只有主磁带。仅此而已。在将输入转换为这种新的稀疏格式的第一阶段之后,您应该能够在任意两个输入数字之间插入两个空格,从而将三个磁带穿插成一个