Небольшая разница во времени выполнения в зависимости от небольшой модификации - PullRequest
0 голосов
/ 03 июля 2019

Это проблема кода 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...