我目前正在做一些考试问题,并且此时陷入困境。我得知Quicksort算法的时间复杂度为O(nlog(n))
。对于特定输入大小,对列表进行排序的时间为4分钟。问题继续询问在同一系统上对两倍大小的列表进行排序需要多长时间。
我已经排除时间不是8
分钟(输入大小的两倍=持续时间的两倍,非常非常错误的推理)。
我做过一些工作:
工作A
4 = nlog(n)
4 = log(n^n)
16 = n^n
工作B
X = 2nlog(2n) >> 2n
因为输入加倍X = 2n(1 + log(n))
X = 2n + 2nlog(n) >> nlog(n)
4
分钟X = 2n + 2(4) = 2n + 8
答案 0 :(得分:6)
我认为关于这个问题首先要注意的是,鉴于对数字进行排序需要4分钟,n
必须非常大。例如,我只是使用quicksort在我的计算机上排序十亿个数字,它花了不到3分钟。因此n
可能大约为10亿(给予或采取一个数量级)。
鉴于n
很大,因此对于某个常量c*n*lg(n)
,将此运行时近似为c
可能是合理的,因为运行时扩展的低阶项不应该是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_n()
是任意基数下的对数,n
是日志基数n
。
首先,由于我们假设log_n(2)
很大,一种可能的方法是将n
近似为0,因此运行时乘数将近似为2,总运行时间将近似为8分钟。
或者,由于我们可能知道n
在一个数量级内,另一种可能性是近似乘数可能值为n
:
n
= 1亿,那么我们将乘数近似为2.075,总运行时间为8.30分钟。n
= 10亿,那么我们将乘数近似为2.067,总运行时间为8.27分钟。n
= 100亿,那么我们将乘数近似为2.060,总运行时间为8.24分钟。请注意,OnEditorActionListener
近似值的巨大变化会使总运行时间的近似值发生微小的变化。
值得注意的是,虽然这在纸面上看起来不错,但在实践中,体系结构考虑可能会导致实际运行时间与我们在此处计算的运行时间大不相同。例如,如果算法在将数据大小加倍后引发一堆分页,则运行时间可能远远高于我们在此处近似的约8分钟。
答案 1 :(得分:5)
在不知道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分钟)
答案 2 :(得分:5)
提供的信息不完整。
证明:
让算法复杂度为O(nlogn)
。这意味着所花费的时间t
= c*nlogn
。
因此,我们有以下等式:
4 = c*n*logn
t = c*(n2)*log(n2)
,其中t
是必填答案n2 = 2*n2
变量数= 4(n
,n2
,t
,c
)
唯一方程的数量= 3
由于我们需要4个变量的至少4个方程,所提供的信息是不完整的。
答案 3 :(得分:2)
这听起来像是一个绝对可怕的考试问题,可能是由一个对Big-O符号实际上没有深刻理解的人写的。这有很多问题 - 其中很多问题已在其他答案中得到解决。
最大的问题是Big-O表示法并没有给你任何与实时直接关系。它会抛出大量的信息来回答被问到的实际问题。
此处的其他答案指出,该问题并未向您提供原始输入组中有多少项目的任何指示,只是第二组中有两倍的项目,并且该信息对于给出答案。但是他们没有提到一些事情......
首先,Big-O忽略了算法开销。可能的情况是,所使用的算法实际上需要3.5分钟来设置,无论它接收多少输入,并且对于原始输入组,实际处理时间仅为大约30秒。这将严重影响任意数量输入所用时间的计算。
但是就像遗漏那样糟糕,Big-O更进一步。
从Wikipedia查看此引文:
在典型用法中,O表示法的正式定义不直接使用;相反,函数f的O表示法由以下简化规则导出:
- 如果f(x)是几个术语的总和,则保留增长率最大的术语,并忽略所有其他术语。
- 如果f(x)是多个因子的乘积,则省略任何常数(产品中不依赖于x的项)。
这意味着时间计算可以包括最终被丢弃的多个术语。如果算法需要c * (n + n * log(n))
时间来完成,没有开销,该怎么办?在Big-O表示法中,它仍然是O(nlogn)
。
考试问题真正可能的唯一答案是“大约4分钟的时间。”没有更多的信息,我们不能知道更多的东西。具体做法是:
答案 4 :(得分:1)
我喜欢@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。
as n0 =>无穷大,log n1 / log n0
的限制为1。
所以是的,随着n0变大,t的限制为4 mins * 2 = 8 mins
。
答案 5 :(得分:1)
除了Anmol Singh Jaggi
之外的所有答案都是错误的。
首先,很容易看出这些信息不足以得到答案。这就是原因:
您需要做的就是解决一个等式。如果算法的时间复杂度为O(n logn),那么您得到的第一个等式是:
列表大小为n
。如果他们希望您找到完成算法大小两倍的算法所需的时间,他们基本上想找到x
:
所以基本上你需要解决一个2个方程的系统,其中3个未知。这有0个答案(不是我们的情况)或无限量的答案。
现在你必须假设你的c1。如果c1 = 1,那么
将n代入第二个等式:x = 13.5
。所以13分半钟。
但是还有一次,我们假设c1等于1,这个答案,如果你有另一个常数因子,你会得到另一个答案。