当前位置: 首页 > 知识库问答 >
问题:

用O(n^2)写解有时比用O(n)写好吗?[副本]

陶烨赫
2023-03-14
public void solutionLinear(Problem problem) {
  for (int i = 0; i < problem.getSize(); i++) {
     // do something with problem and compute solution
  }
}
public void solutionQuadric(Problem problem) {
  for (int i = 0; i < problem.getSize(); i++) {
    for (int j = 0; j < problem.getSize(); j++) {
      // do something with problem and compute solution
    }
  }
}

共有1个答案

鲜于玮
2023-03-14

大O复杂度测量省略了常系数,因此“O(N)复杂度”和“O(N^2)复杂度”分别大致对应于“在a*N+b秒内运行”和“在c*N^2+d*N+e秒内运行”。如果A&B较大,C&D&E较小,后者可能更好。

考虑代码示例:

public void solutionLinear(Problem problem) {
  for (int i = 0; i < problem.getSize(); i++) {
     do_stuff_taking_one_hour();
  }
}

public void solutionQuadric(Problem problem) {
  for (int i = 0; i < problem.getSize(); i++) {
    for (int j = 0; j < problem.getSize(); j++) {
      do_stuff_taking_one_second();
    }
  }
}

尽管是O(n^2),但只要problem.getsize()小于60,后一种算法就会运行得更快。

 类似资料:
  • 我正在解决以下问题: null 输入:Array arr是一个非空的唯一整数列表,范围在1到1,000,000,000之间,大小N在1到1,000,000之间 输出:一个数组,其中每个索引i包含一个整数,表示ARR[i]的最大相邻子数组数 示例:arr=[3,4,1,6,2]输出=[1,3,1,5,1] 计算从1到N的每个i的g[i]是一种很有希望的方法,但我们仍然需要考虑如何尽可能有效地这样做。

  • 问题内容: 我编写了两种方法的代码,以找出LeetCode字符串中的第一个唯一字符。 问题陈述: 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果不存在,则返回-1。 示例测试用例: s =“ leetcode”返回0。 s =“ loveleetcode”,返回2。 方法1(O(n))(如果我错了,请纠正我): 方法2(O(n ^ 2)): 在方法2中,我认为复杂度应为O(n ^ 2

  • 由于排序算法有许多不同的选择,在任何示例中使用更高复杂度的算法是否合适? 我能想到的唯一原因是,如果有一个非常短的数组,或者数组非常接近排序,或者只包含几个不同的数字。

  • 我在GeekforGeekshttps://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/中检查“到达终点的最小跳跃次数”问题。我对这里提到的时间复杂度感到困惑,它是O(n^n)。 如果我看到上面的代码块,minJumps(arr,I,h)递归调用是从I=l1调用的。所以在每个递归步骤中,l(

  • 我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的