证明图灵机的数量是O(n)?

时间:2015-01-31 05:23:04

标签: algorithm time-complexity proof turing-machines

所以在过去的几天里,我一直在设计一台图灵机,并发现通过我的实现,我的二进制计数运行在大约4n,其中n是我计算的数字。所以O(4n) - >上)。我不太擅长证明复杂性,但从我对研究的理解是,如果你有一个图灵机,M,对于{0,1} *中的每个n,t_ {M}(n)将是多久它需要数到n,对吗?然后,如果它没有停止,那么它的最高界限就是无穷大。有没有办法在这两者之间架起一座桥梁来得出这样的结论:确实有n个步骤确实是最坏的情况?我不知道从哪里开始证明,任何想法?

更新:

下面是我的图灵机表示,用于计算二进制:

import java.util.Scanner;
public class TuringMachine {

/**
 * Divide a number n by 2 shifting right (shift-right-logical) 
 * to figure out the minimum number of bits needed to represent
 * the number in binary.
 */
private static int getNumBits(int n) {
    int c = 0;
    while (n > 0) {
        c++;
        n = n >> 1;
    }
    return c;
}

private static void computeBinaryValues(int n) {
    System.out.println();

    int i, c, state;
    char symbol;
    String t;

    System.out.println("Computed binary values for:"); 

    // Compute values of n = 1 to n  
    for (int j = 1; j <= n; j++) {
        t = ""; // temp string
        state = 0; // current state
        symbol = ' '; // current symbol being read
        c = getNumBits(j) + 1; // minimum number of bits needed + 1 for a buffer
        i = c - 1; // indexing starting from end of the string 

        // initialize temp string to contain all ' ' characters
        for (int k = 0; k < c; k++) {
            t += " ";
        }

        // String builder off "empty" t string 
        StringBuilder s = new StringBuilder(t);
        // The actual binary representation of n + end space buffer
        String a = Integer.toBinaryString(j) + " ";

        // Turing Cycle  
        while (!(s.toString()).equals(a)) { // if the binary build is successful, these match.
            if (state == 0) {
                if (symbol == ' ') {
                    state = 1;
                    i--; // left
                } else { // symbols 0 and 1 rewrite themselves && move right 1
                    i++; // right
                } 
            } else if (state == 1) {
                if (symbol == ' ') {
                    s.setCharAt(i, '1');
                    state = 0;
                    i++; // right
                } else if (symbol == '0') {
                    s.setCharAt(i, '1');
                    state = 0;
                    i++; // right
                } else {
                    s.setCharAt(i, '0');
                    i--; // left
                }
            }
            symbol = s.charAt(i); // get symbol to read from
        }
        System.out.println(j + " -> " + s); // print binary string created from machine
    }
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Enter value for n >= 1: ");;
    computeBinaryValues(in.nextInt());
}
}

所以,使用Ishtar的归纳建议:

C(0) = a C(1) = b C(2) = c

设k是一个常数 - 从我的代码实验中假设为4。

c = k + b b = k + a

他说我们必须证明c(i+1) = c(i) + k然后我解释了它的含义? (我不理解他的归纳案例)

2 个答案:

答案 0 :(得分:0)

如果我正确地理解你的问题,那么你是想弄清楚你的图灵机是否停止,如果它不是最坏的时间复杂性是无限的吗? 如果这是你的问题而不是你不能在两者之间架起一座桥梁,为什么呢?因为暂停问题(确定程序是否停止的问题)对图灵机是不可判定的,这意味着决定你的TM停止与否的算法不存在(并且永远不会存在)。

答案 1 :(得分:0)

证明您的机器在O(n)中运行的一种方法是通过感应证明。 (我无法告诉您这是否适合您的机器,因为我不知道您的机器是什么样的。)将c(n)定义为机器计算输入磁带所需的步数长度n。 (或者你在想什么?)现在试着证明:

  1. c(0)= k
  2. c(1)= l
  3. c(2)= m
  4. 如果它确实以4n步进行,那么m = 4 + ll = 4 + k。现在最困难的部分,证明

    1. c(i + 1)= c(i)+ 4
    2. 然后,我们可以从证明c(n) = 4*n + kn>=0得出所有c(0) = k c(i+1) = c(i) + 4的结论。因为c(n) = O(4n) = O(n)机器在O(n)中运行。

      (您还应该证明机器始终终止并给出正确的结果,但这可能超出了范围。)


      更新

      所以,你的机器实际上并没有计算任何东西。它永远运行,编写所有二进制数。如果编写输入数字,Java程序会停止机器,机器本身会永远存在,对吗?

      让我们定义机器成功写入数字的点:state = 0并且在读取input ='blank'之前。同意?

      c(n)定义为步骤数,机器需要写n,(因此state = 0,input ='blank',并且n的二进制表示被写入在磁带上)。现在,尝试证明c(0) = kc(1) = lc(2) = m k,l和m的实际值!例如c(0) = 2c(1) = 8 ?? (我没有尝试这些值。)只需按照机器一步一步计算。

      需要证明的是c(i+1) = c(i) + something。然后,您可以将c(i)解析为封闭形式。可以这样想,如果在磁带上写了111(并且状态= 0,下一个输入='空'),机器将通过多少步骤来编写1000(和state = 0,next input ='blank'):4,5,6,7,8或......?