美文网首页数据结构
线段树 03 在线段树中查询

线段树 03 在线段树中查询

作者: 乌鲁木齐001号程序员 | 来源:发表于2019-02-13 23:56 被阅读8次

查询区间 [queryL, queryR] 上被赋予的意义

  • 将问题转化为一个递归问题:在以treeIndex为根的对应区间为 [l, r] 的线段树中,查询区间 [queryL, queryR]被赋予的意义;
// 返回区间[queryL, queryR]的值
public E query(int queryL, int queryR){

    if(queryL < 0 || queryL >= data.length ||
            queryR < 0 || queryR >= data.length || queryL > queryR)
        throw new IllegalArgumentException("Index is illegal.");

    return query(0, 0, data.length - 1, queryL, queryR);
}
  • 更小规模的同一个问题是:在以leftTreeIndex为根的表示区间 [l, mid] 的线段树中,或以rightTreeIndex为根的表示区间为 [mid + 1, r] 的线段树中,查询区间 [quertL, queryR] 被赋予的意义;
    • 当区间 [queryL, queryR] 完全在 [l, mid] 中,则在以leftTreeIndex为根表示区间 [l, mid] 的线段树中查询区间 [queryL, queryR] 被赋予的意义;
    • 当区间 [queryL, queryR] 完全在 [mid + 1, r] 中,则在以rightTreeIndex为根的表示区间 [mid + 1, r] 的线段树中查询区间 [queryL, queryR] 被赋予的意义;
    • 当区间 [queryL, queryR] 跨越leftTreeIndex和rightTreeIndex表示的区间时:
      • 在以leftTreeIndex为根的表示区间 [l, mid] 的线段树中查询区间 [queryL, mid] 被赋予的意义leftResult;
      • 在以rightTreeIndex为根的表示区间 [mid + 1, r] 的线段树中查询区间 [mid + 1, queryR] 被赋予的意义rightResult;
      • 合并leftResult和rightResult,即为在以treeInde为根的表示表示区间 [l, r] 的线段树中查询区间 [queryL, queryR] 被赋予的意义;
  • 不能再缩小的基本问题是:查询的区间 [queryL, queryR] 正好就是treeIndex表示的区间,即l == queryL && r == queryR,那么查询的结果就是tree[treeIndex]的值;
// 在以treeIndex为根的线段树中[l...r]的范围里,搜索区间[queryL...queryR]的值
private E query(int treeIndex, int l, int r, int queryL, int queryR){

    if(l == queryL && r == queryR)
        return tree[treeIndex];

    int mid = l + (r - l) / 2;
    // treeIndex的节点分为[l...mid]和[mid+1...r]两部分
    int leftTreeIndex = leftChild(treeIndex);
    int rightTreeIndex = rightChild(treeIndex);
    if(queryL >= mid + 1)
        return query(rightTreeIndex, mid + 1, r, queryL, queryR);
    else if(queryR <= mid)
        return query(leftTreeIndex, l, mid, queryL, queryR);
    
    // 查询区间左边界在leftTreeIndex表示的区间,右边界在rightTreeIndex表示的区间
    E leftResult = query(leftTreeIndex, l, mid, queryL, mid);
    E rightResult = query(rightTreeIndex, mid + 1, r, mid + 1, queryR);
    return merger.merge(leftResult, rightResult);
}

相关文章

  • 线段树 03 在线段树中查询

    查询区间 [queryL, queryR] 上被赋予的意义 将问题转化为一个递归问题:在以treeIndex为根的...

  • 线段树

    一、线段树建树、单点修改、区间查询 二、线段树建树、区间修改、区间查询

  • 数据结构-线段树

    实现一个线段树 下面实现的线段树,有三个功能: 把数组构建成一颗线段树 线段树的修改 线段树的查询 303号问题 ...

  • Java 算法-线段树的修改

      首先说明一下,看这个博客之前,最好有线段树的基本概念,比如说线段树的构造、线段树的查询之类的。最近在学习ANd...

  • 线段树模板

    线段树 线段树基本概念 概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组)...

  • 算法模板(七) 线段树

    线段树单点操作 线段树区间操作

  • 线段树(区间树)

    线段树:线段树是一种二叉树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。线段树适用于不变...

  • 主席树(静态) 图文讲解让你一次就懂 hdu2665为例

    主席树 先介绍一下主席树,主席树也称函数式线段树也称可持久化线段树。(其实就是支持查询历史版本,这个在看完之后就会...

  • 10.线段树(比较高级的数据结构)

    一、线段树(区间树)的概念 Segment Tree;线段树属于高级数据结构,经常出现在算法竞赛中为什么要使用线段...

  • 线段树系列之——区间更新

    第三篇线段树了——重点不在于解决题目,通过题目理解线段树才是重点 前面写了一篇关于线段树的单点更新,线段树的单点更...

网友评论

    本文标题:线段树 03 在线段树中查询

    本文链接:https://www.haomeiwen.com/subject/jzzjeqtx.html