Python 子集生成算法的时间复杂度

Python 子集生成算法的时间复杂度,python,algorithm,time-complexity,complexity-theory,Python,Algorithm,Time Complexity,Complexity Theory,以下代码的算法复杂度为O(2^n) def发电机组(L): res=[] 如果len(L)==0: 返回[]] 较小=生成子集(L[:-1])#查找没有最后一个元素的所有子集 extra=L[-1:]#创建最后一个元素的列表 新=[] 对于较小尺寸的小型: 新增。追加(小+额外)#对于所有较小的解决方案,添加一个带有最后一个元素的解决方案 返回较小的+新的#将包含最后一个元素的元素和不包含最后一个元素的元素组合在一起 #给出解释:对于大小为n的列表,有2^n个案例-->O(2^n) 我不明白长

以下代码的算法复杂度为O(2^n)

def发电机组(L):
res=[]
如果len(L)==0:
返回[]]
较小=生成子集(L[:-1])#查找没有最后一个元素的所有子集
extra=L[-1:]#创建最后一个元素的列表
新=[]
对于较小尺寸的小型:
新增。追加(小+额外)#对于所有较小的解决方案,添加一个带有最后一个元素的解决方案
返回较小的+新的#将包含最后一个元素的元素和不包含最后一个元素的元素组合在一起
#给出解释:对于大小为n的列表,有2^n个案例-->O(2^n)
我不明白长度为n的列表怎么会有2^n个案例

这是我的理解:

  • 长度为n的列表将进行n个递归调用(每个调用传入一个列表,但没有最后一个元素-->完成,直到空列表[])。这就是O(n)复杂性
  • 然后,开始向递归调用的方向前进
  • 向上移动时,已解决的子问题的数量(“较小”列表)会增加,因此每个递归调用中完成的循环量也会增加
  • “较小”列表大小(从最深的递归调用开始):0、1、2、4、8、16
  • 操作总数0+1+2+4+…2^n(因为存在n个递归)
  • O(2^n)
这个解释有意义吗?(哈哈,我写这篇文章的时候回答了我的问题,但是一些外部知识会很有帮助的XD)

我不明白长度为n的列表怎么会有2^n个案例

  • 好的,在这种情况下,为了检查每个可能的子集,我们要么在迭代中取当前元素,要么在迭代中不取当前元素

  • 这为每个元素带来了2个案例->接受或不接受

    对于下面的树,我将把
    take
    表示为
    T
    ,而
    nottake
    表示为
    DT

让我们考虑这个数组= >代码> [1,3.5] < /代码>。 递归树如下所示-

                               Start state
                               /          \
                              /            \
                             /              \
                          T-1                DT-1
                         /   \               /   \
                        /     \             /     \
                       /       \           /       \
                      /         \         /         \
                     T-3      DT-3      T-3         DT-3
                    / \        /  \      / \         /  \
                   /   \      /    \    /   \       /    \
                  T-5  DT-5 T-5  DT-5  T-5  DT-5   T-5   DT-5
  • 从上面的树中可以看到,有23叶定义了23个子集可能性。您可以为大于大小3的输入创建这样的递归树,以理解为什么在这种情况下复杂性是指数(2n

  • 您可以通过从根遍历到每个叶来检测此树中的任何子集

    例如-
    [Start state,T-1,DT-3,T-5]
    表示子集
    [1,5]

                               Start state
                               /          \
                              /            \
                             /              \
                          T-1                DT-1
                         /   \               /   \
                        /     \             /     \
                       /       \           /       \
                      /         \         /         \
                     T-3      DT-3      T-3         DT-3
                    / \        /  \      / \         /  \
                   /   \      /    \    /   \       /    \
                  T-5  DT-5 T-5  DT-5  T-5  DT-5   T-5   DT-5