AP计算机科学A:算法分析

AP计算机科学A的学习概念,示例问题和解释

大学导师应用商店 大学导师安卓商店

例子问题

←之前 1

例子问题1:算法分析

countStatements() {

Int = 10, b = 15, c = 7;

/ /开始

For (int I = 0;I < a;I += 2) {

b——;

System.out.print(“*”);

For (int I = b;我> = 0;我(){

For (int j = 0;J < c;j + +) {

System.out.print(“*”);

/ /结束

在上面的代码中,多少次将System.out.print在评论之间调用"/ /开始“而且”/ /结束"?

可能的答案:

正确答案:

解释

从计算第一个循环循环的次数开始。注意,循环控制变量(即,)每次循环增加2。这意味着你将循环i = 0,2,4,6,8。它不会循环到10,因为,就等于一个.这将终止循环。因此,到目前为止,您已经有了五个循环。注意,这也意味着b减了5倍。因此,在循环的最后,b现在等于10。

对于第二个循环,你必须小心,因为它有两个循环。外部循环将运行I = 10I = 0.这总共是11个循环。(注意这一点很重要,因为它不仅适用于10到1,而且适用于最后的数字0。该循环中的循环将从j= 0到j= 6(即小于c,即7)。这总共是7个循环。因此,这些嵌套循环总共将运行77次。总共调用System.out.print,或82。

例子问题1:算法分析

countStatements() {

Int [] array = new Int [54];

For (int I = 0;I < array.length;我+ +){

数组[i] = 3 * i + 1;

System.out.println(“耶!”);

For (int I = 0;I < array[5];我+ +){

数组[我]——;

System.out.println(“耶!”);

For (int I =数组[3];我> 0;我(){

System.out.println(“耶!”);

会打给多少个电话System.out.println在上面的代码中?

可能的答案:

正确答案:

解释

让我们计算每个循环,在需要时注意变量。第一个循环总共将运行54次。因此,它将总共执行54次。还要注意它是如何初始化数组的。这将在第二个循环中使用。每个元素都等于3i + 1.因此,我们将有:

A [0] = 1;A [1] = 4;A [2] = 7;A [3] = 10;A [4] = 13;A [5] = 16;等。

现在,循环2将使用一个[5]控制它的执行。注意它是从I = 0I = 15.的值在每次执行时都会减少(我)由一个。因此,要小心。它最终会跑一个[5],因此是15。这将用于循环控件。这意味着它实际上只从I = 0I = 14.因此,循环总共运行15次次了。

最后一个循环从I = 9I = 1.(注:这是因为在第二个循环中减量。)一共执行了9次。

因此,执行的总数为:

例子问题1:算法分析

下面的代码片段中执行了多少条语句?

For (int I = 0;I < arrr .length;我+ +){

If (i == 2) {

我+ +;

可能的答案:

2

6

5

3.

正确答案:

5

解释

代码片段中执行的语句顺序如下:

  1. Int I = 0
  2. I < arrr .length
  3. i++(等价于I = I + 1)
  4. I == 2
  5. 我+ +

这些语句都是在每次for循环运行时按顺序执行的。如果if语句为假,有时可能只执行4次。

例子问题2:算法分析

考虑下面的代码:

O_log_n__

代码的运行时是什么(用大o符号?)

可能的答案:

正确答案:

解释

运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。控制这个常量时间操作的“for”循环在i = 1时初始化,i通过乘以2迭代,直到它等于或大于n。因此,这个循环将运行次数,运行时间为O(log(n))

例5:算法分析

考虑下面的代码:


O_2n_

代码的运行时间是多少(用大o表示法?)

可能的答案:

正确答案:

解释

这段代码的运行时间最好通过插入数字进行分析。以bar(2)的值为例。Bar(2)会导致对Bar(1)的两次调用,而Bar(1)又会导致对Bar(0)的四次调用。对bar(4)的调用将导致对bar(3)的两次调用,对bar(2)的4次调用,对bar(1)的8次调用,以及对bar(0)的16次调用。因此,可以表明调用的数量与2^n成正比,并且运行时间为O(2^n)。

例子问题3:算法分析

考虑下面的代码:

O_n_

代码的预期运行时是多少(用大o符号?)

可能的答案:

正确答案:

解释

运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。这个常数时间操作在for循环中执行n次,导致运行时间与n成正比,或O(n)。

例子问题3:算法分析

考虑下面的代码:

O_n2_

代码的预期运行时间是多少(用大o表示法?)

可能的答案:

正确答案:

解释

运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。这个常数时间操作在内部的for循环中执行n次,在外部的for循环中执行n次。因此,运行时间为

例8:算法分析

考虑下面的代码:

O_n3_

代码的运行时间是多少(用大o表示法)?

可能的答案:

正确答案:

解释

运行时的最佳分析方法是逐行分解代码。迭代sum值的行在常数时间内执行,或O(1)。执行这个常数时间操作在内部的“for”循环中,和外部循环中的Times。因此,总体运行时间为

问题9:算法分析

下面这个函数的BigO是多少?

bigO(int[][] m)
If (m.length > 2)
For (int I = 0;I < m.length - 1;我+ +)
For (int j = 0;J < m[i].length;j + +)
System.out.println (m[我][j]);
其他的
For (int j = 0;J < m[0].length;j + +)
System.out.println (m [0] [j]);
可能的答案:

O (1)

O (log (n))

O (n)

O (n * log (n)

O (n2

正确答案:

O (n2

解释

函数是O(n2),因为它有一个大小为2的嵌套循环,没有额外的附加内容可能会添加到log(n)中。一个好的经验法则是:如果有嵌套循环,那么BigO通常是O(n)),其中m为最长部分的循环级别。

例子问题1:比较运行时间

哪个更有效(即更低的大O)?

1)

Arr = [1,2,3,4,5,6,7,8]

arr2 =[[1、2],[3,4],[5,6],[7,8],[9 10],[10 11]]

For (int I = 0;I < arrr .length;我+ +){

For (int j = i;J < arr2.length;j + +) {

Arr [i][j] = 0;

2)

Arr = [1,2,3,4,5,6,7,8]

arr2 =[[1、2],[3,4],[5,6],[7,8],[9 10],[10 11]]

For (int I = 0;I < arrr .length;我+ +){

For (int j = 0;J < arr2.length;j + +) {

Arr [j] = 0;

可能的答案:

无关紧要的

1

2

大O是等价的

正确答案:

2

解释

代码示例#1依赖于第二个循环中的i,其中int j = i。由于代码依赖于第二个循环中的i,因此顺序从O(N)到O(N)2

代码示例#2有两个互不依赖的独立循环。第一个for循环遍历数组arr,第二个for循环遍历数组arr2。因为两个循环是互斥的,所以顺序是O(N)

←之前 1
大学导师的学习工具