【发布时间】:2022-01-22 16:42:40
【问题描述】:
我只想检查以下代码是否具有阶乘时间复杂度。 IE。 O(n!) 如果 n 是 my_str 中的字符数。据我了解,它有,但我可能错过了一些东西。
def perms(a_str):
stack = list(a_str)
results = [stack.pop()]
while stack:
current = stack.pop()
new_results = []
for partial in results:
for i in range(len(partial) + 1):
new_results.append(partial[:i] + current + partial[i:])
results = new_results
return results
my_str = "ABCDEFGHIJ"
print(perms(my_str))
【问题讨论】:
-
输出的大小为 O(n! * n),所以没有比这更快的算法了。否则,您认为您的算法可能比这慢吗?
-
@kaya3 假设它的成本与从一个排列到下一个排列的变化数量成正比,它does seem 每个排列的恒定成本(每个排列有 2.63 个变化)。
-
@inordirection 是的,我读过关于单交换置换器的文章,但我对 itertools 的实现特别好奇。是的,完全使用排列当然会贡献另一个因素 n。关于复制先前的结果元组:这就是我的第一条评论。我认为不是。如果它检测到它具有对元组的唯一引用,则将其更改到位。元组仅从 Python 代码的角度是不可变的。
-
@inordirection 是的,或者如果您不使用所有排列,例如,如果您随机采样所有排列的 1/n(并完全查看每个采样的排列)。循环在 Python 中没有自己的作用域。如果你不删除
p,那么它在下一次迭代和整个循环之后仍然存在。
标签: python time-complexity big-o factorial