我正在为学校做作业。本质上,我们正在分析排序算法及其在大量数字上的成本。我们有一个最好的情况(按顺序排列),最坏的情况(逆向排列)和平均情况(随机顺序)。但是,对于我几乎所有的排序算法,对最坏情况进行排序所花的时间都比平均情况少。阅读后,肯定似乎是分支预测导致了这种情况。它正在识别模式(降序),并比理论上(大O表示法)更快地执行代码。
我已经对分支预测进行了一些研究,虽然似乎有一些方法可以使它更快地进行优化,但是在完全禁用它方面我找不到任何东西。我可以使用G ++标志吗?还是终端命令?
这是我的气泡排序算法的一个示例:
void bubble(vector<long> &vector) {
for (int i = 0; i < vector.size() - 1; i++){
for (int j = 0; j < vector.size() - i - 1; j++) {
if (vector[j] > vector[j + 1]) {
long tmp = vector[j];
vector[j] = vector[j+1];
vector[j+1] = tmp;
}
}
}
}
我平均情况下的时机几乎是最坏情况的两倍。
答案 0 :(得分:2)
Big-O表示法与渐近行为有关。换句话说,它描述了随着问题规模的增大,哪些因素成为主导。
如预取和分支预测之类的CPU微优化可以在较小的尺寸下产生较大的相对影响。但是O(n ^ 2)过程相对于O(n)过程的本质是,一旦问题大小足够大,它就会变得更慢。
因此,不要理会猜测或担心分支预测的影响。只是使您的数组更大。尝试对一百万个元素进行排序。或十亿。我向您保证:如果您认为一种情况是最坏的情况是正确的,那么它会比最好的情况变慢。 (提示:您对此不对。)