区间树判定算法

夜雨_倚琴 2010-11-25 11:35:21
1 单个变量的情况,比如:(A为整数)
A[1, 10], A[2, 27], A[1, 5], A[16, 25] ....
有N条这样的区间,每个区间表示变量A可以在该区间内取值。
求:[X, Y]是否被某一区间所包含?(只要判断是否即可)
比如按照上面的例子,[4, 4]被某一区间包含, [12, 14]不被任何区间包含。

考虑到N很大,所以要求找到O(lgN)的算法,根据《算法导论》里面的讲解,可以构建一个区间树(红黑树的变形),来进行求解。


2 但如果扩展一下,变成多个变量的情况,如:
A[1, 10]&&B[3, 6], A[2, 27]&&B[4, 7], A[1, 5]&&B[6, 11] ...
解释一下A[1, 10]&&B[3, 6]这个区间表示含义是,A在[1, 10]取值,同时B在[3, 6]取值。

这无疑增加了题目的难度,思索大半天,觉得对多个变量的情况,用区间树很难有O(lgN)的解法。
那么如何找到O(lgN)的解法呢?

我知道算法版的大牛很多,象原来经常看到的math, 骇客兄等等。很希望能借这个问题向诸位请教下。谢谢~
...全文
271 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复

---------[4, 8]max=11
--------/ ------------\
-------/---------------\
------[2, 5]max=9-------[4, 11]max=11
-----/-------- \--------------- \
----/-----------\----------------\
---[1, 3]max=3 [3, 9]max=9 --------[8, 10]max=10
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复
⊙﹏⊙b汗,应该是tab导致没对齐,区间树补上:

[4, 8]max=11
/ \
[2, 5]max=9 [4, 11]max=8
/ \ \
[1, 3]max=3 [3, 9]max=9 [8, 10]max=10
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复
如何扩展?能否说得具体些。


针对一维的,也就是单个变量的情况,假设每个区间表示为[low, high],以low为键值建立区间树,以另外,利用附加变量max表示改节点的子树中最大的high值,如下:
[4, 8]max=11
/ \
[2, 5]max=9 [4, 11]max=8
/ \ \
[1, 3]max=3 [3, 9]max=9 [8, 10]max=10

加附加变量很重要,利用它可以保证在查找区间的时间为O(lgN),假设要查找[x, y]是否被某一区间覆盖。

1 从根节点开始查找。
2 查看当前节点区间是否覆盖[x, y]若覆盖直接返回查找成功;
否则查看左子树的最大high值是否大于等于x,>=则再从左子树开始查,否则再从右子树开始。
3 当前节点为NULL,返回查找失败。


问题:如果扩展为二维区间数,这个附加变量如何选取?如果保证O(lgN)的复杂度和查看的正确性
绿色夹克衫 2010-11-26
  • 打赏
  • 举报
回复
btw,lz名字中的后三个字,和我的名字好像呀!
绿色夹克衫 2010-11-26
  • 打赏
  • 举报
回复
把线段树的每个节点再连到一棵关于B的树,应该就差不多了。
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复
应该没有log(N)*log(N)吧?

简单地,假设B树的节点个数为m, A树的节点个数为n。
总的节点个数为N = m*n

查找时间 O(logm)+O(logn) = O(log(m*n)) = O(logN)
绿色夹克衫 2010-11-26
  • 打赏
  • 举报
回复
空间比较大,前期预处理时间比较长,每次查询应该算log(n)*log(n)的。

[Quote=引用 9 楼 lunar_lty 的回复:]
我之前也想过这个方案,不过认为这个方案是复杂度为O(N)。现在仔细分析下,这个方案时间确实为O(logN)

只是多维的话,实现起来……
[/Quote]
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 litaoye 的回复:]

把线段树的每个节点再连到一棵关于B的树,应该就差不多了。
[/Quote]

恩,在一棵关于A的线段树上对每个节点连一个关于B的线段树,如果还有变量C的就挂在B的节点上。
fanster28_ 指的应该也是这个意思。

我之前也想过这个方案,不过认为这个方案是复杂度为O(N)。现在仔细分析下,这个方案时间确实为O(logN)

只是多维的话,实现起来有点复杂,大家还有没有更好的办法呢?

没有的话,准备结贴了。
夜雨_倚琴 2010-11-26
  • 打赏
  • 举报
回复
是的,这个附件变量的选择有点棘手。
jinwen0915 2010-11-26
  • 打赏
  • 举报
回复
我觉得可以把MAX改为B区间的最大值~ 我的想法就是把2个区间当作一个来看,中间空余的先无视,查找对象也如此考虑~ 这样可以找出多个可能包括目标区间的节点,然后再判断~但最坏情况时间复杂度是O(n)
fanster28_ 2010-11-25
  • 打赏
  • 举报
回复
无非扩展一维区间树到二维或者多维

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧