主席树学习小结
来源:互联网 发布:数据丢失怎么恢复 编辑:程序博客网 时间:2024/06/04 08:38
可持久化线段树,也叫作函数式线段树,也就是主席树,(。。。因为先驱就是fotile主席。。Orz。。。)
这里,我将从查找区间第k小值(不带修改)题的可持久化线段树做法中,讲一讲主席树。
可持久化数据结构(Persistent data structure)就是利用函数式编程的思想使其支持询问历史版本、同时充分利用它们之间的共同数据来减少时间和空间消耗。/*找不到比较科学的定义,就拿这个凑凑数吧~~~*/
开讲!
一些数据结构,比如线段树或平衡树,他们一般是要么维护每个元素在原序列中的排列顺序,要么是维护每个元素的大小顺序,若是像二者兼得。。(反正我是觉得很。。)那么,这道题就想想主席树吧~/*还可以用划分树做*/
开讲!~好像说过一边了
既然叫“函数式线段树”,那么就应该有跟普通线段树相同的地方。一颗线段树,只能维护一段区间里的元素。但是,每个询问的区间都不一样,若是对每段区间都单独建立的线段树,那~萎定了~。因此,就要想,如何在少建,或建得快的情况下,能利用一些方法,得出某个区间里的情况。
比如一棵线段树,记为tree[i][j],表示区间[i,j]的线段树。那么,要得到它的情况,可以利用另外两棵树,tree[1][i-1]和tree[1][j],得出来。也就是说,可以由建树的一系列历史版本推出。
那么,怎么创建这些树呢?
首先,离散化数据。因为如果数据太大的话,线段树会爆~~
在所有树中,是按照当前区间元素的离散值(也就是用大小排序)储存的,在每个节点,存的是这个区间每个元素出现的次数之和(data域)。出现的次数,也就是存了多少数进来(建树时,是一个数一个数地存进来的)。
每添加一个节点(也就是新建一棵树)的复杂度是O(logn),因此,这一步的复杂度是O(nlogn)。
建完之后,要怎么查找呢?
跟一般的,在整棵树中找第k个数是一样的。如果一个节点的左权值(左子树上点的数量之和)大于k,那么就到左子树查找,否则到右子树查找。其实主席树是一样的。对于任意两棵树(分别存区间[1,i]和区间[1,j] i<j),在同一节点上(两节点所表示的区间相同),data域之差表示的是,原序列区间[i,j]在当前节点所表示的区间里,出现多少次(有多少数的大小是在这个区间里的)。同理,对于同一节点,如果在两棵树中,它们的左权值之差大于等于k,那么要求的数就在左孩子,否则在右孩子。当定位到叶子节点时,就可以输出了。
0 0
- 主席树学习小结
- 主席树小结
- 主席树学习笔记
- 主席树学习记录
- 主席树学习
- 主席树学习笔记
- 主席树学习笔记
- 主席树学习
- 主席树学习笔记
- 主席树学习--入门
- 主席树 学习整理
- 学习总结:主席树
- 主席树学习笔记
- 主席树入门学习
- 主席树(不带修改)小结
- 主席树(函数式线段树)学习小结(附手绘讲解图片)
- 学习记录5:主席树
- 主席树学习笔记(poj2104)
- 敏捷,能让人类登上月球吗?
- org.apache.log4j.Logger 详解 非常详细
- java.io.IOException: Prepare failed.: status=0x1异常解决方法
- matlab---SPAMS稀疏建模工具箱
- python自动化运维 第1章系统基础信息详解 第一节
- 主席树学习小结
- oracle 字段合并
- QML中MouseArea元素的介绍
- Hystrix 使用与分析
- count(1)、count(*)、count(column)区别和效率
- Crontab 基本使用范例
- centos 安装ffmpeg x264版
- 100. Same Tree
- Android Studio中的Project和Module是个什么鬼?