【问题标题】:Range querying in Fenwick TreeFenwick 树中的范围查询
【发布时间】:2016-08-12 03:51:26
【问题描述】:

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

这是一个来自 Hackerrank 竞赛的问题:link

给你一棵树,其中每个节点都标记为 1、2、...、n。这棵树中有多少相似对?

A pair (A,B) is a similar pair iff

  • 节点 A 是节点 B 的祖先
  • abs(A - B)

输入格式: 输入的第一行包含两个整数 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

我了解 Fenwick 树的概念,但我无法设计在树中存储什么以进行范围查询,或者特别是如何进行范围查询。我了解它在检索总和时的工作原理,但是给定一个范围 [left, right] 我如何找到存储在树中的范围内的元素数量

【问题讨论】:

    标签: java algorithm tree


    【解决方案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

    【讨论】:

      【解决方案2】:

      我找到了在普林斯顿算法中查询 fenwick 树的示例。你可以在这里找到它:

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

      希望它对您的上下文有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多