在网上总是查不到很系统的练ACM需要学习的数据结构资料,于是参考看过的东西,自己整理了一份。
能力有限,欢迎大家指正补充。
分类主要参考《算法竞赛入门经典训练指南》(刘汝佳),山东大学数据结构模板
⊙基本数据结构
1.链表:
块状链表:没练过
Dancing Links:用于优化搜索。解决精确覆盖问题和重复覆盖问题的利器。
Knuth教授的始祖论文:Dancing Links中文版
Dancing Links介绍(这篇对DLX的工作过程演示的很详细)
DLX——Dancing Links(这篇对精确覆盖与重复覆盖解释的简洁清晰)
---------------------------------------------------
2.栈:先进后出表
题目:POJ 1690 消除多余括号
LA 4817 大数+表达式求值
---------------------------------------------------
3.队列:先进先出表
普通队列(手动数组实现,链表实现,STL):BFS中常用。
循环队列:待补充
双端队列:待补充
优先队列:LA 3135, UVa 11997
单调队列:待补充
----------------------------------------------------
4.哈希表:
闭散列哈希:发生冲突时向下查找
开散列哈希(推荐使用):链表头插法解决碰撞问题
字符串哈希:各种字符串Hash函数
---------------------------------------------------
5.并查集:
数组实现:LA 3644
链表实现:待补充
树实现:UVa 11987
带权路径压缩:LA 6187,HDU 3038,LA 3027
---------------------------------------------------
6.二叉堆:
堆变种:左偏树:没练过……
============================================
⊙区间信息维护与查询
1.一些思想:
离散化:POJ 2528 注意离散化会出哪些问题
树形结构转线性结构:树形结构转线性结构方法汇总
POJ 3321,HDU 4366
排序后按一定顺序进行更新:HDU 4366
在线处理与离线处理:
---------------------------------------------------
2.树状数组:
功能:单点修改,区间求和。区间修改,区间求和。
题目:LA 4329 需要思路转换
SPOJ 1329 树状数组好题,弱菜我至今尚未AC
HDU 4331 树状数组+扫描线+神思路
树状数组中区间修改与区间查询的技巧:HDU 4358 树状数组+神思路
二维树状数组:彻底弄懂二维树状数组
单点修改+求矩阵元素之和:POJ 1195
---------------------------------------------------
3.RMQ:求范围最小值
资料:RMQ and LCA
题目:UVa 11235
---------------------------------------------------
4.线段树:【完全版】线段树
点修改+区间查询:UVa 12299, POJ 2828 需思路转换,ZOJ 3349 简单DP+线段树
区间修改/区间查询/区间合并:POJ 2374 DP+线段树,HDU 4339, HDU 4391, HDU 4366, ZOJ 3324 区间合并,ZOJ 1391 注意细节,FZU 2105 思路+注意细节,HDU 3397 繁琐的区间合并,HDU 4351 区间合并好题
找最左端点:HDU 2871,HDU 1540,HDU 4614 线段树+二分,不算传统意义上的找最左端点
扫描线:做的不多不好推荐
树链剖分:树链剖分
---------------------------------------------------
5.线段树变种:
二维线段树:没练过
主席树:UPC OJ 2224 / “浪潮杯”山东省第四届ACM大学生程序设计竞赛 1008 Boring Counting
http://blog.csdn.net/metalseed/article/details/8045038
http://seter.is-programmer.com/posts/31907.html
划分树:求第K元素
http://wenku.baidu.com/view/8fc6bc365a8102d276a22fa0.html
http://blog.csdn.net/zxy_snow/article/details/6681086
http://www.notonlysuccess.com/index.php/divide-tree/
归并树:求任意区间第k小数。没练过
============================================
⊙字符串
1.Trie(字典树):动态建树/静态建树/节点计数
题目:LA 3942(Trie+动归,至今一直TLE),UVa 11732(Trie性质),POJ 2513(动态建树),BNU OJ 29355(Trie+计数),UVa 11488(动态建树)
---------------------------------------------------
2.KMP算法:KMP算法详解
题目:
POJ 3450,POJ 2406,POJ 1961
HDU 3336,HDU 3746,HDU 1358,HDU 2087,HDU 2594
URAL 1423,URAL 1684,URAL 1732,SGU 284
拓展KMP:求模式串和主串的每一个后缀的最长公共前缀。
http://wenku.baidu.com/view/1f6e5223dd36a32d737581d1.html
---------------------------------------------------
3.AC自动机:http://www.notonlysuccess.com/index.php/aho-corasick-automaton/
---------------------------------------------------
4.后缀数组:http://www.notonlysuccess.com/index.php/sa/
----------------------------------------------------
5.后缀自动机:可以实现后缀数组的所有功能,时间复杂度和空间复杂度都是O(n)
陈立杰课件:http://wenku.baidu.com/view/7afa5828ed630b1c59eeb512.html
推荐资料:
http://fanhq666.blog.163.com/blog/static/8194342620123352232937/
http://hi.baidu.com/myidea/item/142c5cd45901a51820e25039
http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
http://www.cnblogs.com/GBRgbr/p/3236451.html(自己写的一篇后缀自动机的构造演示,厚颜无耻的贴出来……)
---------------------------------------------------
6.最长公共前缀(LCP):没练过
============================================
⊙各种二叉树
1.笛卡尔树:没练过
2.名次树:对键值而言,它是二叉排序树,对优先级而言,它是堆。没练过
功能:找出第k小元素,求值x的名次。
(上面这俩是不是同一个东西?)
---------------------------------------------------
3.伸展树:快速分裂合并
---------------------------------------------------
4.SBT:http://www.notonlysuccess.com/index.php/sbt/
---------------------------------------------------
5.求第K元素的各种方法:待补充
----------------------------------------------------
6.KD树:没练过
动态树问题:http://wenku.baidu.com/view/75906f160b4e767f5acfcedb.html