使用1000 000 int数组进行Bubble排序需要多长时间



气泡排序具有计算复杂度O(n^2)。所以,如果我们有例如CPU 3.5 GHz,这些计算是真的吗?1000 000*1000 000=10^123.5 GHz使每个麦克风约6000 000(我认为是的,如果这不是真的,请纠正我)

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

我想您误解了BigO表示法。

在理论信息学中,我们使用BigO来表示上界和下界,所以这并不意味着你只插入值并找到一些时间。如果你不知道BigO符号O(10N)=O(N)。

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

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

BigO用于表示比较次数。

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

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

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

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

Big-O表示法在回答问题时很好"随着问题的规模越来越大,解决问题所需的时间/内存是如何增长的&";。它故意忽略所有";"小";详细信息,并认为使用比另一个算法B多10倍(或100000倍-任何常数比)的时间的算法A是等效的。当然,在现实生活中,10倍的性能确实很重要。因此,第一个问题是O(n^2)忽略了所有常数(但现实世界中的时间没有)。

使用Bubblesort:的维基百科版本(目前是第一个伪代码示例)

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个整数的已排序数组。因此,第二个问题是,如果数组几乎是有序的,则(包括上面的大多数实现)冒泡排序的速度要快得多。碰巧,在现实生活中,数组的顺序比随机采样的顺序略高,这导致现实世界的排序算法寻找利用这一点的快捷方式。

当然,第三个问题(在查看了big-O忽略的代码和数组中的确切无序程度之后)与执行代码的平台的详细特征以及在该平台上执行的机器级指令有关。例如,如果你的所有数据都能放入机器的缓存中(从而避免了对主存的昂贵重复访问),那么可以在很大程度上提高效率——这与算法的实现无关。

如果你看看真实世界的基准测试,它们会详细说明所有3个方面:使用的确切代码、输入的确切数据和编译器;机器架构。请注意,即使在那时,也不容易预测运行时间将如何随着程序大小的增加而增加,因为由于数据不再适合较慢的内存,而不是平滑增加,许多转换将以步骤的形式出现。

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

最新更新