为什么一种算法在相同的时间复杂度下比另一种算法更快?
Why is one algorithm faster than another with the same time complexity?
我正在做一个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(,由于隐藏常量,它们都可以在非常不同的时间内运行,这些常量在渐近复杂性行为中被忽略。
相关文章:
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 如何降低 c++ 中算法的时间复杂度?
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 三和算法的时间复杂度是多少
- 关于算法的时间复杂度
- 迭代算法的时间复杂度
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 这个算法的时间复杂度是多少
- 俄罗斯农民乘法算法的时间复杂度.
- 具有随机分量的算法的时间复杂度(吉莱斯皮算法)
- 编写算法以查找数组中最常出现的元素.给出算法的时间复杂度
- C++中strstr()函数的时间复杂度、空间复杂度和算法是什么
- 这种算法解决数独的时间复杂度是多少?
- 查找所有唯一二叉搜索树的算法的时间复杂度是多少?
- 二叉树之字形水平阶遍历的这种算法的时间复杂度是多少?
- 回文分区的这种算法的时间复杂度是多少?
- 这个算法获取所有单词梯的时间复杂度是多少?
- 此算法查找所有路径总和的时间复杂度是多少?
- 算法时间复杂度类型解释