三层for循环代码的时间复杂度是O(n^3)还是O(n^2)?
关于这段Java代码时间复杂度的判定
分两种场景明确结论:
按你贴出的原始代码直接计算
你给出的代码里所有循环的迭代上限都是固定常量6,和输入规模n没有任何绑定关系:
firstMethod的外层i循环固定跑6次- 内层j循环每次外层迭代固定跑6次,累计调用
secondMethod()的次数是6*6=36次 - 每次调用
secondMethod()时,方法内部的循环固定跑6次打印操作
整段代码总执行次数是固定的216次,不会随任何输入规模变化,这种场景下时间复杂度为O(1),既不是O(n²)也不是O(n³)。
时间复杂度的核心是衡量算法执行开销随输入规模增长的变化趋势,只要执行次数是和输入规模无关的固定常量,不管绝对次数是多少,都归为常量级复杂度。
如果代码里的固定值6是输入规模n的笔误(即所有循环边界随输入规模n动态变化)
这也是你纠结O(n²)还是O(n³)的默认前提,此时复杂度是O(n³),判定逻辑很简单:
- 很多人容易在这里踩坑:别看到第三层循环被抽成了单独的
secondMethod就觉得少了一层嵌套,方法封装只是代码组织形式,不会改变循环的实际嵌套执行关系 - 三层循环是完全嵌套结构:外层i循环迭代n次,每次i迭代下j循环迭代n次,每次j迭代下
secondMethod内部的循环再迭代n次,总操作次数和n³正相关 - 你可以直接用现有代码的固定值验证:当循环上限取6时,总打印次数是666=216次,和n³的计算结果完全匹配,远大于n²对应的36次,显然不符合O(n²)的特征。
内容的提问来源于stack exchange,提问作者Matin Parsapour
相关产品推荐
相关产品推荐

