Это проблема кода leet.Я не уверен, почему, но я получаю постоянную разницу в 20 мс между этими двумя немного разными версиями find-Kth-элемента, используя метод быстрого выбора.
Первый, на 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;
}
Второй, 84 мс.
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 ... Я не могу найти информацию о том, каккод скомпилирован и запущен.Вероятно, это виртуальная среда со специализированным компилятором.
Это может быть проблема с шаблоном в swap - когда я создаю свою собственную функцию swap и использую ее вместо std :: swap, нет никаких расхождений.
Я попробовал это на моем процессоре с g ++ и clang и не смог воспроизвести разницу между функциями при одинаковом вводе.Так что я не думаю, что этот вопрос имеет какое-либо значение в ответе.Это просто странная штука с Leetcode.