想确保我得到的Big O符号是正确的

时间:2013-02-26 23:13:06

标签: java

我已编写此代码,但我必须找到大O符号。我想出了O(n2),但我不确定它是否正确。请有人帮忙。感谢

int n = array.length;

for(int i=0;i<array.length;i++){
  int c = 1;
  for(int j=i+1;j<array.length;j++)
    if (array[i]==array[j])
      c=c+1;
    if (c>(array.length/2)){
      return array[i];
    }
  }
  return 0;
}

2 个答案:

答案 0 :(得分:0)

如果我们假设数组中没有2个相等元素,它将等于最差情况冒泡排序,等于O(N2)。您可以在wikibooks

中看到示例排序

还可以找到有关冒泡排序成本的信息here

答案 1 :(得分:0)

你是对的,这是一个O(n ^ 2)操作,因为你做的操作数与输入数组中数据元素数的平方成正比。

如果匹配数超过数组长度的一半,你有一个“救助”条件的事实也不会改变操作的基数,它仍然是一个N平方的操作,因为这是限制行为功能。

您可以通过蒙特卡罗模拟验证这一点:

  1. 从N = 2开始,将其增加到N =比100
  2. 在内部循环中添加第二个计数器,让您知道内部代码块的次数
  3. 创建一个长度为N且仅具有二进制(1/0)值的随机数组
  4. 运行您的功能并跟踪您进入内循环的次数
  5. 对于N的每个选择,运行模拟说100次并对每个N
  6. 的选择取平均值
  7. 在对数对数刻度上绘制平均迭代计数与N的关系。
  8. 对数 - 对数图上斜率为2的最佳拟合线表示该操作为O(N ^ 2)。斜率为1意味着它是O(N)。斜率3表示O(N ^ 3)。