数据结构总结

1. 树状数组(Fenwick Tree)

  • 时间:query \(\mathcal O(\log n)\),update \(\mathcal O(\log n)\)
  • 空间:\(\mathcal O(n)\)
  • 特点:仅支持前缀可减操作(和、异或),常数极小,代码简短。
  • 扩展:支持区间加 + 区间和(双BIT)、二维树状数组 \(\mathcal O(\log^2 n)\)。

2. 并查集(DSU)

  • 时间:find \(\mathcal O(\alpha(n))\)(路径压缩+按秩合并),union \(\mathcal O(\alpha(n))\)
  • 空间:\(\mathcal O(n)\)
  • 特点:维护连通性、传递关系(种类并查集)、离线动态连通性(按时间分治)。
  • 注意:不带撤销版本为均摊复杂度,带撤销时变为 \(\mathcal O(\log n)\)。

3. 平衡树(Treap / Splay / FHQ-Treap)

目前只学了 FHQ Treap

  • 时间:insert / delete / rank / kth / pre / suf 均为 \(\mathcal O(\log n)\) 期望/均摊
  • 空间:\(\mathcal O(n)\)
  • 特点:支持序列操作(分裂合并)或值域操作,FHQ-Treap 可持久化容易实现。
  • 替代:std::set / std::map 为 \(\mathcal O(\log n)\),但功能受限(无 kth)。

4. 堆(优先队列)

  • 普通堆(二叉堆):
    • 时间:push \(\mathcal O(\log n)\),pop \(\mathcal O(\log n)\),top \(\mathcal O(1)\)
    • 空间:\(\mathcal O(n)\)
  • 可并堆(左偏树):
    • 时间:merge \(\mathcal O(\log n)\),push/pop 同上
    • 空间:\(\mathcal O(n)\)
  • 应用:Dijkstra、Kruskal 优化、动态第k大(对顶堆)。

5. 单调队列 / 单调栈

  • 时间:每个元素入/出一次,均摊 \(\mathcal O(1)\)
  • 空间:\(\mathcal O(n)\)
  • 特点:维护区间最值(滑动窗口)、最近更大/更小元素,常用于DP优化(斜率优化前置)。

6. ST表(稀疏表)

  • 时间:预处理 \(\mathcal O(n \log n)\),查询 \(\mathcal O(1)\)(RMQ / 可重复贡献问题)
  • 空间:\(\mathcal O(n \log n)\)
  • 特点:静态区间最值、GCD、按位与等,不支持修改。

7. 分块(Sqrt Decomposition)

  • 时间:query \(\mathcal O(\sqrt n)\),update \(\mathcal O(\sqrt n)\)(或 \(\mathcal O(1)\) 块内+ \(\mathcal O(\sqrt n)\) 整块)
  • 空间:\(\mathcal O(n)\)
  • 特点:平衡复杂度,代码直观,可处理线段树难维护的操作(如区间众数、区间模数)。

8. 莫队(离线)

  • 时间:\(\mathcal O((n+q) \sqrt n)\) 普通莫队,带修 \(\mathcal O(n^{2/3})\) 每操作
  • 空间:\(\mathcal O(n)\)
  • 特点:离线处理区间询问,要求操作可快速 \(\mathcal O(1)\) 扩展/收缩区间。
  • 扩展:树上莫队、回滚莫队。

9. 可持久化数据结构

  • 可持久化线段树(主席树):
    • 时间:query \(\mathcal O(\log n)\),update \(\mathcal O(\log n)\)
    • 空间:\(\mathcal O(n \log n)\)(每次新建 \(\log n\) 节点)
    • 应用:静态区间第k小、树上路径第k小。
  • 可持久化Trie:
    • 时间:\(\mathcal O(\log V)\),空间 \(\mathcal O(n \log V)\)
    • 应用:最大异或和、区间异或最值。

10. 动态开点线段树

  • 时间:同普通线段树 \(\mathcal O(\log V)\)
  • 空间:\(\mathcal O(m \log V)\)(m为操作次数),避免 \(4V\) 爆炸
  • 特点:值域大(如 \(10^9\))时必用,可合并(线段树合并)用于树上统计。

11. 树链剖分(重链剖分)

  • 时间:路径操作 \(\mathcal O(\log^2 n)\)(剖分+线段树),子树操作 \(\mathcal O(\log n)\)
  • 空间:\(\mathcal O(n)\)
  • 特点:静态树上的路径/子树修改查询,是LCT的静态替代方案,常数较小。
posted @ 2026-07-24 09:30  Yangyihao  阅读(14)  评论(0)    收藏  举报