Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 很难找到嵌套for循环的θ表示法中的运行时间_Algorithm_Runtime - Fatal编程技术网

Algorithm 很难找到嵌套for循环的θ表示法中的运行时间

Algorithm 很难找到嵌套for循环的θ表示法中的运行时间,algorithm,runtime,Algorithm,Runtime,我有一个三重嵌套for循环,需要用θ表示运行时间(复杂性) 我最终得到了θ(n^3),但不能100%确定我的推理是否正确 func(n) x = 0 for i = 1 to n do for j = 1 to i do for k = j to i + j do x <- x + 1 return x func(n) x=0 对于i=1到n do 对于j=1,我需要 对于k=j到i+j do 让我们看看。假设n非常大(否则复杂性将不是问题)。你

我有一个三重嵌套for循环,需要用θ表示运行时间(复杂性)

我最终得到了θ(n^3),但不能100%确定我的推理是否正确

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          x <- x + 1
return x
func(n)
x=0
对于i=1到n do
对于j=1,我需要
对于k=j到i+j do

让我们看看。假设n非常大(否则复杂性将不是问题)。你的外环有n个台阶。中间循环大约有n/2个步骤

为了理解内部循环,让我们考虑一下它的边界。终点是i+j,起点是j,所以元素的数量是i+j-j+1,也就是i+1。如果i=1,这可能非常小,如果i实际上是无限的(n),这可能非常大

无穷大有一个特性

无穷大/2=无穷大


所以,如果我们假设n的值为无穷大,那么即使n/2也不是有限的。所以,你的结果是正确的,我们有θ(n^3),当然,我们并不真正关心加一些常量值或用有限的严格正数乘以n。

让我们看看。假设n非常大(否则复杂性将不是问题)。你的外环有n个台阶。中间循环大约有n/2个步骤

为了理解内部循环,让我们考虑一下它的边界。终点是i+j,起点是j,所以元素的数量是i+j-j+1,也就是i+1。如果i=1,这可能非常小,如果i实际上是无限的(n),这可能非常大

无穷大有一个特性

无穷大/2=无穷大


所以,如果我们假设n的值为无穷大,那么即使n/2也不是有限的。所以,你的结果是正确的,我们有θ(n^3),当然,我们并不真正关心加一些常量或用一个有限的严格正数乘以n。

你可以从内到外一步一步地解决这个问题:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          x <- x + 1
return x
下一个循环运行
(i+j)-j+1=i+1
次:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      Theta(i)
return x
通过这种方式,我们得到:

func(n)
    x = 0 
    for i = 1 to n do
       Theta(i^2)
    return x
最后,使用从1到
n
的平方和是
n(n+1)(2n+1)/6=n^3/3+n^2/2+n/6=Theta(n^3)


由于所有剩余语句都以恒定时间运行,因此总体复杂性为θ(n^3)

您可以从内部循环到最外部循环逐步解决此问题:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      for k = j to i + j do
          x <- x + 1
return x
下一个循环运行
(i+j)-j+1=i+1
次:

func(n)
x = 0 
for i = 1 to n do
   for  j = 1 to i do
      Theta(i)
return x
通过这种方式,我们得到:

func(n)
    x = 0 
    for i = 1 to n do
       Theta(i^2)
    return x
最后,使用从1到
n
的平方和是
n(n+1)(2n+1)/6=n^3/3+n^2/2+n/6=Theta(n^3)


由于所有剩余的语句都在固定时间内运行,因此总体复杂性是θ(n^3)

,证明不起作用。尝试使用
Theta(log(n))
Theta(2^n)
。你所能证明的就是算法是
o(1)
@Paul我不知道你想说什么。这两个陈述“所以,如果我们假设无穷大为n的值,即使n/2也不是有限的。所以,你的结果是正确的,我们有θ(n^3),当然,…”没有任何关联。如果你想处理无穷大,你必须实际比较如下函数:
lim n->inf n^3/g(n)
,其中
g(n)
描述了算法根据
n
所采取的步骤数,并证明它收敛到一个不同于0的值。@Paul我们用常数除以n。无穷大/2=无穷大。而证据也不“起作用”,因为它不是机器或工程产品。证明是一种理论上的产物。随你怎么说。无论哪种方式,这都不是任何形式的理论产物,因为它完全忽略了基本的逻辑规则。从数学角度来看,说“无穷大/2”已经是错误的,因为无穷大并不是任何代数对象的成员。但即使忽略这一点,你的证明也有很多缺点:你不能从
lim n->inf n=inf
这一事实中得出很多结论,“大约有n/2个步骤”是你无法基于实际证明的,你不能将这两个事实结合起来推导出关于两个内部循环的任何东西,等等,证明不起作用。尝试使用
Theta(log(n))
Theta(2^n)
。你所能证明的就是算法是
o(1)
@Paul我不知道你想说什么。这两个陈述“所以,如果我们假设无穷大为n的值,即使n/2也不是有限的。所以,你的结果是正确的,我们有θ(n^3),当然,…”没有任何关联。如果你想处理无穷大,你必须实际比较如下函数:
lim n->inf n^3/g(n)
,其中
g(n)
描述了算法根据
n
所采取的步骤数,并证明它收敛到一个不同于0的值。@Paul我们用常数除以n。无穷大/2=无穷大。而证据也不“起作用”,因为它不是机器或工程产品。证明是一种理论上的产物。随你怎么说。无论哪种方式,这都不是任何形式的理论产物,因为它完全忽略了基本的逻辑规则。从数学角度来看,说“无穷大/2”已经是错误的,因为无穷大并不是任何代数对象的成员。但是即使忽略这一点,你的证明也有很多缺点:你不能从以下事实得出很多结论:
lim n->inf n=inf
,“大约有n/2个步骤”是你无法基于实际证明的,你不能将这两个事实结合起来推导出关于两个内部循环的任何东西,等等,这段代码的复杂性也是O(n^3),欧米茄呢@Paul@ManojBanik如果一个代码同时是
O(n^3)
Omega(n^3)
它会自动
Theta(n^3)
,反之亦然。这是θ时间复杂度的标准定义。基本上,为了方便起见,上面的证明只是将上界和下界的证明统一到一行参数中