拿下技术面上传简历

一个动态数组从容量 1 开始,每次写满就扩容为原来的 2 倍,并把旧元素全部拷贝到新数组。现在连续 append 100 万次(元素总数为 100 万)。请回答:(1) 整个过程总的元素拷贝次数是多少?(2) 单次 append 的最坏代价和均摊代价分别是多少?(3) 如果产品要求「任意单次操作的 P99 延迟抖动不能超过某个阈值」,这个 2 倍扩容策略有什么问题,你会怎么改?

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

面试官在考什么

能否区分「均摊代价」与「最坏单次代价」,并把它翻译成长尾延迟这个工程约束,而不是停在 O(1) 的口径上。

均摊分析

回答框架 · 前两步

  1. 总拷贝次数为 1+2+4+…+2^19 ≈ 2^20,约等于最终元素个数 N(100 万),均摊到每次 append 约 1 次拷贝,加上写入本身共约 2 次基本操作,所以均摊 O(1)。
  2. 单次最坏发生在最后一次扩容,需要拷贝约 50 万到 100 万个元素,是 O(N),会直接表现为一次明显的延迟毛刺。

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

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

延伸阅读

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

同一能力域的其他题