Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 多参数法的大O分析_Algorithm_Big O_Analysis - Fatal编程技术网

Algorithm 多参数法的大O分析

Algorithm 多参数法的大O分析,algorithm,big-o,analysis,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 } } public

我们在计算机科学导论课上学习效率分析,我在解决这个问题上遇到了困难

假设我有一个方法:

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
   } 
}
publicstaticvoidfoo(int[]arr,int num1,int num2){

对于(int i=0;i你看程序做什么,然后根据你的输入计算将执行多少原始操作。有时计算简单,有时困难。通常涉及数学。数学很难。生活很艰难

在第一个示例中,您是否可以计算出有多少分配给arr[0][i]和多少分配给arr[j][0]


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

在第一个示例中,如果有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,not nested=add

在第二个例子中,涉及到随机数。正如irrelephant在下面的评论中所说的,非正式地说,在你提供的例子中是O(无穷大)(然而,我将假设你的意思是当num2!=0时
,因为如果num2=0,另一个将无限循环,否则什么也不做).然而,大O是最坏的情况。对于随机数,简单地计算平均时间复杂度是最容易的。时间复杂度的好处是,如果你计算的比实际情况稍微差一点,没有人在乎

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


注意:虽然我们通常不在时间复杂度计算中包含常量因子,但当它们变得足够大时,例如1000,它们可能会成为最重要的因子,特别是当n您的第一个方法可能无法编译时。
arr[i][0]=num2*i
应该是
arr[j][0]=num2*j
。你的第二个方法也不编译——你应该将double转换为int——如果
num1
num2
为0,它将无限循环。对不起,我实际上很快就写了这些,只是为了给你一个想法,因为根据我的大学,我不允许在网上发布我的实际作业。我很好如果你有
num2==0
它应该是
num2!=0
这可能对未来的任何人都有帮助。第二个例子是(非正式地)
O(∞)
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
   } 
}