码迷,mamicode.com
首页 > 其他好文 > 详细

竞赛中常见的数据结构

时间:2016-06-18 16:47:26      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

  这篇文章结合15pku暑期training的资料,简单介绍几种竞赛中常见的数据结构,包括线段树、树状数组、伸展树、后缀数组、并查集等。

  需要点明的这,这个专栏的文章可以视作一个“预处理”,是作为笔者16年暑期pku集训的一个先导,因此拘于时间和精力很多知识点都是从整体上把握,缺少细节缺少证明也缺少代码实现,这些东西笔者会在以后的训练中详细的介绍出来。

 

  线段树:

  对于细胞和人口的指数级爆炸我们都很熟悉,而在算法设计当中,最忌讳的也是出现O(2^n)的时间复杂度,我们将这个计算过程视为正向,那么我们反向行之,先进行排序然后每次筛掉一般,这也就是我们常说的”二分法“,我们能够发现,它与指数爆炸一样效率惊人,而线段树就是这样一个基于这种思想的数据结构。

  为了满足每次能够“筛掉一半”,我们需要将要筛选的对象排序,最常见的就是在一个整数区间上进行建树,如下图。

  技术分享

    每个区间的长度是区间内整数的个数

? 叶子节点长度为1,不能再往下分

   若一个节点对应的区间是[a,b],则其子节点对应的区间分 别是[a,(a+b)/2]和[ (a+b)/2+1,b] (除法去尾取整)

?线段树的平分构造,实际上是用了二分的方法。若根节点对应的区间是[a,b],那么它的深度为log2 (b-a+1) +1  (向上取整)。

?叶子节点的数目和根节点表示区间的长度相同.

  由于它采取二分的搜索方式,树的深度一定不会超过log2 n + 1,n表示这个区间整数元素的个数,这使得我们访问这个区间上任何一个元素的时间复杂度都是O(log n)的,这相对于朴素的查找优化了太多,为我们在一个区间上进行查找、插入、更改和统计的优化提供了理论基础。

竞赛中常见的数据结构

标签:

原文地址:http://www.cnblogs.com/rhythmic/p/5596304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!