c++ - 为什么排序不及时 O(n log (n))

标签 c++ sorting time performance-testing

在下面的代码片段中,std::sort 的时间消耗。这应该采取 O(nlog(n))时间。 std::chrono 仅用于测量 std::sort

我使用优化级别 -O3 的英特尔编译器 18.0.3 编译了以下代码。我用的是Redhat6。

#include <vector>
#include <random>
#include <limits>
#include <iostream>
#include <chrono>
#include <algorithm>

int main() {
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist(std::numeric_limits<int>::min(),
                                                                  std::numeric_limits<int>::max());

    int ret = 0;

    const unsigned int max = std::numeric_limits<unsigned int>::max();
    for (auto j = 1u; j < max; j *= 10) {
        std::vector<int> vec;

        vec.reserve(j);

        for (int i = 0; i < j; ++i) {
            vec.push_back(dist(rng));
        }

        auto t_start = std::chrono::system_clock::now();
        std::sort(vec.begin(), vec.end());
        const auto t_end = std::chrono::system_clock::now();
        const auto duration = std::chrono::duration_cast<std::chrono::duration<double>>(t_end - t_start).count();
        std::cout << "Time measurement: j= " << j << " took " << duration << " seconds.\n";
        ret + vec[0];
    }
    return ret;
}

这个程序的输出是

Time measurement: j= 1 took 1.236e-06 seconds.
Time measurement: j= 10 took 5.583e-06 seconds.
Time measurement: j= 100 took 1.0145e-05 seconds.
Time measurement: j= 1000 took 0.000110649 seconds.
Time measurement: j= 10000 took 0.00142651 seconds.
Time measurement: j= 100000 took 0.00834339 seconds.
Time measurement: j= 1000000 took 0.098939 seconds.
Time measurement: j= 10000000 took 0.938253 seconds.
Time measurement: j= 100000000 took 10.2398 seconds.
Time measurement: j= 1000000000 took 114.214 seconds.
Time measurement: j= 1410065408 took 163.824 seconds.

enter image description here

这似乎非常接近线性行为。

为什么 std::sort 需要 O(n) 而不是 O(nlog(n))

最佳答案

您提供的图表非常适合y = x log (x)。与x相比,log(x)的作用较小。我猜想您的结果会通过具有良好意义的 x log (x) 的卡方。

这里没有惊喜。

这是检验 O(n log n) 并不比 O(n) 差多少的试金石。

关于c++ - 为什么排序不及时 O(n log (n)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56952527/

相关文章:

Python 对排序列表重新排序,使最高值位于中间

time - 在 Elixir 中使用日期时间

c++ - 在准确的时间运行代码,la crond/atd

c++ - 如果从同一个信号调用两个槽,Qt 可以同时调用它们吗?

c++ - 错误 : cannot convert in arguement passing

c++ - 什么样的数据类型将在 C++ 中保存 3000000^2?

C++ EOF 命名空间

c++ - 在 O(min(log(n),log(m)) 复杂度中找到两个不同大小的排序数组的中位数

java - 想要根据属性值对 ArrayList 进行排序

python - 我怎样才能让 Flask 等待?