对于以下每个代码段,我需要说明增长函数以及顺序。我很确定我的命令是否正确,但是我很难看到整个函数的常量和所有函数都可以从我提供的内容中得到。
以下是代码:
// CODE #1
for (int count=0; count<n; count++)
{
for (int count2=0; count2<n; count2=count2+2)
{
System.out.println(count + ", " + count2);
}
}
// CODE #2
for (int count=0; count<n; count++)
{
for (int count2=1; count2<n; count2=count2*2)
{
System.out.println(count + ", " + count2);
}
}
// CODE #3
for (int count = 0; count < n; count++) {
printsum(count); }
// Here’s the method:
public void printsum(int count) {
int sum = 0;
for (int i=1; i<count; i++) {
sum += i;
}
System.out.println(sum + ": " + sum);
}
// CODE #4
for (int count = 0; count < n; count++)
{
printsum(count);
}
// Here’s the method:
public void printsum(int count) {
int sum = 0;
sum = count * (count + 1)/2;
System.out.println(“sum : " + sum);
}
我认为订单为O(n^2)
,O(nlogn (base 2))
,O(n^2)
和O(n^3)
。如果有人能提出任何关于寻找增长功能或纠正我的工作的建议,请告诉我。
答案 0 :(得分:3)
构建增长率函数只是查找与(n)相关的每个特定代码段的评估次数。您需要合并分配或初始化变量的次数以及循环检查它们是否完成运行的次数。
我可以帮助解决#1代码,并为您留下其余部分。
我们将从评估外部for循环开始。变量计数中要分配多少次?这段逻辑只会执行一次所以这里的答案是1.循环执行评估计数(小于)n的次数是多少?这部分代码将被评估总共n + 1次,是循环实际运行的n倍,以及一个额外的时间,即停止循环处理的评估。最后在外部for循环中,count变量将递增多少次(count ++)?这将总共发生n次。
到目前为止我们有什么?
我们的外部for循环为我们提供了迄今为止的功能:
GRF = 1 + n+1 + n
现在开始我们的内部for循环。整个内部for循环执行多少次?内部for循环将总共执行n次。这意味着我们需要将所有内部for循环过程乘以n。我们的GRF最终会看起来像这样:
GRF = 1 + n+1 + n + n(processes of the inner for loop)
暂时忽略n的乘法,我们将继续评估内部for循环,因为我们从上面执行外部for循环。变量count2的初始化会发生多少次?这将发生一次。代码count2(小于)n将被计算多少次?这部分有点棘手,因为你需要查看count2变量的增量率。在每次循环执行期间,它递增值2。这意味着变量将以两倍的速度增长,并且循环将仅被评估为该变量仅增加1的次数的一半。所以我们有(n + 1)/ 2。记住导致循环失败的评估的+1帐户,这里循环只会被评估一半次。现在,为内循环声明的最后一部分。 count2变量会递增多少次?这将发生n / 2次。 System.out.println()在内部for循环中多少次?这将与count2变量的递增次数相同,因此会发生n / 2次。
现在我们需要将所有这些评估插入上面GRF的内部for循环部分。我们最终会得到这样的结论:
GRF = 1 + n+1 + n + n( 1 + (n+1)/2 + n/2 + n/2)
让我们做一个小代数
1 + n+1 + n + n( 1 + n/2 + 1/2 + n/2 + n/2)
1 + n+1 + n + n + (n^2)/2 + n/2 + (n^2)/2 + (n^2)/2
3(n^2/2) + 7n/2 + 2
我们走了。增长率函数。为了得到O(),我们只保留最大的项,并将所有的常数和因子排除在外,这样我们就得到一个O(n ^ 2)。