【问题标题】:Big O analysis for method with multiple parameters多参数方法的大 O 分析
【发布时间】:2014-11-24 09:16:14
【问题描述】:

我们正在计算机科学入门课程中学习效率分析,但我无法解决这个问题。

假设我有一个方法:

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 的资源,但我仍然感到困惑。

【问题讨论】:

  • 您的第一个方法无法编译。 arr[i][0] = num2*i 应该是 arr[j][0] = num2*j。你的第二种方法也不能编译——你应该把 double 转换为 int——如果 num1num2 永远为 0,它将无限循环。
  • 对不起,我只是写这些真的很快只是为了提供一个想法,因为我的大学不允许我在网上发布我的实际作业。
  • 我很确定你在哪里有 num2 == 0 它应该是 num2 != 0
  • 这可能对未来的任何人都有帮助stackoverflow.com/questions/59558274/…

标签: algorithm big-o analysis


【解决方案1】:

在第一个示例中,您有 3 个非嵌套 for 循环(或任何类型的循环),它只是 O(x + y + z),其中 x、y 和 z 是重复次数每个 for 循环(假设内部时间恒定)。然而,这个加号只有在我们不知道哪个数字是最大的时候才重要。例如,如果我们知道 x > y 和 x > z,我们可以简单地说算法是 O(x)(换句话说,我们知道它与 x+y+z 是线性的,但如果我们不知道不知道 x、y 和 z 中哪个是最重要的因素,所以我们不能简单地说 O(x)。简单地说,nested=multiply,而不是 nested=add

在第二个例子中,涉及到随机数。正如无关紧要在下面的评论中所说,非正式地,在您提供的示例中它是 O(infinity) (但是,我会假设您的意思是 while num2 != 0 因为如果 num2=0 另一个将无限循环,否则什么也不做)。然而,大 O 是最坏的情况。对于随机数,最简单的方法是简单地计算平均时间复杂度。时间复杂度的好处是,如果你计算得比实际情况稍差,没人会在意。

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

注意:虽然我们通常不会在时间复杂度计算中包含常数因子,但当它们变得足够大时,例如 1000,它们可能成为最重要的因子,尤其是当 n

详细解释: 因此,我们将取 0.5 作为平均乘数(尽管它实际上稍微差一些)。每除以 2 或者从尾数中减去 1 位,或者从指数中减去 1。尾数的位长度

【讨论】:

  • 嗯,第二个例子是(非正式地)O(∞)
【解决方案2】:

您查看程序做了什么,并根据您的输入计算将执行多少原始操作。有时计算很简单,有时很难。通常它涉及数学。数学很难。生活是艰难的。

在您的第一个示例中,您能否计算出对 arr [0][i] 的分配数量以及对 arr [j][0] 的分配数量?

在第二个示例中,如果 num1 * Math.random() 为 0,while 循环将多久执行一次? (答案可能表明该代码中存在错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多