【问题标题】:Why is one algorithm faster than another with the same time complexity?为什么一种算法比具有相同时间复杂度的另一种算法更快?
【发布时间】:2020-06-04 11:45:26
【问题描述】:

我正在处理一项编码游戏挑战:赛马双重挑战。 目标是找到列表的两个元素之间的最小差异。

我从第一个算法开始,我认为是在 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;
  }
}

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

感谢您的帮助。

【问题讨论】:

  • 阅读更多关于 time complexity 的信息:两种算法都可能是 O(n log n) 并且第一种算法可能比第二种算法快 10 倍大小输入
  • 第一种算法的复杂度不是O(n log n)而是O(n^2)
  • 时间复杂度与速度无关。顾名思义,它是关于复杂性
  • 时间复杂度是一个相当广泛的性能衡量标准。当两种算法具有相同的时间复杂度时,并不意味着它们同样快,仅意味着它们的执行时间规模非常相似
  • 即使复杂度相同,考虑是否克隆一个算法并在克隆内部放置一个sleep(1)。它仍然具有相同的复杂性,但与原始版本相比会非常慢。

标签: c++ algorithm time-complexity


【解决方案1】:

我对第一个代码复杂性有误吗?

是的,你错了,这个复杂度不是O(n log n),而是O(n^2)

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

有什么我没有注意到的区别吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多