如果我有n个随机int,则运行它需要x次 现在,我有6n随机int,需要多长时间?我使用插入排序。
最后一个问题,如果我选择不同的排序(相同大小的n),我该如何计算呢?
答案 0 :(得分:0)
没有办法知道完全,但有一些经验法则可以让你获得非常粗略的运行时间近似值。
插入排序是一种O(n 2 )算法。在现实世界中,这意味着,在所有其他条件相同的情况下,将n的大小增加一些数字x将使运行时间增加大约n 2 。因此,如果您将n的大小加倍,则运行时间将增加大约4倍。如果将n乘以6,则运行时间将增加约36倍。
不幸的是,你不能总是把其他事情保持平等。你必须考虑缓存未命中,虚拟内存,计算机上运行的其他东西的影响等。渐近分析并不是计算实际运行时间的工具,但它可以作为一个非常粗略的近似:a"球场评估,"如果你愿意的话。
其他排序算法具有不同的复杂度。例如,合并排序具有O(n log n)的计算复杂度,这意味着运行时间随着项目数的对数而增加。这比n ^ 2增加得慢得多。例如,对1,024项(2 ^ 10)进行排序需要(2 ^ 10 * 10)比较的顺序。排序2 ^ 20项将需要(2 ^ 20 * 20)比较的顺序。
我无法强调这些计算是非常粗略的近似。他们会让你进入该区域 - 可能在一个数量级内 - 但你永远不会得到一个确切的数字。
所做的任何确定性的事情都表明,如果插入排序需要x次,那么合并排序将需要y时间。渐近分析忽略了常数因子。因此,您甚至无法根据插入排序的运行时间来估算合并排序的运行时间。就此而言,你也不能根据插入排序的运行时间来近似冒泡排序(另一个O(n ^ 2)算法)。
使用渐近分析来估计算法的实际运行时间的整个想法充满了错误。它通常在估计特定硬件上一种算法的一种实现的运行时间时起作用,但除此之外它无用。
你问:
对于n = 2 ^ 20,M秒用于合并排序,B秒用于冒泡排序,如果我有一个不同的大小需要4B进行冒泡排序,我怎么知道合并排序的运行时间?
正如我上面所指出的,您无法根据冒泡排序的时间来估算合并排序的时间。您可以做的事情是根据大小为n = 2 ^ 20的合并排序的运行时间来估算新大小的合并排序的运行时间。
例如,在n = 2 ^ 20时,合并排序需要(2 ^ 20 * 20)比较的顺序。在n = 2 ^ 21时,它需要(2 ^ 21 * 21)比较的顺序。在n = 2 ^ 32,(2 ^ 32 * 32)比较。
然后你可以做的是,对你的新n进行预期的比较次数,计算预期的比较次数,并将其除以(2 ^ 20 * 20)。因此,例如,当n = 2 ^ 22时,预期的比较次数约为92,274,688。除以20,971,520(2 ^ 20 * 20),得到4.4。因此,如果使用合并排序对2 ^ 20项进行排序需要时间x,那么排序2 ^ 22项将采用大约 4.4 * x。
再次,让我指出这些是非常粗略的近似,假设其他一切保持不变。