冒泡排序具有计算复杂度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小时 这是真的吗?
答案 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整数并不多。。