排列算法的Big-O分析

时间:2019-02-03 01:11:16

标签: python-3.x algorithm big-o

result = False
def permute(a,l,r,b):
    global result
    if l==r:
        if a==b:
            result = True
    else:
        for i in range(l, r+1):
            a[l], a[i] = a[i], a[l]
            permute(a, l+1, r, b)
            a[l], a[i] = a[i], a[l]

string1 = list("abc")
string2 = list("ggg")
permute(string1, 0, len(string1)-1, string2)

因此,基本上我认为找到每个排列需要n ^ 2步(有时是一个常数),而找到所有排列应花费n!脚步。那么这是否使其成为O(n ^ 2 * n!)?如果是这样的话!接管,使其变为O(n!)?

谢谢

edit:仅查找排列,此算法似乎很奇怪,这是因为我还使用它来测试两个字符串之间的字谜。我只是还没有重命名方法,对不起

1 个答案:

答案 0 :(得分:8)

查找每个排列不需要O(N^2)。创建每个排列的时间为O(N),因为要构建每个排列,您需要为每个索引分配一个新元素,并且此分配每个排列发生n次。

这为您提供N!的排列时间O(N),每个排列的总时间复杂度为O(N!) * O(N) = O(N * N!)

您的最终时间复杂度不会降低到O(N!),因为O(N * N!)仍然比O(N!)大一个数量级,并且仅删除常数项({{ 1}})。