假设我有一个函数f(K),它以K的对数摊销时间运行,但线性最坏情况下的时间。什么时间运行?
for i in range(N): f(N) (Choose the smallest correct estimate)
比方说,f(N)仅打印“ Hello World”,因此它并不取决于参数的大小。我们可以说总运行时间以N为单位摊销吗?
答案 0 :(得分:0)
这有点像一个测试问题,因此,我不仅要说答案,还要让我解释一下这些算法复杂性概念的含义。
让我们从声明function f(n) runs in constant time
开始。我知道这个问题甚至都没有提到,但这确实是理解所有其他算法复杂性的基础。如果某个函数在恒定时间内运行,则意味着其运行时间不依赖于其输入参数。请注意,它可能像print Hello World
或return n
一样简单,也可能像查找前1,000,000,000个质数一样复杂(显然需要一段时间,但每次调用都花费相同的时间)。然而,最后一个例子更多地是滥用了数学符号。通常,恒定时间函数会很快。
现在,如果函数f(n)
在摊销后的固定时间内运行意味着什么?这意味着,如果您一次调用该函数,则无法保证完成速度。但是如果您将其调用n
次,则所花费的时间总计为O(n)
(因此,每次调用平均花费了O(1)
)。 Here是另一个StackOverflow答案的冗长解释。我想不出以摊销的固定时间(但不是固定时间)运行的任何极其简单的函数,但这是一个不平凡的示例:
called = 0
next_heavy = 1
def f(n):
called += 1
if called == next_heavy:
for i in range(n):
print i
next_heavy *= 2
在第512次通话中,此功能将打印512个号码;但是,在此之前,它只打印了511张,因此打印总数为2*n-1
,即O(n)
。 (为什么511?因为从1到2^k
的2的幂的和等于2^(k+1)
。)
请注意,每个恒定时间函数也是摊销的恒定时间函数,因为进行O(n)
调用需要花费n
时间。因此,未摊销的复杂性比摊销的复杂性要严格一些。
现在您的问题提到了一个具有对数摊销时间的函数,与上面的类似,这意味着在n
调用此函数后,总运行时间为O(nlogn)
(而每次调用的平均运行时间为{{ 1}})。然后,每个问题都会在从1到O(logn)
的循环中调用此函数,而我们只是说,根据定义,这些N
调用一起将在N
中运行。这是linearithmic。
对于问题的第二部分,您能否根据我们之前的观察推论出循环的总运行时间是多少?