Fenwick树中的范围查询

时间:2016-06-19 05:50:39

标签: java algorithm tree

我试图解决这个涉及查询fenwick树的问题。 问题陈述如下:

这是Hackerrank比赛的一个问题:link

您将获得一棵树,其中每个节点都标记为1,2,...,n。这棵树中有多少个相似的对(S)?

一对(A,B)是类似的对iff

  • 节点A是节点B的祖先
  • abs(A-B)< = T。

输入格式: 输入的第一行包含两个整数n和T.接着是n-1行,每行包含两个整数si和ei,其中节点si是节点ei的父节点。

输出格式: 输出一个整数,表示树中相似对的数量

约束:

1 <= n <= 100000  
0 <= T <= n  
1 <= si, ei <= n.  

也保证没有循环,但树不必是二叉树。

示例输入:

5 2
3 2
3 1
1 4
1 5

示例输出:

4

说明: 类似的对是:(3,2)(3,1)(3,4)(3,5)

我的算法: 我将遍历DFS中的树,同时维护HashSet S以进行查询。在进入节点时,我将节点x添加到S,同时让我将其从集合中删除。

现在为了在特定叶节点找到答案,我需要找出Set中跟随x-T&lt; = y&lt; = x + T的节点数,其中&#39; y&#39;是祖先,x-T和x + T是范围内的节点。

我理解Fenwick Tree的概念,但是我无法设计在树中存储的内容以便进行远程查询,或者特别是如何进行远程查询。我理解它在检索总和时是如何工作的,但给定一个范围[左,右]如何找到树中存储的范围中的元素数

2 个答案:

答案 0 :(得分:1)

我找到了在princeton算法中查询fenwick树的例子。你可以在这里找到它:

http://algs4.cs.princeton.edu/99misc/FenwickTree.java.html

希望它能帮助你完成背景。

答案 1 :(得分:1)

请注意,标签范围最多为10^5,因此您可以将标签存储在Fenwick树中。使用1表示节点的存在,否则为0.然后sum表示节点的总数。

假设我们有Fenwick树T,方法

  • add(pos, val)添加 val到位pos,O(lgn)
  • sum(pos),获取位置1到pos的总和,O(lgn)

dfs在插入节点x时执行T.add(x, 1),删除节点x时,执行T.add(x, -1),何时对节点x进行查询,它是T.sum(x+k) - T.sum(x-k-1)

有关详细信息,请参阅code