【问题标题】:How long will take Bubble sort with array of 1 000 000 ints?使用 1 000 000 个整数的数组进行冒泡排序需要多长时间?
【发布时间】:2018-04-29 15:13:24
【问题描述】:

冒泡排序的计算复杂度为 O(n^2)。那么如果我们有例如 CPU 3.5 GHz,这些计算是真的吗? 1 000 000 * 1 000 000 =10^12 3.5 GHz 每个麦克风约 6 000 000 个(我想是的,如果这不是真的,请纠正我)

(10^12/6 * 10^6)/60=~2777 小时 这是真的吗?

【问题讨论】:

  • 它可能是也可能不是。这一切都取决于您从哪里获得 600 万,输入数据如何,Mike 是谁等。
  • 它还取决于所使用的编程语言、整体系统负载、短、长或长整数等。
  • 我用的是c++,4字节int,数据来自rand(),只是想知道处理器会完成多少计算。我在另一个主题中找到了这个值。
  • 尝试做 5,000,然后 10,000,然后 20,000,并注意时间模式。
  • 您可以合理使用的唯一方法是基准测试、基准测试、基准测试。现代 CPU 过于复杂,无法根据时钟频率进行估算

标签: algorithm sorting math time-complexity bubble-sort


【解决方案1】:

Big-O 表示法在回答“随着问题规模的增加,解决它所需的时间/内存如何增长?”这个问题时很好。它故意忽略所有“小”细节,并认为使用比另一个算法 B 多 10 倍(或 100000 倍 - 任何恒定比率)时间的算法 A 是等效的。当然,在现实生活中,10 倍的性能确实很重要。所以第一个问题是 O(n^2) 忽略所有常数因素(但现实世界时间不会)。

使用冒泡排序的(当前第一个伪代码示例)wikipedia version

procedure bubbleSort(A : list of sortable items)
    n := length(A)
    repeat
        swapped := false
        for i := 1 to n - 1 inclusive do
            if A[i - 1] > A[i] then
                swap(A[i - 1], A[i])
                swapped = true
            end if
        end for
        n := n - 1
    until not swapped
end procedure

您可以看到,如果所有元素都进行了初始排序,则会有 0 次交换。任何实现此伪代码的现代计算机都能够在不到 1 秒的时间内“排序”一个已排序的 1M 整数数组。所以第二个问题是冒泡排序(包括上面的大多数实现)如果数组几乎是有序的会快得多。碰巧的是,在现实生活中,数组比随机抽样所期望的要有序一些 - 这导致现实世界的排序算法 looking for shortcuts 可以利用这一点。

当然,第三个问题(在查看 big-O 忽略的代码以及数组中确切的无序程度之后)与 详细的特征有关您执行代码的平台,以及您在该平台上执行的确切机器级指令。例如,如果您的所有数据都适合机器的缓存(从而避免代价高昂地重复访问主内存),则可以进一步提高效率——在很大程度上独立于算法的实现。

如果您查看real-world benchmarks,他们会详细说明所有 3 个方面:使用的准确代码、准确的数据输入以及准确的编译器和机器架构。请注意,即使这样,也很难预测运行时间将如何随着程序大小的增加而增加,因为许多转换将以steps 的形式出现,因为数据不再适合较慢的内存,而不是平滑增加。

TLDR:唯一安全的估计是测量时间。它只会回答您的实施、选择的输入和机器的问题。如果做不到这一点,您可以进行几次较小的运行,将抛物线拟合到您的数据,并将结果外推到 1M 的大小:它不会离题很远,因为 1M 整数并没有那么多

【讨论】:

    【解决方案2】:

    如今,一台台式电脑可以在大约 5 秒内完成十亿 (109) 件小事。

    对 106 个随机整数的冒泡排序需要大约 1012 个小东西,或者大约 5000 秒 = 83 分钟。

    无论哪种方式,这可能会相差 4 倍左右。您必须用编译良好的语言编写它才能获得时间,因为 C++ 中的“小东西”在 JavaScript 等中要大得多。

    【讨论】:

      【解决方案3】:

      它没有。在普通计算机上使用 c++ 大约需要一个小时。尝试使用不同的输入值进行基准测试,请记住,当整数数量增加一倍时,计算时间应该增加四倍。

      【讨论】:

      • 很好!,你能提供你所说的参考或提供你所建议的例子吗?
      【解决方案4】:

      我认为您误解了 BigO 表示法。

      在理论信息学中,我们使用 BigO 来表示上限和下限,因此这并不意味着您只需插入值并找到一些时间。如果您不知道 BigO 表示法 O(10N) = O(N)。

      例如看一下快速排序的复杂性,波浪号表示法约为 1.39NlogN,BigO 表示法为 O(NlogN)。

      BigO 或波浪号表示法与毫秒无关。然而,知道时间的唯一方法是使用比率测试。

      BigO 用于表示比较次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2021-11-25
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多