我现在正在使用Data Structures类,我们将Big-O作为算法分析的一种手段。不幸的是,经过几个小时的学习,我仍然有些困惑。我理解Big-O是什么,我在网上找到的几个好的代码示例是有道理的。但是我有一个我不明白的作业问题。任何对以下的解释都将不胜感激。
确定每个输出语句的执行次数 以下片段(根据n给出一个数字)。然后说明 算法是O(n)还是O(n2):
for (int i = 0; i < n; i++) for (int j = 0; j < i; j++) if (j % i == 0) System.out.println(i + ” ” + j);
答案 0 :(得分:1)
假设n = 5.那么,i的值将是0,1,2,3和4.这意味着这意味着内部循环将分别迭代1,2,3,4和5次。因此,if
比较执行的总次数为1 + 2 + 3 + 4 + 5。从1到n的整数之和的数学公式是n *(n + 1)/ 2。扩展,这给了我们n ^ 2/2 + n / 2
因此,算法本身是 O(n ^ 2)。
对于打印某些内容的次数,我们需要查看j%i = 0的次数。当j < i,唯一的一次是j = 0,所以这是j = 0且i不为0的次数。这意味着在外循环的每次迭代中它只有一次,除了第一次迭代(当i = 0时)。 因此,System.out.println被称为 n-1次。
答案 1 :(得分:0)
查看它的一个简单方法是:
单个循环的复杂度为O(n)
循环中的循环具有O(n ^ 2)的复杂度,依此类推。
因此上述循环的复杂度为O(n ^ 2)
答案 2 :(得分:-1)
此功能似乎在二次时间 - O(n ^ 2)中执行。
这是一个类似这样的伎俩。对于每个嵌套的for循环,为n的指数添加一个。如果存在三个循环,则该算法将以立方时间O(n ^ 3)运行。如果只有一个循环(没有涉及到一半)那么它将是线性O(n)。如果每次(递归地或迭代地)将阵列减半,则将其视为对数时间O(log n) - >基地2。
希望有所帮助。