算法浅谈——数据结构

我的水平所限,只能谈及几年前的OI省选水平的算法。再高深的,便不清楚了。html

声明:算法分类方式与列举顺序借鉴于hzwer同窗的《OI省选算法汇总》算法

OI算法,大抵可分为如下几类:数组

  1. 数据结构
  2. 字符串相关
  3. 图论相关
  4. 数学相关
  5. 动态规划
  6. 计算几何
  7. 搜索相关
  8. 不保证正确性的算法
  9. 其余重要工具与方法

下面依次谈一谈。数据结构

数据结构

对数据结构的理解,每每随着接触愈发深刻。大体会是这样的历程——dom

  1. 知道的很少,关注如何实现,实现能力较差
  2. 会超过十个,关注如何选取,实现愈发纯熟
  3. 能联系起来,关注如何组合,实现基本无误
  4. 后面的我也不知道了……

首先必须扫盲一下,按我这种分法,OI的完整数据结构历程怎么也得十步以上。随便一个省队队员,基本都已经超越了我说的这三个阶段。然而,实际工程中,普通工程师们对数据结构的理解却很浅,平衡树都不必定写过,可并堆甚至都没据说过。可这并不说明实际工程不须要对数据结构的理解,只能说明广泛水平低。也正所以,我才能在这里写点东西,糊弄一下不搞OI的人。工具

我大概到了第三阶段的初期,实现基本无误,开始关注如何组合了。虽然实际工程中依旧会偶尔遇到本身并不了解的数据结构。但这每每并不会阻碍我,毕竟工程中的数据结构并不像OI那么高深,借助本身对数据结构的理解,每每能够很快理解并实现一个从未见过的数据结构。spa

下面,我将一一介绍我所熟悉的数据结构,供你们参考。xml

数组、链表

其实,这俩根本不该该算是数据结构,应该算是实现。区分数组与链表,应该算是数据结构的实现入门吧~htm

  • 数组长度固定,链表则更灵活。
  • 数组定位访问速度快,链表拼接切分速度快。

堆、并查集、Hash表

  • 堆:插入、修改、删除、取最值,时间 O(logN)OlogN 。
  • 并查集:合并两个集合、查询两个元素是否在同一集合之中,时间 O(1)O1 。
  • Hash表:插入、修改、删除、查询,时间 O(1)O1 。

树状数组、线段树、平衡树、块状数组

  • 树状数组:单点修改、区间查询,时间 O(logN)OlogN 。
  • 线段树:区间修改、查询,时间 O(logN)OlogN 。
  • 平衡树:插入、修改、删除、查询、取第k大值,时间 O(logN)OlogN 。
    • AVL、红黑树:经典,不多用。
    • Treap:实现快、速度快,好用。
    • Splay:还可区间修改、区间查询、区间翻转等等,时间 O(logN)OlogN ,虽然常数大点,但很是灵活,再配上CLJ的实现,简直舒服。
  • 块状数组、块状链表:插入、修改、删除、查询、取第k大值,时间 O(N‾‾√)ON 。

可并堆、树套树

  • 可并堆:能够合并的堆,依旧保证 O(logN)OlogN 的时间。
    • 左偏树:可并堆中的AVL。
    • Random Heap:可并堆中的Treap,这是做者的介绍
    • 斜堆:可并堆中的Splay。
    • 斐波那契堆:这东西……实现太复杂,换来的也就是理论复杂度低一些,实在不必-_-#
  • 树套树:一棵树的每一个结点都是另外一种树,以此来结合两种树的优势,同时保证时空复杂度。我比较弱,这个不多写,都忘得差很少了,就不妄言了。

其余数据结构

数据结构还有不少不少种,之后或许还会再多写一点~这里先随便列点吧^_^blog

  • KD树、四分树
  • 可持久化数据结构
    • 可持久化线段树(主席树)
    • 可持久化平衡树
    • 可持久化块状数组
相关文章
相关标签/搜索