这是一个leetcode问题。我不知道为什么,但是使用quickselect方法在这两个稍有不同的find-Kth-element版本之间得到了20ms的一致差异。
第一个,时间为64毫秒。
int findKthLargest(vector<int>& nums, int k) {
int f = 0;
int l = nums.size()-1;
k--; // convert to index
int fi = f;
while(f <= l) {
int pivot = nums[l];
fi = f;
for(int li = f; li < l; li++) {
if(nums[li] > pivot) {
swap(nums[fi], nums[li]); // *** first version
fi++;
}
}
swap(nums[fi], nums[l]);
if(k < fi) { l = fi-1; }
else if(k > fi) { f = fi+1; }
else { return nums[fi]; }
}
return -1;
}
第二个,耗时84ms。
int findKthLargest(vector<int>& nums, int k) {
int f = 0;
int l = nums.size()-1;
k--; // convert to index
int fi = f;
while(f <= l) {
int pivot = nums[l];
fi = f;
for(int li = f; li < l; li++) {
if(nums[li] > pivot) {
swap(nums[fi++], nums[li]); // *** The only change, combining the two lines together
}
}
swap(nums[fi], nums[l]);
if(k < fi) { l = fi-1; }
else if(k > fi) { f = fi+1; }
else { return nums[fi]; }
}
return -1;
}
我知道这很小,但是无论一天几小时等等,多次运行后它都是一致的。我很好奇。是某些指令集依赖性还是编译器问题...?
更新
以上时间是Leetcode的结果...我找不到有关如何编译和运行代码的任何信息。可能是带有专用编译器的虚拟环境。
这可能是交换的模板问题-当我创建自己的交换函数并使用它代替std :: swap时,没有任何差异。
我使用g ++和clang在我的cpu上尝试了此操作,并且在给定完全相同的输入的情况下,无法重现函数之间的任何差异。因此,我认为这个问题没有任何价值。这只是一件奇怪的Leetcode东西。