【问题标题】:Time spent to sort 10^7 records with insertion sort使用插入排序对 10^7 条记录进行排序所花费的时间
【发布时间】:2023-03-17 13:18:02
【问题描述】:

我对即将到来的测试的修订感到困惑。

问题说:

插入排序的实现花费 1 秒对 10^6 条记录的列表进行排序。对 10^7 条记录进行排序需要多少秒?

通过使用

T(X)/T(1) = 10^7/10^6 

我以为答案是 10 秒,但实际答案是 100 秒。

有人可以帮帮我吗?

【问题讨论】:

  • 如果你的计算是正确的,插入排序将是最好的排序算法:)

标签: algorithm time-complexity insertion-sort


【解决方案1】:

如果插入排序是在线性(即O(n))时间内运行的操作,您的答案将是正确的。但事实并非如此。

插入排序的平均情况复杂度为O(n^2)(即它是二次的)。粗略地说,这意味着对 2 倍多的记录进行排序平均需要 4 倍的时间; 9倍长排序3倍多; 16倍长排序4倍多;等等。

该问题询问您对 10 倍的记录进行排序需要多长时间; 10 的平方乘以 1 秒是多少?

【讨论】:

    【解决方案2】:

    查看insertion sort 的性能,它被定义为 О(n^2) - 这意味着当 n 增加 10 倍时,所花费的时间将增加 n^2 倍( 100)

    【讨论】:

      【解决方案3】:

      我们知道插入排序是一个 O(n^2) 算法,假设 T(n) 是它的时间复杂度。 所以 T(n)=cn^2 对于一些常数 c>0 给定 T(10^6)=1。所以 c(10^6)(10^6)=1。我们得到 c 的值为 10^-12。将 c 的这个值插入 T(10^7)=c(10^7)(10^7) 暗示 T(10^7)=(10^-12)(10^14 )=100.

      【讨论】:

        【解决方案4】:

        假设插入排序需要 1 秒来对包含 100 万个数字的特定列表进行排序。

        平均而言,插入排序大约进行 n(n-1)/4 次比较和内存交换。对于 n = 1e6,则为 2.5e11,即使实现的每个循环都可以在 1 个周期内执行(这显然是不合理的),CPU 也必须以 250GHz 运行,这比任何真正的 CPU 都要快。

        所以一定是原来的输入列表大部分已经排好序了,不能对第二个列表的运行时间下结论。

        【讨论】:

        • 我认为这不符合问题的精神。但是你是对的,数字似乎不合理。也就是说,也许这是一个改进的diamond-based CPU
        猜你喜欢
        • 2017-05-01
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多