简体   繁体   English

为什么排序不及时采用O(n log(n))

[英]Why is sorting not taking O(n log (n)) in time

In the following snippet the time consumption of std::sort . 在下面的代码片段中, std::sort的时间消耗。 This should take O(nlog(n)) time. 这应该花费O(nlog(n))时间。 std::chrono is used solely measuring std::sort . std::chrono仅用于测量std::sort

I compiled the following code with the Intel compiler 18.0.3 with optimization level -O3 . 我用英特尔编译器18.0.3编译了以下代码,优化级别为-O3 I use Redhat6. 我使用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;
}

The output of this program is 这个程序的输出是

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.

在此输入图像描述

This seems to be very close to linear behaviour. 这似乎非常接近线性行为。

Why is std::sort requiring O(n) rather than O(nlog(n)) ? 为什么std::sort需要O(n)而不是O(nlog(n))

The graph you present is a good fit for y = x log (x) . 您提供的图表非常适合y = x log (x) Compared to x , log(x) has a small effect. x相比, log(x)的影响很小。 I conject your results would pass a chi square for x log (x) with good significance. 我推测你的结果将通过x log (x)的卡方具有重要意义。

There are no surprises here. 这里没有惊喜。

This is a touchstone for your appreciation that O(n log n) isn't much worse than O(n). 这是一个试金石,供您欣赏,O(n log n)并不比O(n)差。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM