LINUX.ORG.RU

История изменений

Исправление former_anonymous, (текущая версия) :

Задача https://leetcode.com/problems/longest-consecutive-sequence

Локальный код:

#include <vector>
#include <unordered_set>

using namespace std;

int longestConsecutive(const vector<int>& nums) {
    unordered_set<int> set;

    for (auto n : nums) {
        set.insert(n);
    }

    int longest = 0;

    // Итерация по nums медленнее чем по 'set' !!!
    for (auto n : nums) {
        // Start of a chain
        if (set.find(n - 1) == set.end()) {
            int length = 0;
            while (set.find(n + length) != set.end()) {
                length++;
            }
            longest = max(longest, length);
        }
    }

    return longest;
}

Тест:

nums содержит 50’000 элементов https://pastebin.com/diqtqMP4

Время отработки с nums в for - порядка 5000 мс на моём ПК.

Время отработки с set в for - порядка 10 мс на моём ПК.

Код main на Qt:


int main(int argc, char *argv[])
{
    const vector<int> nums = ...

    qint64 v = QDateTime::currentMSecsSinceEpoch();

    int longest = longestConsecutive(nums);

    qDebug() << nums.size() << longest << QDateTime::currentMSecsSinceEpoch() - v;

    return 0;
}

Исправление former_anonymous, :

Задача https://leetcode.com/problems/longest-consecutive-sequence

Локальный код:

#include <vector>
#include <unordered_set>

using namespace std;

int longestConsecutive(const vector<int>& nums) {
    unordered_set<int> set;

    for (auto n : nums) {
        set.insert(n);
    }

    int longest = 0;

    for (auto n : nums) {
        // Start of a chain
        if (set.find(n - 1) == set.end()) {
            int length = 0;
            while (set.find(n + length) != set.end()) {
                length++;
            }
            longest = max(longest, length);
        }
    }

    return longest;
}

Тест:

nums содержит 50’000 элементов https://pastebin.com/diqtqMP4

Время отработки с nums в for - порядка 5000 мс на моём ПК.

Время отработки с set в for - порядка 10 мс на моём ПК.

Код main на Qt:


int main(int argc, char *argv[])
{
    const vector<int> nums = ...

    qint64 v = QDateTime::currentMSecsSinceEpoch();

    int longest = longestConsecutive(nums);

    qDebug() << nums.size() << longest << QDateTime::currentMSecsSinceEpoch() - v;

    return 0;
}

Исходная версия former_anonymous, :

Задача https://leetcode.com/problems/longest-consecutive-sequence

Локальный код:

#include <vector>
#include <unordered_set>

using namespace std;

int longestConsecutive(const vector<int>& nums) {
    unordered_set<int> set;

    for (auto n : nums) {
        set.insert(n);
    }

    int longest = 0;

    for (auto n : nums) {
        // Start of a chain
        if (set.find(n - 1) == set.end()) {
            int length = 0;
            while (set.find(n + length) != set.end()) {
                length++;
            }
            longest = max(longest, length);
        }
    }

    return longest;
}

Тест:

nums содержит 50’000 элементов https://pastebin.com/diqtqMP4

Время отработки с nums в for - порядка 5000 мс на моём ПК.

Время отработки с set в for - порядка 10 мс на моём ПК.

Код на Qt:


int main(int argc, char *argv[])
{
    const vector<int> nums = ...

    qint64 v = QDateTime::currentMSecsSinceEpoch();

    int longest = longestConsecutive(nums);

    qDebug() << nums.size() << longest << QDateTime::currentMSecsSinceEpoch() - v;

    return 0;
}