【发布时间】: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