确定多次调用一个函数的运行时间

时间:2019-05-01 22:06:35

标签: algorithm time-complexity

假设我有一个函数f(K),它以K的对数摊销时间运行,但线性最坏情况下的时间。什么时间运行?

    for i in range(N): f(N) (Choose the smallest correct estimate)
  • A。 N中的线性方程
  • B。 N中的摊销线性
  • C。 N二次方
  • D。从给出的信息中不可能说

比方说,f(N)仅打印“ Hello World”,因此它并不取决于参数的大小。我们可以说总运行时间以N为单位摊销吗?

1 个答案:

答案 0 :(得分:0)

这有点像一个测试问题,因此,我不仅要说答案,还要让我解释一下这些算法复杂性概念的含义。

让我们从声明function f(n) runs in constant time开始。我知道这个问题甚至都没有提到,但这确实是理解所有其他算法复杂性的基础。如果某个函数在恒定时间内运行,则意味着其运行时间不依赖于其输入参数。请注意,它可能像print Hello Worldreturn 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

对于问题的第二部分,您能否根据我们之前的观察推论出循环的总运行时间是多少?