在试图解释生成字典序排列的递归算法时,我提供了这个简单的算法:
def permute(done, remaining):
if not remaining:
print done
return
sorted_rem = sorted(remaining)
l = len(sorted_rem)
for i in xrange(0, l):
c = sorted_rem[i]
# Move to c to done portion.
done.append(c)
remaining.remove(c)
# Permute the remaining
permute(done, remaining)
# Put c back.
remaining.append(c)
# Remove from done.
del done[-1]
def main():
permute([], [1,2,3,4])
if __name__ == "__main__":
main()
第一个问题:对于像这样的Python实现,我觉得它有点浪费,我想知道它的时间复杂度到底是多少?请注意,最优的时间复杂度将是O(n * n!),因为我们需要打印大小为n的n!个排列。
我猜测由于排序(我假设在Python中是O(n log n)),会添加一个额外的log n因子(我认为对于我们可以使用该程序的n来说,这在实际上是可以忽略不计的)。
第二个问题:假设我们可以在O(n)时间内实现排序,并且在O(1)时间内实现append,remove和del[-1],那么结果的时间复杂度将是多少?