理解这个python函数的复杂性

时间:2017-08-22 23:03:51

标签: python big-o

函数f(L)的复杂性是什么("大O"符号),其中n是L的长度?我可以理解内部函数的运行时间是不变的。因此 O (n)?

此功能取自课程中的过去测试" CS Python简介"。

>>> import random
>>> l = [1,2,3]
>>> comprandom = random.choice(l)
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> comprandom
1
>>> random.choice(l)
3
>>> comprandom
1
>>> 

2 个答案:

答案 0 :(得分:2)

首先,请注意基本情况,基本上是

if i == 0:
    return len(L)

其中 L 是前一个实例的[L, L]。 如果 L 最初是列表,元组,字符串,...那么[L, L]将是长度为2的列表,因此len(L) O (1)。

接下来,您是否有任何可以作为 L 传递的对象,[L, L]除了对输入参数的一对引用之外还有什么?如果没有,那么每个实例只是一对 O (1)的调用。

要观察此操作,请在输入函数时添加一个简单的跟踪语句:

print("ENTER", i, L)

并观察每个函数调用的内容。

这足以让你得到答案吗?

答案 1 :(得分:2)

快速方法是检测功能并运行它:

def f(L):
    print("Call f({})".format(repr(L)))
    def f_helper(L,i):
        print("{}call f_helper({}, {})".format("  "*(4 - i), repr(L), repr(i)))
        if i:
            res = f_helper([L, L], i-1) + f_helper([L, L], i-1)
            print("{}return {}".format("  "*(4 - i), res))
            return res
        else:
            res = len(L)
            print("{}return {}".format("  "*(4 - i), res))
            return res
    return f_helper(L,3)

然后

>>> f("LLL")

Call f('LLL')
  call f_helper('LLL', 3)
    call f_helper(['LLL', 'LLL'], 2)
      call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
      return 4
      call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
      return 4
    return 8
    call f_helper(['LLL', 'LLL'], 2)
      call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
      return 4
      call f_helper([['LLL', 'LLL'], ['LLL', 'LLL']], 1)
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
        call f_helper([[['LLL', 'LLL'], ['LLL', 'LLL']], [['LLL', 'LLL'], ['LLL', 'LLL']]], 0)
        return 2
      return 4
    return 8
  return 16

......应该立即明白L的原始内容对所发出的电话数量没有影响。