我对下面的程序是否以指数时间运行有一个简单但令人困惑的疑问。问题是:给定一个+ ve整数作为输入,打印出来。问题是您故意在循环中执行此操作,如下所示:
int input,output=0;
cin >> input;
while (input--) ++output; // Takes time proportional to the value of input
cout << output;
我声称此问题在指数时间内运行。因为,当您将输入中的位数增加1时,程序将花费两倍的时间来执行。换句话说,要打印出log2(输入)位,需要O(输入)时间。
这种推理是对的吗?
答案 0 :(得分:2)
你有点回答了自己的问题:
//占用与输入值
成比例的时间
这正是发生的事情。如果您将输入加倍,则需要将时间加倍。如果你把它增加三倍,你需要三倍的时间。
即。 cost = constant * input_size
您可以看到input_size的线性关系。
指数关系类似于:
cost = constant *(input_size)^ x
如果是X,你会有所不同。这不是这种情况。
答案 1 :(得分:0)
我认为当你有理由时,你有点困惑:
当您将输入中的位数增加1时,程序将花费两倍的时间来执行
这实际上是说当你将输入的大小加倍时,执行时间会翻倍。因此,它实际上是一个线性关系,并且将是Big O(n)。
答案 2 :(得分:0)
你可以说它是指数级的,但它最终仍然是O(input)
。
输入的大小为O(log input)
。如你所说,价值翻倍的时间加倍:
1 bits => 1 increments max
2 bits => 4 increments max
3 bits => 8 increments max
...
n bits => 2^n increments max
因此运行时间为O(2^log(input)) = O(input)
。所以你可以说它的位数是指数或线性的。这是同一件事。通常你会说input
的值是线性的。