二进制插入排序和复杂性

时间:2017-03-02 20:06:00

标签: algorithm sorting

我有一个关于在插入排序算法中使用二进制搜索的简单问题。更准确地说,在通常的插入排序的每一步,而不是将元素与先前(排序的)子阵列中的所有元素进行线性比较,我们只是在该排序的子阵列中使用二进制搜索来找到元素所属的位置。

我知道这减少了算法所做的比较次数(O(log n)而不是O(n)),但每个步骤所需的交换次数仍占主导地位且复杂性仍为O(n ^ 2)。

我也知道复杂性与运行时间并不那么容易相关。我试图将这两种算法的运行时间进行比较" small" n(数组大小)的值,最多约500000.二进制插入排序总是比通常的插入排序更快。

两者都是O(n ^ 2)的事实告诉我,当n变得足够大时,运行时间应该相似,对吗?什么"足够大"在这种情况下实际上会看到类似的运行时间?

3 个答案:

答案 0 :(得分:1)

  

两者都是O(n ^ 2)的事实告诉我,当n变得足够大时,运行时间应该相似,对吗?

小心 - 这不是真的。随着<!DOCTYPE HTML> <html> <body> <div style="background: grey; display: inline-block;"> <svg version="1.2" viewBox="0 0 600 400" width="600" height="400" xmlns="http://www.w3.org/2000/svg" > <text id="t1" text-anchor="middle" x="50%" y="50%" style="fill: white;">MfgfgfgghgY UGLY TEXT</text> </svg> <script> var width=350, height=80; var textNode = document.getElementById("t1"); for(var k=1;k<60;k++) { textNode.setAttribute("font-size",k) var bb=textNode.getBBox() if(bb.width>width||bb.height>height) break; } </script> </div> </body> </html>越来越大,n^22n^2永远不会越来越近;他们相距甚远。但两者都是n

然后,说你的算法都是O(n^2)是什么意思?嗯,这意味着最终每个人都可以被O(n^2)的某个常数倍限制在上面。对于二进制插入排序,它可能是n^2,而对于标准插入排序,它可能是10n^2。两者都是1000n^2,但效率可能会因n^2因素而异(在此示例中)。

复杂性告诉您关于特定函数的行为的更多信息,而不是关于该函数如何与其他函数堆叠的信息。例如,如果您知道自己的函数是100,那么对于O(n^2)的大值,n的增长时间不会超过f(n+1) {(1}}(为什么) ?因为n + 1的导数是n^2,是线性的,它告诉你连续项之间的差异是线性增长的。)

答案 1 :(得分:0)

理论上二进制插入排序复杂度为O(log_2(n!)), Wolframalpha

这是在O(n²)和O(n log(n))之间,实际上更靠近O(n log(n))。

答案 2 :(得分:0)

这是我的二元插入排序:时间复杂度是 (N^2)/4 + Nlog2(N/(2e))。确实,如果您执行交换,它会比数组重写成本高得多。在这种情况下,时间复杂度是 NK/4 + Nlog2(N/(2*e)) 介于 O(N^2) 和 O(NlogN)

之间
{{1}}