具有多个参数的方法的大O分析

时间:2014-11-24 00:13:37

标签: algorithm big-o analysis

我们在计算机科学课程的介绍中学习效率分析,但我在解决这个问题上遇到了麻烦。

假设我有一个方法:

public static void foo(int[][] arr, int num1, int num2) {
   for (int i=0;i<arr.length;i++) {
     arr[0][i] = num1*i;
   }

   for (int j=0;j<arr.length;j++) {
     arr[i][0] = num2*i
   } 
}

我的第一个问题是,如果我有一个方法,其中有3个for循环,但它们没有嵌套,增长率会是多少?

此外,对于这种特殊的组合方法,此方法的输入大小是否为数组的区域?因为每个for循环从i = 0变为i =数组的大小

最后,如果

public static void fee(int[][] arr, double num1, double num2) {
  num1=num1*Math.random();
  while (num1 == 0) {
    num1=num1*Math.random();
  }
   for (int i=0;i<num1;i++) {
     //do something with arr
   }

  num2=num2*Math.random();
  while (num2 == 0) {
    num2=num2*Math.random();
  }
   for (int j=0;j<num2;j++) {
     //do something with arr
   } 
}

我如何寻找Big-O分析?

谢谢,我已经阅读了多个关于查找big-O的资源,但我仍感到困惑。

2 个答案:

答案 0 :(得分:0)

您可以查看程序的功能,并根据您的输入计算将执行多少基本操作。有时计算很简单,有时很难。通常它涉及数学。数学很难。生活是艰难的。

在你的第一个例子中,你是否可以弄清楚arr [0] [i]的分配数量和arr [j] [0]的分配数量是多少?

在第二个例子中,如果num1 * Math.random()为0,则while循环执行的频率是多少? (答案可能表示该代码中存在错误)。

答案 1 :(得分:0)

在第一个例子中,你有3个非嵌套for循环(或任何类型的循环),它只是O(x + y + z),其中x,y和z是重复的数量每个for循环(假设内部持续时间)。然而,只有当我们不知道哪个数字最大时,这个加号才是重要的。例如,如果我们知道x> y和x&gt; z,我们可以简单地说算法是O(x)(换句话说,我们知道它与x + y + z是线性的,但是如果我们不知道x,y和z中哪一个是最重要的因素,所以我们不能简单地说O(x)。简单地说,嵌套=乘法,而不是嵌套=添加

在第二个例子中,涉及随机数。正如nonlephant在下面的评论中所说,非正式地,在你提供的例子中它是O(无穷大)(但是,我将假设你的意思是while num2 != 0,因为如果num2 = 0,另一个将无限循环并且做没有别的)。但是,大O是最坏的情况。对于随机数,最简单的是计算平均时间复杂度。关于时间复杂性的好处是,如果你计算得比实际情况稍差,没有人关心。

TLDR:平均时间复杂度约为1000 + log_2 n,其中n为num2。

注意:虽然我们通常不会在时间复杂度计算中包含常数因子,但是当它们变得足够大时,例如1000,它们可能成为最重要的因素,特别是因为很可能n&lt;&lt; 2 ^ 1000。

冗长的解释: 因此,我们将0.5作为平均乘数(尽管实际上稍差)。每个除以2要么从尾数中取1位,要么从指数中减去1。尾数的位长度&lt;&lt;指数,所以我们只考虑指数。指数有2 ^ 11个值,但是一半是正数,我们只想要负数,所以2 ^ 10~ = 1000.为了在第一个位置得到它,它将取log2 n,所以answer = 1000 + log2 n < / p>