Algorithm 很难找到嵌套for循环的θ表示法中的运行时间
我有一个三重嵌套for循环,需要用θ表示运行时间(复杂性) 我最终得到了θ(n^3),但不能100%确定我的推理是否正确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非常大(否则复杂性将不是问题)。你
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)
,反之亦然。这是θ时间复杂度的标准定义。基本上,为了方便起见,上面的证明只是将上界和下界的证明统一到一行参数中