Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
重复加倍字符串的时间复杂度是多少? 考虑下面的C++代码: string s = "a"; for (int i = 0; i < n; i++) { s = s + s; // Concatenate s with itself. }_String_Algorithm_Complexity Theory_Big O_Big Theta - Fatal编程技术网

重复加倍字符串的时间复杂度是多少? 考虑下面的C++代码: string s = "a"; for (int i = 0; i < n; i++) { s = s + s; // Concatenate s with itself. }

重复加倍字符串的时间复杂度是多少? 考虑下面的C++代码: string s = "a"; for (int i = 0; i < n; i++) { s = s + s; // Concatenate s with itself. },string,algorithm,complexity-theory,big-o,big-theta,String,Algorithm,Complexity Theory,Big O,Big Theta,通常,在分析一段代码的时间复杂度时,我们会确定内部循环做了多少工作,然后将其乘以外部循环运行的次数。然而,在这种情况下,内部循环所做的工作量随着迭代的不同而变化,因为正在构建的字符串越来越长 您将如何分析此代码以获得big-O时间复杂度?此函数的时间复杂度为Θ2n。要了解原因,让我们看看函数的作用,然后看看如何分析它 首先,让我们跟踪n=3的循环。在迭代0之前,字符串s是字符串a。迭代0将s的长度加倍,使s=aa。迭代1将s的长度加倍,使s=aaaa。迭代2然后将s的长度加倍,使s=aaaa 如

通常,在分析一段代码的时间复杂度时,我们会确定内部循环做了多少工作,然后将其乘以外部循环运行的次数。然而,在这种情况下,内部循环所做的工作量随着迭代的不同而变化,因为正在构建的字符串越来越长


您将如何分析此代码以获得big-O时间复杂度?

此函数的时间复杂度为Θ2n。要了解原因,让我们看看函数的作用,然后看看如何分析它

首先,让我们跟踪n=3的循环。在迭代0之前,字符串s是字符串a。迭代0将s的长度加倍,使s=aa。迭代1将s的长度加倍,使s=aaaa。迭代2然后将s的长度加倍,使s=aaaa

如果您注意到,在循环的k次迭代之后,字符串s的长度是2k。这意味着循环的每次迭代将花费越来越长的时间来完成,因为将字符串s与自身连接起来将花费越来越多的工作。具体来说,循环的第k次迭代需要时间Θ2k才能完成,因为循环迭代构造了一个大小为2k+1的字符串

我们可以分析这个函数的一种方法是将内部循环的最坏情况时间复杂度乘以循环迭代次数。因为每个循环迭代需要时间O2n才能完成,并且有n个循环迭代,所以我们可以得到,这个代码需要时间·2n才能完成

然而,事实证明,这种分析不是很好,实际上会高估代码的时间复杂度。确实,这段代码在·2n上及时运行,但请记住,big-O表示法给出了一段代码运行时的上限。这意味着该代码运行时的增长率不大于n·2n的增长率,但这并不意味着这是一个精确的界限。事实上,如果我们更精确地查看代码,我们可以得到更好的边界

让我们先试着对所做的工作做一些更好的说明。此循环中的工作可分为两个较小的部分:

循环头中完成的工作,它增加i并测试循环是否完成。 在循环体中完成的工作,循环体将字符串与自身连接起来。 在这里,当考虑这两个点的工作时,我们将考虑所有迭代中完成的工作总量,而不仅仅是一次迭代

让我们看一下其中的第一个——循环头所做的工作。这将正好运行n次。每一次,代码的这一部分只做O1工作,递增i,对照n测试它,并决定是否继续循环。因此,这里所做的全部工作是Θn

现在让我们看看循环体。如前所述,迭代k在迭代k上创建长度为2k+1的字符串,这大约需要2k+1的时间。如果我们在所有迭代中总结这一点,我们可以得出所完成的工作大体上是这样的

21+22+23+…+2n+1

那么这个总数是多少?之前,我们注意到,我们得到了On·2n的一个界

21+22+23+…+2n+1

<2n+1+2n+1+2n+1+…+2n+1

=n·2n+1=2n·2n=n·2n

然而,这是一个非常弱的上界。如果我们更善于观察,我们可以将原始总和识别为,其中a=2,r=2。考虑到这一点,这些项的总和可以精确地计算出来

2n+2-2=42n-2=Θ2n

换句话说,循环体在所有迭代中完成的总功是Θ2n

回路完成的总功由回路维护中完成的功加上回路主体中完成的功得出。结果是Θ2n+Θn=Θ2n。因此,循环完成的总功为Θ2n。它的增长速度非常快,但远不及我们最初分析得出的On·2n的速度

简而言之,在分析循环时,通过将循环的迭代次数乘以在该循环的任何一次迭代中完成的最大工作量,始终可以得到保守的上界。然而,做一个更精确的分析通常可以给你一个更好的界限


希望这有帮助

该函数的时间复杂度为Θ2n。要了解原因,让我们看看函数的作用,然后看看如何分析它

首先,让我们跟踪n=3的循环。在迭代0之前,字符串s是字符串a。迭代0将s的长度加倍,使s=aa。迭代1将s的长度加倍,使s=aaaa。迭代2然后将s的长度加倍,使s=aaaa

如果您注意到,在循环的k次迭代之后,字符串s的长度是2k。这意味着循环的每次迭代都需要越来越长的时间才能完成,因为 将字符串s与自身连接起来将需要越来越多的工作。具体来说,循环的第k次迭代需要时间Θ2k才能完成,因为循环迭代构造了一个大小为2k+1的字符串

我们可以分析这个函数的一种方法是将内部循环的最坏情况时间复杂度乘以循环迭代次数。因为每个循环迭代需要时间O2n才能完成,并且有n个循环迭代,所以我们可以得到,这个代码需要时间·2n才能完成

然而,事实证明,这种分析不是很好,实际上会高估代码的时间复杂度。确实,这段代码在·2n上及时运行,但请记住,big-O表示法给出了一段代码运行时的上限。这意味着该代码运行时的增长率不大于n·2n的增长率,但这并不意味着这是一个精确的界限。事实上,如果我们更精确地查看代码,我们可以得到更好的边界

让我们先试着对所做的工作做一些更好的说明。此循环中的工作可分为两个较小的部分:

循环头中完成的工作,它增加i并测试循环是否完成。 在循环体中完成的工作,循环体将字符串与自身连接起来。 在这里,当考虑这两个点的工作时,我们将考虑所有迭代中完成的工作总量,而不仅仅是一次迭代

让我们看一下其中的第一个——循环头所做的工作。这将正好运行n次。每一次,代码的这一部分只做O1工作,递增i,对照n测试它,并决定是否继续循环。因此,这里所做的全部工作是Θn

现在让我们看看循环体。如前所述,迭代k在迭代k上创建长度为2k+1的字符串,这大约需要2k+1的时间。如果我们在所有迭代中总结这一点,我们可以得出所完成的工作大体上是这样的

21+22+23+…+2n+1

那么这个总数是多少?之前,我们注意到,我们得到了On·2n的一个界

21+22+23+…+2n+1

<2n+1+2n+1+2n+1+…+2n+1

=n·2n+1=2n·2n=n·2n

然而,这是一个非常弱的上界。如果我们更善于观察,我们可以将原始总和识别为,其中a=2,r=2。考虑到这一点,这些项的总和可以精确地计算出来

2n+2-2=42n-2=Θ2n

换句话说,循环体在所有迭代中完成的总功是Θ2n

回路完成的总功由回路维护中完成的功加上回路主体中完成的功得出。结果是Θ2n+Θn=Θ2n。因此,循环完成的总功为Θ2n。它的增长速度非常快,但远不及我们最初分析得出的On·2n的速度

简而言之,在分析循环时,通过将循环的迭代次数乘以在该循环的任何一次迭代中完成的最大工作量,始终可以得到保守的上界。然而,做一个更精确的分析通常可以给你一个更好的界限


希望这有帮助

这里隐藏了关于内部字符串表示和串联操作的假设。在这种特定情况下,字符串a…a可以用小于n倍的“a'-2”字段表示,计数器和值就足够了。考虑到这一点,连接操作也会更快。@icepack-这是绝对正确的。例如,如果字符串的表示使用了rope,那么这将以线性时间运行。您在这里隐藏了关于内部字符串表示和连接操作的假设。在这种特定情况下,字符串a…a可以用小于n倍的“a'-2”字段表示,计数器和值就足够了。考虑到这一点,连接操作也会更快。@icepack-这是绝对正确的。例如,如果字符串的表示使用了rope,这将以线性时间运行。