Algorithm 时间复杂度计算
我目前正在做一些考试题,但在这一点上被卡住了。我知道快速排序算法的时间复杂度为Algorithm 时间复杂度计算,algorithm,math,time-complexity,Algorithm,Math,Time Complexity,我目前正在做一些考试题,但在这一点上被卡住了。我知道快速排序算法的时间复杂度为O(nlog(n))。对于特定的输入大小,对列表进行排序的时间为4分钟。接下来的问题是,在同一个系统上,对一个两倍大小的列表进行排序需要多长时间 我已经排除了时间不是8minutes(输入大小的两倍=持续时间的两倍,非常非常错误的推理)的可能性 我做过一些工作: 在工作中 4=nlog(n) 4=log(n^n) 16=n^n 我基本上被困在这一点上了 工作B X=2nlog(2n)>>2n因为输入加倍 X=2n
O(nlog(n))
。对于特定的输入大小,对列表进行排序的时间为4分钟。接下来的问题是,在同一个系统上,对一个两倍大小的列表进行排序需要多长时间
我已经排除了时间不是8
minutes(输入大小的两倍=持续时间的两倍,非常非常错误的推理)的可能性
我做过一些工作:
在工作中
4=nlog(n)
4=log(n^n)
16=n^n
- 我基本上被困在这一点上了
因为输入加倍X=2nlog(2n)>>2n
X=2n(1+log(n))
wasX=2n+2nlog(n)>>nlog(n)
min4
X=2n+2(4)=2n+8
- 我再一次陷入了困境
- 如果不知道n的值,就无法计算绝对时间。
通过一些经验值来了解这一点。
假设“k”是一次操作所用的时间
If, n = 2, k.n.log(n) = 4 => k.2.1 = 4 => k = 2
if n is doubled, k.2n.log(2n) = 2.4.2 => 16 minutes
If, n = 4, k.n.log(n) = 4 => k.4.2 = 4 => k = 1/2
if n is doubled, k.2n.log(2n) = 1/2.8.3 => 12 minutes
If, n = 64, k.n.log(n) = 4 => k.64.6 = 4 => k = 1/96
if n is doubled, k.2n.log(2n) = 1/96.128.7 => 9.33 minutes
因此,随着n的增加,所用的时间接近时间的两倍(8分钟)提供的信息不完整 证明: 让算法复杂度为
O(nlogn)
。这表示所用的时间,t
=c*nlogn
因此,我们有以下方程式:
4=c*n*logn
,其中t=c*(n2)*log(n2)
是必需的答案t
n2=2*n2
n
,n2
,t
,c
)唯一方程的数量=3
因为我们至少需要4个方程来表示4个变量,所以提供的信息是不完整的 我想关于这个问题首先要注意的是,考虑到对数字进行排序需要4分钟,
n
一定很大。例如,我只是在电脑上用快速排序对10亿个数字进行排序,只花了不到3分钟的时间。所以n
大概是10亿左右(给定或取一个数量级)
考虑到n
是巨大的,对于某些常量c
,将此运行时间近似为c*n*lg(n)
可能是合理的,因为运行时扩展的低阶项不应该与如此大的n
太相关。如果我们将n
加倍,则与原始运行时相比,我们得到以下运行时乘数:
[Runtime(2n)] / [Runtime(n)]
[c * (2n) * lg(2n)] / [c * n * lg(n)]
2 * lg(2n) / lg(n)
2 * log_n(2n)
2 * (1 + log_n(2))
这里,lg()
是任意基数下的对数,log\u n()
是对数基数n
首先,由于我们假设n
很大,一种可能的方法是将log\u n(2)
近似为0,因此运行时乘数近似为2,总运行时间近似为8分钟
或者,由于我们可能知道n
在一个数量级内,另一种可能是近似于n
可能值的乘数:
- 如果
=1亿,那么我们将近似乘数为2.075,总运行时间为8.30分钟n
- 如果
=10亿,那么我们将近似乘数为2.067,总运行时间为8.27分钟n
- 如果
=100亿,那么我们将近似乘数为2.060,总运行时间为8.24分钟n
n
的近似值的巨大变化在总运行时的近似值上产生了非常小的变化
值得注意的是,虽然这在纸面上看起来不错,但实际上,架构方面的考虑可能会导致实际运行时与我们在这里计算的运行时大不相同。例如,如果该算法在将数据大小增加一倍后引发一系列分页,那么运行时间可能会比我们在这里估计的~8分钟要高得多。我喜欢@Amitoj的推理,但我会将其推广 设
n0
=导致运行时间为4分钟的元素数,n1
=2*n0
。那么我们有
c = 4 mins / (n0 * log n0)
我们正在努力寻找
t = c * n1 * log n1
= 4 mins / (n0 * log n0) * n1 * log n1
= 4 mins * (n1 / n0) * (log n1 / log n0)
n1/n0
始终等于2
当n0=>无穷大时,logn1/logn0
的限制变为1
是的,当n0变大时,t的极限是
4分钟*2=8分钟
除了Anmol Singh Jaggi
之外,所有答案都是错误的
首先,很容易看出,这些信息不足以得到答案。这就是为什么:
你所需要做的就是解一个方程。如果算法的时间复杂度为O(n logn),那么第一个等式为:
其中n
在列表的大小中。如果他们想让你找出完成两倍大的算法需要多少时间,他们基本上想找到x
:
所以基本上你需要解一个2个方程组,3个未知。它要么有0个答案(不是在我们的例子中),要么有无限多个答案
现在你必须假设你的c1。如果c1=1,则 将n代入第二个等式:
x=13.5
。13分半钟
但是再一次,这个答案是基于c1等于1的假设,如果你有另一个常数因子,你会得到另一个答案。这听起来像是一个非常糟糕的考题,可能是由一个对大O符号的真正含义没有深刻理解的人写的。它有很多错误——其中很多已经在其他答案中得到了解决 最大的问题就是这么大