【问题标题】:Permutations Runtime Analysis: Iterative DP Solution排列运行时分析:迭代 DP 解决方案
【发布时间】:2017-01-15 21:57:41
【问题描述】:

我的迭代DP方案如下:

def permutations(string):
    # let n = len(string)
    N = [[] for _ in range(len(string) + 1)] # O(n)

    N[0].append("")

    for i in range(1, len(string) + 1): # O(n)
        N[i] = [perm[:j] + string[i - 1] + perm[j:] for j in range(i) for perm in N[i - 1]] # O(???)

    return N[-1]

但是,我无法分析上述程序的运行时间。具体来说,限制for perm in N[i - 1] 行的运行时间。我知道递归解决方案是O(n!),但是不知道递归运行时,我们如何才能找到上述程序的运行时呢?

【问题讨论】:

    标签: python runtime dynamic-programming


    【解决方案1】:

    让我们考虑

    N[i] = [perm[:j] + string[i - 1] + perm[j:] for j in range(i) for perm in N[i - 1]]
    

    作为我们的主要兴趣。

    我们可以改写成

    line 1: for i in range(1, len(string) + 1):                      # O(n)
    line 2:     N[i] = []                                            # O(n)
    line 3:     for j in range(i):                                   # O(sum i from 1 to n)
    line 4:         for perm in N[i - 1]:                            # O(sum len(Ni) from 1 to n)
    line 5:             N[i].append(perm[:j] + string[i - 1] + perm[j:])
    

    现在,i = 1line 3line 4 将运行一次,留下 N[1] 的单个元素 string[0]

    对于i = 2line 3 将运行两次,line 4 将在第一次运行时运行一次,在第二次运行 2 次,留下 N[2] 三个元素。

    看到模式了吗?让我们快进。 6、24、120、720。

    N   total runs  diff
    1   1           1
    2   3           2 
    3   9           6
    4   33          24
    5   153         120
    ...
    

    所以我们得到总复杂度

      n
     ____
     \ 
      >   k!
     /___
    k = 0       (asciiart courtesy of sympy)
    

    简化它非常复杂(https://math.stackexchange.com/questions/227551/),但我们可以确保它在O(n!) 边界内,因为k*k! 从 1 到 n 的总和是 (n+1)! - 1,所以我们得到的总运行时间为O(n!)不依赖已知的递归运行时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2016-03-19
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多