You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字符串排列代码时间复杂度分析:O(n!)还是O(n*n!)?

排列生成代码的时间复杂度分析与Big O疑问解答

首先看你给出的排列生成代码:

def permutation(str): #str = string input
    if len(str) == 0:
        return [""]
    result = []
    for i, char in enumerate(str):
        for p in permutation(str[:i] + str[i + 1 :]):
            result.append(char + p)
    return result

时间复杂度:O(n*n!)而非O(n!)

这段代码的时间复杂度是O(n*n!),原因如下:

  • 对于长度为n的字符串,递归会分解出n个长度为n-1的子问题,每个子问题会生成(n-1)!个排列。
  • 每次递归返回后,需要将当前字符与每个子排列拼接(char + p),这个拼接操作的时间是O(n)(拼接后的字符串长度为n)。
  • 从递推逻辑展开:设T(n)为处理长度n字符串的时间,可得递推公式T(n) = n * (T(n-1) + (n-1)! ),最终推导结果为T(n) = O(nn!)——总共有n!个最终排列,每个排列的生成过程累计需要O(n)的字符拼接操作,总操作数为nn!量级。

Big O notation可以是常规形式的组合

Big O符号并不局限于单一的对数、线性、二次、指数、阶乘这类形式,完全可以是这些形式的组合,比如O(n log n)、O(n² + n log n)、你提到的O(n*n!)都是合法的表示。
Big O的核心是描述输入规模n趋向无穷大时,算法运行时间的渐近增长速率,只要表达式能准确反映这个速率,不管是单一形式还是组合形式都可以使用。

内容的提问来源于stack exchange,提问作者Alvalen Shafel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:45:20