Algorithm 使用二元索引树(Fenwick树)解决范围最小查询

Algorithm 使用二元索引树(Fenwick树)解决范围最小查询,algorithm,data-structures,tree,fenwick-tree,rmq,Algorithm,Data Structures,Tree,Fenwick Tree,Rmq,形式上,范围最小查询问题是: 给定数组A[0,N-1],求任意两个给定索引之间具有最小值的元素的位置 现在,标准解决方案是使用段树,并且已经描述过。用于解决范围查询的另一种数据结构是二叉索引树(Fenwick树),它更易于理解和编码 二叉索引树可以解决范围最小查询问题吗?如何解决?如果能实现更新和查询功能,我将不胜感激。我也在想同样的问题。然而,我认为fenwick树不可能执行最小/最大查询,这是因为它依赖于从a到b的累积频率是f(b)-f(a-1)这一事实,并且该属性对于最小/最大函数无效一般

形式上,范围最小查询问题是:

给定数组A[0,N-1],求任意两个给定索引之间具有最小值的元素的位置

现在,标准解决方案是使用段树,并且已经描述过。用于解决范围查询的另一种数据结构是二叉索引树(Fenwick树),它更易于理解和编码


二叉索引树可以解决范围最小查询问题吗?如何解决?如果能实现更新和查询功能,我将不胜感激。

我也在想同样的问题。然而,我认为fenwick树不可能执行最小/最大查询,这是因为它依赖于从a到b的累积频率是f(b)-f(a-1)这一事实,并且该属性对于最小/最大函数无效一般来说,可以为任何可逆操作调整fenwick树(例如加法、乘法)


至少可以使用Fenwick树回答0…x形式间隔的查询(左侧点固定为0)。这是在假设将操作更新到位置x只会降低存储值的情况下进行的。

尽管有其他答案,但可以使用Fenwick树对任何范围进行范围最小查询。我在这里发布了详细的解释:

简而言之,您需要维护

  • 表示节点[1,N]的实际值的数组
  • 以0作为根的Fenwick树,其中任何节点i的父节点是
    i-(i&-i)
  • 以N+1为根的Fenwick树,其中任何节点i的父节点是
    i+(i&-i)
查询O(日志n)中的任何范围

Query(inta,intb){
int val=无穷大//始终保持我们范围内的已知最小值
//从范围a的开头开始遍历第一棵树BIT1
int i=a
while(i,BIT1的父项)=a){
val=min(val,BIT1[i])//注意:遍历BIT2,但查找BIT1中的值
i=(i,比特2)的父代
}
val=min(val,实[i])
返回值
}
要更新摊销O(log n)中的任何值,需要更新实际数组和两个树。更新单个树:

while (node <= n+1) {
  if (v > tree[node]) {
    if (oldValue == tree[node]) {
      v = min(v, real[node])
      for-each child {
        v = min(v, tree[child])
      }
    } else break
  }
  if (v == tree[node]) break
  tree[node] = v
  node = parentOf(node, tree)
}
while(节点树[节点]){
if(oldValue==树[节点]){
v=min(v,实[节点])
为每个孩子{
v=min(v,树[子])
}
}否则就断了
}
如果(v==树[节点])中断
树[节点]=v
节点=父节点(节点,树)
}

@Kaustav我自己也尝试过,我没能想出一个解决方案。这就是为什么我把它贴在这里。我相信我的问题很清楚,表明了研究的努力。你的否决票很严厉。我认为仅仅命名算法和要求实现并不表明有太多研究的努力。你应该发布你尝试过的(代码).这难道不表明我阅读并实现了BIT,并且已经有了解决问题的段树方法吗?研究工作对你来说仅仅意味着代码片段吗?我的朋友,你没有建设性。同样,你确切的问题是:使用BIT能解决上述问题吗?如果是,如何实现BIT来解决问题?你是否考虑了这项研究工作?你正在给段树的TopMeple链接。这是一项研究工作吗?如果你考虑发布算法的链接,研究工作,并期待实现,那么很抱歉,鼓励外部资源的链接,但是请在链接周围添加上下文,这样你的同伴用户就可以了。我知道它是什么,为什么会在那里。总是引用一个重要链接中最相关的部分,以防目标站点无法访问或永久脱机。
while (node <= n+1) {
  if (v > tree[node]) {
    if (oldValue == tree[node]) {
      v = min(v, real[node])
      for-each child {
        v = min(v, tree[child])
      }
    } else break
  }
  if (v == tree[node]) break
  tree[node] = v
  node = parentOf(node, tree)
}