使用1 000 000英尺的阵列进行冒泡排序需要多长时间?

时间:2017-11-16 07:09:24

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

冒泡排序具有计算复杂度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小时 这是真的吗?

4 个答案:

答案 0 :(得分:0)

我认为你误解了BigO符号。

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

例如,看看快速排序的复杂性,使用波浪符号表示它是〜1.39NlogN,而使用BigO表示它是O(NlogN)。

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

BigO用于表示比较次数。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如今,台式机可以在5秒钟内完成十亿(10 9 )件小事。

对10 6 个随机整数进行气泡排序需要大约10 12 个小东西,或大约5000秒= 83分钟。

这两种方式的偏移量可能都是4左右。您必须用一种经过良好编译的语言来编写它,以获取时间,因为C ++中的“小事”在JavaScript等方面要大得多。

答案 3 :(得分:0)

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

使用Bubblesort(目前为第一个伪代码示例)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会利用它。 / p>

当然,第三个问题(在查看了big-O对代码和数组中无序的确切程度的忽略之后)与在其上执行代码的平台,以及在该平台上执行的计算机级指令的确切位置。例如,如果您的所有数据都适合计算机的缓存(从而避免了昂贵的重复访问主内存),则可以获得更高的效率-该水平在很大程度上与算法的实现无关。

如果您查看real-world benchmarks,它们会详细说明所有3个方面:使用的确切代码,确切的数据输入以及准确的编译器和机器体系结构。请注意,即使那样,也不容易预测运行时间将随着程序大小的增加而增加,因为由于数据不再适合较慢的内存,因此许多转换将以steps的形式进行比平稳的增长。

TLDR:唯一安全的估计是测量时间。而且只会回答您的实现,选择的输入和机器的问题。失败的话,您可以进行几次较小的运行,将抛物线拟合到数据中,然后将结果推断为1M大小:这不会太差,因为1M整数并不多。