c++ - 为什么在相同时间复杂度下,一种算法比另一种算法快?

标签 c++ algorithm time-complexity

我当时正在应对编码挑战:双人赛。
目的是找到列表中两个元素之间的最小差异。

我从第一个算法开始,我认为它是O(nlog(n)),但是对于大型数组,执行超时。

int array[N];
int min = numeric_limits<int>::max();

for (int i = 0; i < N; i++) {
  int value;
  cin >> value;
  cin.ignore();
  array[i] = value;

  for (int j = i - 1; j >= 0; --j) {
    int diff = abs(array[j] - value);
    if (diff < min) {
      min = diff;
    }
  }
}

然后,我尝试了另一种也是O(nlog(n))的算法,这一次执行及时完成了。

int array[N];
int min = numeric_limits<int>::max();

for (int i = 0; i < N; i++) {
  int value;
  cin >> value;
  cin.ignore();
  array[i] = value;
}

sort(array, array + N);

for (int i = 1; i < N; ++i) {
  int diff = abs(array[i - 1] - array[i]);
  if (diff < min) {
    min = diff;
  }
}

我对第一个代码的复杂性有误吗?我没有注意到有什么区别吗?

谢谢你的帮助。

最佳答案

Am I wrong with the first code complexity?



是的,您错了,这种复杂度不是O(n log n),而是O(n ^ 2)。

外循环平均运行n(N)次,而内循环平均运行n / 2次。因此,复杂度为O(n * n / 2),即O(n ^ 2),因为乘法常数在复杂度计算中无关紧要。

Is there any difference that I did not notice?



就在这里。即使您有两种算法具有相同的复杂度(例如O(n log n)),由于隐藏常数(在渐近复杂度行为中会被忽略),它们都可以在非常不同的时间内运行。

关于c++ - 为什么在相同时间复杂度下,一种算法比另一种算法快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62193821/

相关文章:

c++ - 在自定义库中使用正则表达式时出错

algorithm - 使用 php 和 mysql 加密和解密数据的最佳方法

algorithm - 我如何才能有效地找到保持在预算范围内并最大化效用的事件子集?

c++ - 带 If 的嵌套 For 循环的时间复杂度

algorithm - 奇怪排序的递归关系

c++ - 使用非常量值初始化的对 const 类成员的引用

c++ - 在 C++ 上使用谷歌 Protocol Buffer 进行广播

java - 执行 while 循环 : one time execution inside the loop

algorithm - 这个 while 循环的复杂性是什么?

重写新运算符时,C++ 类构造函数被调用两次 - 为什么