无限循环计算时间T(n)和Big-O

无限循环计算时间T(n)和Big-O,big-o,infinite-loop,Big O,Infinite Loop,我对如何创建函数T(n)来测量嵌套无限循环的计算时间感到困惑。代码如下: x=1; for(int i = 0;i<n-1;i++){ for(int j = 1; j<=x; j++){ cout << j << endl; x*=2; } } x=1; 对于(inti=0;i嗯,在现实世界中,你不会得到答案,原因很明显,但在数学中……为什么不呢 我将写下函数的时间方程: T(n) = n-1 * T(X

我对如何创建函数T(n)来测量嵌套无限循环的计算时间感到困惑。代码如下:

x=1;
for(int i = 0;i<n-1;i++){
     for(int j = 1; j<=x; j++){
        cout << j << endl;
        x*=2;
     }
}
x=1;

对于(inti=0;i嗯,在现实世界中,你不会得到答案,原因很明显,但在数学中……为什么不呢

我将写下函数的时间方程:

T(n) = n-1 * T(X) 
T(X)
是内部循环的时间。我将扩展它:
X1
=
X
的初始值(在本例中为
1

这个循环的结束条件是当
j>=X1*2^j+1
时,所以我们要解决:

j >= X1 * 2^j -> j = 2^j -> j <= log2(j).

j>=X1*2^j->j=2^j->j算法复杂性仅为算法定义,根据(最常用的)定义,算法复杂性必须终止。此过程不会终止(除了“实践中”正如Marcelo所指出的;即,作为一个在真实机器上的程序,与理论上在一个有无限磁带的理论图灵机上以及在世界上的所有时间)因此不是一个算法。因此它没有“算法时间复杂性”


试图确定非算法的算法复杂度是徒劳的,如果它是一个无限过程,那么试图将其运行时间表示为多项式也是徒劳的。

真正无限循环的大O复杂度是未定义的。。原因如下:

大O符号的定义是:

f(N)=O(g(N))
当且仅当
f(N)=n0

然而,前提是
f(n)
g(n)
是实值函数

在无限循环的情况下,完成循环所需时间的假设值是无限的。因此,函数
f(n)
不会映射到实数。因此,
f(n)
不是实值函数,我们无法以数学意义上的方式应用标准大O定义

(维基百科上的页面更正式地说明了定义,但结果是一样的。)


我们还认为,根据一般定义,一个在有限步数内无法完成的算法严格来说不是一个算法(例如,见维基百科)。因为无限循环无法完成……永远……它不是一个算法,也不可能具有算法复杂性


(然而,我不喜欢这种解释,因为它依赖于术语“算法”的特定定义。问题实际上没有使用该术语。)

我完全搞糊涂了。你想要无限循环的运行时间吗?它是无限的。顺便说一句,外循环是不相关的,因为内循环永远不会完成。而且,在实践中它可能不是无限的,因为如果它是整数类型,x最终会换行。时间复杂性只对终止的算法有意义。是的,我知道外循环op是不相关的,是的,我知道为这样的事情设计一个计算算法是没有意义的,但我需要尝试:)上帝不!一般来说,对数不是为小于或等于
0
的任何参数定义的。Log不是在0下定义的,但在我看来,你也不能定义无限循环的时间复杂度。那么,你应该这样写,而不是写一个数学上错误的答案!这与你的第一段特别矛盾:但在数学方面。。。为什么不呢?更好的答案应该是
T(n)=+inf
,因为它肯定不会引起操作混乱。我不同意。OP提出了一个明显不规则的问题。因此,我认为一种不规则的方法将有利于这个问题。这就像sqrt(n)的问题一样,我不反对扩展数学。但在数学中,你添加到它的所有内容,必须与已经存在的所有内容保持一致(正确)。你的定义并不遵循这一点,因为它导致了一个矛盾-考虑到
2^x
R
中严格增加,我们得到了
0.5=2^-1=
空间复杂度(
Theta(1)
这里),这对于你的结果来说同样是不正确的。
j >= X1 * 2^j -> j = 2^j -> j <= log2(j).