Time complexity 包含两个for循环的算法的时间复杂度 publicstaticvoidmain(字符串[]args){ 扫描仪sc=新的扫描仪(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int结果=0; 对于(int i=0;i0;j--) 结果+=1; m-=1; } 系统输出打印项次(结果); }

Time complexity 包含两个for循环的算法的时间复杂度 publicstaticvoidmain(字符串[]args){ 扫描仪sc=新的扫描仪(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int结果=0; 对于(int i=0;i0;j--) 结果+=1; m-=1; } 系统输出打印项次(结果); },time-complexity,complexity-theory,Time Complexity,Complexity Theory,这个问题是对的还是错的。声明是“当n远大于2m时,以下程序的时间复杂度为O(nm)”。对还是错 问题中的时间复杂度是指最坏情况下的时间复杂度。这就是我到目前为止所做的: 内循环运行m次,m值每次减少1。然后,内部循环的总迭代次数为:m+m-1+m-2+m-3+…+3+2+1 我们可以认为这是一个算术序列。 然后,内部循环的总迭代次数为:m(m+1)/2=(m2+m)/2 在m达到0后,由于n远大于2*m,外部循环将在O(1)时间内继续运行n-m次 因此,时间复杂度为:(m2+m)/2+n-m=O

这个问题是对的还是错的。声明是“当n远大于2m时,以下程序的时间复杂度为O(nm)”。对还是错

问题中的时间复杂度是指最坏情况下的时间复杂度。这就是我到目前为止所做的:

内循环运行m次,m值每次减少1。然后,内部循环的总迭代次数为:m+m-1+m-2+m-3+…+3+2+1

我们可以认为这是一个算术序列。

然后,内部循环的总迭代次数为:m(m+1)/2=(m2+m)/2

在m达到0后,由于n远大于2*m,外部循环将在O(1)时间内继续运行n-m次

因此,时间复杂度为:(m2+m)/2+n-m=O(m2)


这是解决这个问题的正确方法吗?

不,那不正确。首先,这里没有“最坏情况”或“最佳情况”,因为步骤的数量完全由
n
m
决定

正如你所说,这是一个肯定/否定的问题。因此,简单地计算时间复杂度并不是解决这个问题的正确方法(顺便说一句,结果不是
O(m^2)
-你不能只删除
n
!)

你到最后一步的推理是正确的。正如您正确计算的那样,步骤数为
(m^2-m)/2+n
(简化后)。问题是:
(m^2-m)/2+n
是集合
O(mn)
的成员吗,假设
n>>2m

为了简单起见,忽略常数,让我们将假设记为不等式:

public static void main(String[] args) {

  Scanner sc = new Scanner(System.in);

  int n = sc.nextInt();
  int m = sc.nextInt();
  int result = 0;

  for (int i=0; i < n; i++) {
    for (int j=m; j > 0; j--)
      result += 1;
    m -= 1;

  }
  System.out.println(result);
}
根据这个假设,第一项消失了,所以我们只剩下
1/m<1
,随着
m
的增长,这显然是正确的。因此,假设是正确的,答案是肯定的

(m^2 - m)/2 + n < nm (eventually, as n, m grow)
(m - 1)/(2n) + 1/m < 1