拿下技术面上传简历

你在做代码迁移,需要把一个递归实现的树形权限校验函数改成迭代版本,因为线上出现了 StackOverflowError。原函数大概是这样:check(node) { if (node == null) return true; for (child : node.children) if (!check(child)) return false; return node.hasPermission; } 这棵树在生产环境最深有 50 万层(由于历史数据异常),平均分支因子 1.2。团队有人提出:把它改成显式栈的迭代版本,时间复杂度不变,空间复杂度从 O(depth) 递归栈变成 O(depth) 显式栈,所以没省内存。作为负责人,你怎么分析这个递归的复杂度和实际内存?为什么显式栈可能仍然解决问题?如果改成迭代后仍然 OOM,你怎么办?

数据结构与算法复杂度分析5 年以上知识点 1 个

面试官在考什么

考察能否把递归复杂度分析落到调用栈限制、堆内存和实际数据异常上,并给出从代码到数据治理的决策。

递归复杂度

回答框架 · 前两步

  1. 递归时间复杂度 O(n)(n 为节点数),空间复杂度 O(d)(d 为树深);原题 d=50 万,远超 JVM 默认线程栈大小(通常 512KB-1MB),每帧几百字节,必然 StackOverflowError。
  2. 显式栈迭代版时间复杂度仍 O(n),空间复杂度仍 O(d),但栈在堆上,容量远大于调用栈,且可控制每帧存储内容,因此可能避免溢出。

还有 3 条答案要点、 3 层追问、 4 个常见坑, 以及针对你简历的追问路径,在定制报告里。

上传简历,生成我的题库先看示例报告

延伸阅读

想看这个方向的整体准备路线? 进入「数据结构与算法」方向页

同一能力域的其他题