热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词旨在对用户提供的Python代码进行系统、专业的算法复杂度分析。它将自动识别代码中的循环、递归、数据结构操作等关键结构,通过逐步推理计算出精确的时间复杂度(大O表示法),并生成结构化的分析报告。报告不仅包含复杂度计算过程与总结,还会针对性能瓶颈提供具体的优化建议,适用于代码评审、性能调优和算法学习等场景。
{ "代码段": [ { "名称": "函数定义与初始化", "代码": "def find_pairs_with_sum(nums, target):\n pairs = []\n n = len(nums)" }, { "名称": "双层循环枚举数对与截断", "代码": " for i in range(n):\n for j in range(i + 1, n):\n if nums[i] + nums[j] == target:\n pairs.append((nums[i], nums[j]))\n if len(pairs) > 1000:\n break" }, { "名称": "去重并保持发现顺序", "代码": " unique = []\n seen = set()\n for a, b in pairs:\n key = (a, b) if a <= b else (b, a)\n if key not in seen:\n seen.add(key)\n unique.append((a, b))\n return unique" }, { "名称": "示例调用", "代码": "if name == "main":\n data = [3, 1, 2, 2, 4, -1, 5, 0]\n print(find_pairs_with_sum(data, 4))" } ], "操作说明": [ { "名称": "函数定义与初始化", "说明": [ "pairs 初始化为临时结果容器(包含所有匹配到的数对,可能含重复或顺序互换的重复)。", "n = len(nums) 记录列表长度,避免在循环中重复计算。" ] }, { "名称": "双层循环枚举数对与截断", "说明": [ "外层 i 从 0 到 n-1,内层 j 从 i+1 到 n-1,枚举所有无序数对 (i, j)。", "若 nums[i] + nums[j] == target 则将该数对加入 pairs。", "截断条件 len(pairs) > 1000 触发时仅 break 内层循环,外层循环继续。这不是‘全局’截断:之后每个新的 i 仍会再次进入内层循环并可能追加新结果。" ] }, { "名称": "去重并保持发现顺序", "说明": [ "遍历 pairs,通过 key = (min(a,b), max(a,b)) 将顺序不同的相同数对视为同一键去重(平均 O(1) set 查询/插入)。", "若未出现过该键,则加入 seen 并把原始顺序的 (a, b) 追加至 unique,从而保持“发现顺序”。", "返回去重后的 unique。" ] } ], "复杂度分析": { "符号约定": { "n": "输入列表 nums 的长度", "m": "pairs 的长度(枚举阶段收集到的数对数量)" }, "逐段分析": [ { "名称": "函数定义与初始化", "时间复杂度": "O(1)", "空间复杂度": "O(1)", "细节": [ "pairs = [] 常数时间与空间。", "n = len(nums) 对于内置 list 为 O(1)。" ] }, { "名称": "双层循环枚举数对与截断", "迭代次数": "总对数为 sum_{i=0}^{n-1} (n-1-i) = n(n-1)/2", "时间复杂度(最坏)": "O(n^2)", "时间细节": [ "内层主体操作为常数:两次索引、一次加法、一次比较;匹配时一次 append;一次 len(pairs) 比较。", "截断仅终止当前 i 的内层循环,不能从根本上减少最坏情况下的迭代(例如没有任何匹配时,依旧完整枚举所有对)。" ], "空间复杂度": "O(m)", "空间细节": [ "pairs 收集匹配的数对,m 为收集数目。", "由于截断策略,m 的上界不是 O(n^2)。上界近似为 m ≤ 1001 + (n - i0 - 1),其中 i0 是首次使 len(pairs) 超过 1000 的外层索引。因此 m = O(n)。" ], "关于截断的额外说明": [ "在达到 1001 条后,每个后续的 i 最多再追加 1 条匹配(如果很快匹配到),随后 break 内层。若无匹配,仍可能遍历完整内层循环。", "因此截断对最坏时间复杂度无影响,但对 m 的增长形成 O(n) 上界。" ] }, { "名称": "去重并保持发现顺序", "输入规模": "m(pairs 的长度),且 m = O(n)", "时间复杂度(平均)": "O(m) = O(n)", "时间细节": [ "遍历 m 个元素;每步构造 key 为 O(1);set 查询/插入平均 O(1)。", "总计 O(m)。" ], "空间复杂度": "O(m) = O(n)", "空间细节": [ "seen 存储已见键,unique 存储去重后的结果,均与 m 同阶。" ], "备注(哈希最坏情况)": "若发生严重哈希冲突,set 操作最坏可退化至 O(m),但平均情况下 Python set 为摊还 O(1)。" } ] }, "总体复杂度": { "时间复杂度(最坏)": "O(n^2)", "时间复杂度(均摊/常见)": "受匹配分布与截断影响介于 O(n^2) 与低于平方级之间,但大O最坏界仍为 O(n^2)", "空间复杂度": "O(n)", "总结说明": [ "平方时间由双层枚举主导;", "空间主要由 pairs、seen、unique 决定,因截断使 m = O(n),总体空间 O(n)。" ] }, "优化建议": [ { "方向": "循环结构优化", "问题定位": "O(n^2) 的双层枚举是主要瓶颈,且当前截断逻辑无法降低最坏复杂度。", "建议": "改用一次遍历 + 哈希表的 two-sum 思路,在遍历 nums 时用一个集合记录已见元素,用另一个集合记录规范化后的唯一数对键(min(x, y), max(x, y)),并用列表按首次发现顺序保存结果。", "复杂度影响": "时间从 O(n^2) 降至 O(n)(平均),空间 O(n)。", "要点": [ "遍历每个 x:若 target - x 在 seen_nums 中,则构造 key=(min(x, y), max(x, y))。", "若 key 未见过则加入 pairs_set 并把 (x, y) 追加到结果列表,保留发现顺序。", "最后返回结果列表。" ], "伪代码": "seen_nums = set(); pairs_set = set(); result = []\nfor x in nums:\n y = target - x\n if y in seen_nums:\n key = (x, y) if x <= y else (y, x)\n if key not in pairs_set:\n pairs_set.add(key)\n result.append((x, y))\n seen_nums.add(x)\nreturn result" }, { "方向": "数据结构选择", "问题定位": "当前先收集 pairs 再去重,导致额外一次 O(m) 遍历与双份存储。", "建议": "在枚举阶段即进行去重:维护 seen_keys 集合与 unique 列表,检测到匹配立刻用 key 去重并有条件追加到 unique,避免构造冗余的 pairs 列表。", "复杂度影响": [ "在保持双层枚举不变的情况下,时间仍为 O(n^2),但常数因子降低;", "空间从同时维护 pairs + unique + seen 降为 unique + seen,峰值减少约一倍。" ], "实施要点": [ "匹配时立刻构造 key 并判断是否加入 unique;", "无需在末尾再遍历 pairs。" ] }, { "方向": "内置函数与库的使用", "问题定位": "如果业务上允许保持 O(n^2) 但希望更快的 Python 层循环,可借助 C 实现的迭代器减少 Python 解释器开销。", "建议": [ "使用 itertools.combinations(nums, 2) 枚举数对,可减少 Python 层索引与边界判断开销;", "配合前述“枚举即去重”的方案;", "如确需全局截断上限,应在外层循环层面进行控制(例如计数达到阈值时中断外层循环),而非仅 break 内层。" ], "复杂度影响": "渐进复杂度不变(O(n^2)),但常数因子下降;全局截断能显式限制结果规模并缩短运行时间(在匹配密集时)。" }, { "方向": "截断逻辑修正", "问题定位": "len(pairs) > 1000 时仅跳出内层循环,无法形成全局上限,且可导致结果规模随外层 i 增长。", "建议": [ "引入标志位或使用异常/函数返回提前终止双层循环,确保达到上限即停止所有后续枚举;", "或在内层循环开始前判断是否已达阈值,若已达则 break 外层。" ], "复杂度影响": "不改变最坏界,但在匹配密集的情况下显著减少无谓迭代与结果规模。" } ] }
代码段
def subsets(nums):
"""
递归生成所有子集(幂集)。
复杂度由递归分支数主导:每个元素有“选/不选”两种决策,最终产生 2^n 个子集。
返回列表包含所有子集(列表)。
"""
res = []
path = []
n = len(nums)
def dfs(i):
if i == n:
res.append(list(path))
return
# 不选 nums[i]
dfs(i + 1)
# 选择 nums[i]
path.append(nums[i])
dfs(i + 1)
path.pop()
dfs(0)
return res
# 示例
if __name__ == "__main__":
print(subsets([1, 2, 3]))
操作说明
复杂度分析 设 n = len(nums)。
总体复杂度
优化建议
递归优化
内置函数与库的使用(降低 Python 层循环与方法调用开销)
结果收集策略(在不改变算法本质的前提下降低峰值内存)
其他微优化(常数级收益)
结论:该问题的输出规模为 2^n,任何返回所有子集的实现,其时间与(含输出)空间复杂度的紧确下界均为 Θ(n · 2^n)。现有实现已达到渐近最优;可通过迭代/itertools 或生成器在不改变渐近复杂度的前提下降低常数与峰值内存。
代码段
g = [[] for _ in range(n)]
for u, v, w in edges:
g[u].append((v, w))
g[v].append((u, w)) # 若为有向图,移除此行
INF = 10 ** 18
dist = [INF] * n
dist[src] = 0
pq = [(0, src)]
while pq:
d, u = heapq.heappop(pq)
if d != dist[u]:
continue
for v, w in g[u]:
nd = d + w
if nd < dist[v]:
dist[v] = nd
heapq.heappush(pq, (nd, v))
n = 5
edges = [(0,1,2),(1,2,3),(0,3,1),(3,4,4),(4,2,1)]
print(dijkstra(n, edges, 0))
操作说明
复杂度分析
总体复杂度
优化建议
帮助用户快速分析Python代码的时间复杂度,提升开发效率,并为代码性能优化提供科学的依据。
在开发过程中使用此提示词了解代码性能,并快速定位可能的优化方向,减少性能问题带来的影响。
在学习算法和数据结构过程中,通过分析Python代码的时间复杂度,深刻理解算法特性与差异。
用于快速练习与验证算法时间复杂度的分析,提高面试中算法性能讲解的清晰度和准确性。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期