
本文解析在已知网格尺寸恒为6×6的前提下,嵌套循环遍历与dfs调用的整体时间复杂度判定逻辑,明确指出:当输入规模被严格限定为常量时,算法时间复杂度为o(1),而非惯性误判的o(n²)。
本文解析在已知网格尺寸恒为6×6的前提下,嵌套循环遍历与dfs调用的整体时间复杂度判定逻辑,明确指出:当输入规模被严格限定为常量时,算法时间复杂度为o(1),而非惯性误判的o(n²)。
在算法分析中,“时间复杂度”描述的是算法执行时间随输入规模增长的变化趋势,其本质是渐进分析(asymptotic analysis),关注的是当问题规模 $ n \to \infty $ 时主导运行时间的项。因此,判断复杂度的第一步永远是:明确定义输入规模 $ n $ 是什么,以及它是否可变。
回到本题代码:
-
grid被显式声明为new char[6][6]; -
rows和cols均硬编码为6; - 输入来源虽为用户,但输入维度完全固定、无任何参数化变量(如未通过
Scanner.nextInt()读取动态的n或m); - 整个双重循环执行次数恒为 $ 6 \times 6 = 36 $ 次,为绝对常量。
此时,若强行设 $ n = \text{rows} = \text{cols} $,则 $ n = 6 $ 是一个具体数值,而非变量;代入 $ O(n^2) $ 将失去渐进意义——因为 $ O(36) $ 等价于 $ O(1) $。同理,即使内部调用 dfs(i, j),只要其最坏时间复杂度有上界(例如在6×6网格中,DFS最多访问36个格子,即 $ O(1) $),那么整个外层循环的总开销仍是 $ 36 \times O(1) = O(1) $。
✅ 正确结论:
该程序的时间复杂度为 $ O(1) $ —— 因为所有循环层数、递归深度、数据结构大小均被编译期/设计期固定,不随任何可变输入增长。
⚠️ 常见误区辨析:
- ❌ “有两层for循环 → 一定是 $ O(n^2) $”:错误。复杂度取决于循环变量的变化范围是否依赖输入规模。此处
i 和 <code>j 是常量边界,不是 <code>i 。 - ❌ “6×6太小,所以忽略不计”:错误。不是“太小而忽略”,而是根本不存在随 $ n $ 变化的量,故数学上严格属于常数阶。
- ✅ 对比场景:若代码改为
int n = scanner.nextInt(); char[][] grid = new char[n][n];,则复杂度才真正变为 $ O(n^2 \cdot \text{DFS_cost}) $,此时需进一步分析DFS(如在无剪枝的全网格搜索中为 $ O(n^2) $,整体达 $ O(n^4) $)。
? 实践建议:
在笔试、机试或工程代码注释中,应清晰标注约束条件。例如:
// NOTE: This implementation assumes FIXED 6x6 grid. // Time complexity: O(1); Space complexity: O(1).
这不仅体现复杂度分析的严谨性,也避免后续维护者误将常量逻辑泛化为可扩展接口而引入性能隐患。
综上,时间复杂度不是代码“看起来像什么”,而是“在什么条件下运行多久”。抓住输入定义与规模可变性这两个锚点,才能精准定阶。

















