【问题标题】:Application of binary indexed tree二叉索引树的应用
【发布时间】:2017-05-28 15:40:49
【问题描述】:

我试图解决this 算法问题,我遇到了这个不错的解决方案:

"这个想法是把ai、bi和 ci 不对称。 BIT 支持最低 查询从 1 开始的键间隔。我们使用 ci 作为值和 bi 作为键。这些是按照增加ai的顺序插入的。这个 方式,对于每个 ai ,数据结构允许查询 [1..bi 中 bj 的 cj 的最小值(可能为 ∞)和 aji。我们有 cji 当且仅当参赛者 i 不是 很好。”

source

现在我很难理解这个解决方案。

这是我对这个解决方案的理解:我知道二叉索引树用于回答查询,例如在数组中查找区间的总和,它还支持元素更新。它分别以 O(logn) 时间复杂度执行这两项操作。现在这个解决方案说我们构建 BIT,键为 ci,值为 bi,基本上 bi 是一个附加值每个节点都有。现在我们在树中插入 ai 值增加的元素,这就是我失去控制的地方。我们插入节点的顺序以及该部分后面的语句所说的内容有什么关系,我不知道。

请帮助我理解这个解决方案的含义。

【问题讨论】:

    标签: algorithm tree binary-indexed-tree


    【解决方案1】:

    让我们找出所有不优秀的参与者。另一个参与者j 可以比参与者i 更好,前提是他的a[j] < a[i]。因此,我们可以忽略所有具有较大值a[j] 的参与者。这就是我们按a 对它们进行排序的原因。

    这个条件是必要的,但不是充分的。我们还需要检查bc。我们怎么能做到这一点?我们需要知道是否有一个人a[j] < a[i](即按排序顺序排在当前人之前的那个人),这样他的b[j] < b[i]c[j] < c[i]。我们构建一个 BIT(以 c[j] 作为键,b[j] 是值)来检查最后两个条件。很明显,当且仅当前缀 [0, c[i]) 的最小值小于 b[i] 时,这样的 j 才存在。

    总结一下思路如下:我们按照a[i]排序,然后忽略a的值。这样,我们从 3-D 问题转到 2-D 问题,这更容易解决(这就是顺序很重要的原因。a[i] 越大的人越好)。我们使用 BIT 来解决二维问题。

    【讨论】:

    • 好的,我明白了,但它让我想到如果有 4 个柱子可以做这样的事情吗?我的意思是是否可以使用列>4 的概念来解决这个问题,或者这个问题仅适用于 c=3。
    • @ash 您可以使用二维分段树而不是 BIT 求解 2 列。一般来说,可以用k - 2 维度段树求解k-D 版本。显然,它的实现变得更加复杂,并且对于更高维度的工作速度更慢。事实上,它很可能会开始输给一个天真的O(N^2) for large k。所以,是的,它只适用于 3-D。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多