使用什么数学技术来比较算法的复杂性?

时间:2010-08-22 12:42:03

标签: algorithm math

我今天开始阅读“算法简介”,但我对其中一个练习感到困惑。

练习1.2.2询问读者

  

假设我们正在比较Merge sort和Insertion Sort的实现   机。对于大小为n的输入,插入排序以8n ^ 2步进行,   合并排序以64n log n步进行。

     

对于n的值,插入排序是否合并排序?

我首先尝试打开W​​olfram Alpha并使用它来绘制方程图,但我无法准确地比较这两个图。

然后我尝试为n(200)选择一个随机值,在纸上计算方程式,然后根据我的结果修改n的值。
但这花了太长时间。

解决此练习的正确方法是什么?

5 个答案:

答案 0 :(得分:7)

here:8 n 2 = 64 n log 2 n 的。把两件事放在一个等式中。

即,大致 n = 43是插入排序在这里的有用性限制。

通常你可以通过求解上面的等式 f n )= g n )来解决这个问题。解决 f n ) - g n )= 0,但是,这种情况下的分析结果是当你将多项式与对数函数混合时,你会很漂亮。我只是尝试一些值,看看结果从正面转为负面。一旦你有一个正面和一个负面点,你可以用二分法缩小它。

蛮力的方式是简单地尝试所有 n 到某一点。您已经知道O( n 2 )算法不适合大型数据集,因此 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
...

(请原谅可怕的代码;这只是一个非常快速的涂鸦。)

答案 1 :(得分:6)

在两者相等的情况下是否存在n的值?

在这一点之上会发生什么?下面?

答案 2 :(得分:1)

对于n·43,8n2·64n log n和插入排序节拍合并排序 虽然合并排序运行在£(n log n)最坏情况时间,插入排序运行在£(n2)最坏情况下 时间,插入排序中的常数因素使小n更快。因此,使用它是有道理的 当子问题变得足够小时,在合并排序中插入排序。考虑修改 合并排序,其中大小为k或更小的子阵列(对于某些k)不进一步划分,但已排序 显式使用插入排序。

答案 3 :(得分:1)

求解方程8n² < 64n lg n,我们得到等式2^(n/8) - n < 0

一旦我没有参加考试,只是做一些练习,我使用工具查看f(n) = 2^(n/8) - n的图表。

如此处所述,n没有自然数,其中插入排序与合并排序的时间相同,而对于f(n) < 0,我们得到了:

  

2&lt; = n&lt; = 43.

我希望能帮助别人:)

答案 4 :(得分:0)

由于这不是代数不等式,所以没有分析方法可以找到n的解决方案

(1)   8n² < 64n log_2 (n)

所以您需要近似一下。有很多数值方法可以做到这一点,因此我们将使用快速的Python脚本来实现。

首先,请注意,Python的math.log函数是以e为底的对数,因此首先需要将原始的以2为底的对数转换为以{{1}为底的对数}使用身份

e

Proof。)

在(1)中使用(2)并简化产量

(2)   log_2 (n) = log_e (n) / log_e (2)

最后,评估脚本(3)中的(3) n / log_e (n) <= 8 / log_e (2)

n

输出from math import log as ln n = 2 # Since f(n) = n/ln (n) is not defined for n < 2. while (n/ln (n) <= 8/ln (2)): n += 1 print (n) ,这意味着n = 44满足(1)的最小值。因此,44是满足(1)的条件,也就是说,要排序的数组最多具有n <= 43个元素时,插入排序优先于合并排序。