为什么一种算法在相同的时间复杂度下比另一种算法更快?

Why is one algorithm faster than another with the same time complexity?

本文关键字:算法 时间复杂度 另一种 一种 为什么      更新时间:2023-10-16

我正在做一个codingame挑战:赛马双人赛。 目标是找到列表的两个元素之间的最小差异。

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

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

感谢您的帮助。

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

是的,你错了,这种复杂性不是O(n log n(,而是O(n^2(。

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

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

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