BST Application

本文介绍了多种用于范围查询的数据结构,包括2D范围查询、kd-tree在1D和2D的应用,rangetree、Multi-LevelSearchTree及其优化fractionalcascading,以及intervaltree和segmenttree。这些数据结构通过预处理提高查询效率,适用于不同的查询场景。
摘要由CSDN通过智能技术生成

1.range query(范围查询)

 enumerating 是指将范围中的元素列举出来。

 2D的范围查序:

 关键是做出一张下图所示的表出来,预处理!(对一个需要经常使用的数据做预处理可以加快后续速度,磨刀不误砍柴工)其实没太明白它是怎么处理和查询的。

 2.kd-tree

1D:其实没必要是完全二叉树(这样反而不太好构建2D),但一定是叶子节点只出现在最后两行的真二叉树。要理解1D的其实不如先理解2D。每个内部节点(node)都可以看成一个范围的cut(割),目的是缩小范围,向左可以约定小于等于该割值的范围,向右是大于该割值的范围,割的值都是从点中提取的,但不是储存点信息的,是叶子节点才是储存点信息的,割到最后范围中只有一个点那就连接叶子节点,两个点以上继续割。一个范围选择哪个点的值作为割的值呢?如果是按照“向左可以约定小于等于该割值的范围,向右是大于该割值的范围”的话,那可以选取中间较小值(O(n)时间,K-选取)

其实过程是不断的判断每个node的范围与查询范围的关系,包含直接子树全可report,不包含直接排除,相交的话再往下细分,越往下颗粒度越小就越能越能判断前出两种关系(极限情况就是到叶子节点,直接判定这一个点)。1D的k-d树需要一个一个判断node的范围和查询范围的关系吗?这就是这种树的巧妙之处,在上面的例子中可以看到,只需要沿着查询范围的两个端点的路径去走就能把每个节点的范围判断出来,最后得到结果。2D的情况也是类似,可以证明与范围相交的节点不超过n^1/2,不需要所有的节点都递归一次。

2D: 

 

 构建O(nlogn)时间,范围查序一次2D是O(n^1/2)(count,如果输出结果还要加上范围中点数k)。

3.range tree&Multi-Level Search Tree(mlst)

下面这个range tree其实是Multi-Level Search Tree。

其实x-range tree就是1D的kdtree。两个1d的rangetree构成了Multi-Level Search Tree。

 最后一个相当于合并两个有序序列,O(n)复杂度。

nlogn的空间是因为要储存每个节点要存y的一维range树。时间复杂度O((logn^2),可优化logn?用空间换时间?(比kd树要快)

 

 fractional cascading:(分散叠层)An MLST with fractional cascading is called a range tree。

本质上是一种预处理,使得对y不需要进行多次logn查找,查询时间复杂度变为logn。如何建立指针?在merge的时候进行就行,还是O(n)复杂度。

5.interval tree

第一次看下面这题目,还以为是上面1D查询的特例(点集只有一个点),但是不一样,前面每次查序不变的是点集,区间变化,对点集进行预处理;这里是区间不变,每次查询点改变,对区间进行预处理。

进行一次排序之后一次搜索即可生成两条list。

6.segment tree

解决上一问题还可以用segment tree(线段树),和上面一样,这是对区间进行预处理的方法。

其实这预处理和前面的1Drange tree可以说是一模一样,但是前面是针对点集的,这是针对区间的,怎么一样呢?区间由顶点组成,将这些顶点集做range tree处理即可,因为range tree本质上每个节点都表示一个范围(例如根节点表示整个数轴,叶子节点虽然是表示一个点,但是其实也可以理解成只包含一个点的区间),对顶点的range tree解释,可以发现每个node都表示一个区间,叶子节点表示一个elementary interval,从上往下区间的颗粒度越来越小。

 用这种方式解决上面问题,一个查询的位置确定,可以知道该点对应的elementary  interval,只要知道包含这个elementary  interval的区间都包含这个点。

 其实一个排完序的序列与range  tree基本等价,一个有序序列的二分查找,其实也就是每次和固定的值比较,然后缩小范围,这和range tree是完全一致的。构建一棵range tree要确定各个区间终点,其实是在确定轴点,range tree构建出来时就排好了序,反过来排好了序,一可range tree 基本也确定了。

如果把关联区间的信息集中在叶子上,那可能出现每一个区间包含n个 elementary interval的情况,这样要O(n^2)的空间来储存关联区间的信息。

把关联区间的信息向上合并,一个区间最多只在logn的节点中储存,空间复杂度O(nlogn)。

构建树的时候每次往下能排除一半的不需要递归的节点,实际递归的节点每个高度只是常数个,所以是O(logn),n个区间就是nlogn,这个过程和1D的kd树范围查找很像。

 

查询时候顺着一条路径到达叶子节点,访问logn的节点,需要O(logn)时间,如果输出每个区间再加上r的时间。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值