见here:8n2 = 64n log2n我>。只需将这两件事放在一个等式中即可。
即,大致 n = 43 是插入排序在这里有用的极限。
通常你可以通过解上面的方程 f(n) = g(n) 来解决这个问题求解 f(n) - g(n) = 0,但是这种情况下的解析结果是'不漂亮,因为您将多项式与对数函数混合在一起。我只是尝试一些值,看看结果从正面变为负面的位置。一旦你有了一个正点和一个负点,你就可以使用二分法来缩小范围。
蛮力的方法是简单地尝试所有 n 直到某一点。您已经知道 O(n2) 算法不适合大型数据集,因此 n 必须非常小。对于我的测试,它看起来像这样:
PS Home:\> function lb($n){[math]::Log($n)/[math]::Log(2)} # binary logarithm
PS Home:\> 1..80 | %{,($_,(8*$_*$_),(64*$_*(lb $_)))} | %{"{0}: delta={3}, I={1}, M={2}" -f $_[0],$_[1],$_[2],($_[2]-$_[1])}
...
38: delta=1210,9597126948, I=11552, M=12762,9597126948
39: delta=1024,36393828017, I=12168, M=13192,3639382802
40: delta=824,135922911648, I=12800, M=13624,1359229116
41: delta=610,216460117852, I=13448, M=14058,2164601179
42: delta=382,549232429308, I=14112, M=14494,5492324293
43: delta=141,080604940173, I=14792, M=14933,0806049402
44: delta=−114,240561917371, I=15488, M=15373,7594380826
45: delta=−383,463082570537, I=16200, M=15816,5369174295
46: delta=−666,633601368154, I=16928, M=16261,3663986318
47: delta=−963,796734153668, I=17672, M=16708,2032658463
48: delta=−1274,99519778461, I=18432, M=17157,0048022154
...
(请原谅糟糕的代码;这只是一个非常快速的涂鸦。)