数据结构和算法--分段树

简介: 数据结构和算法--分段树

分段树(Segment Tree)是一种高级数据结构,源于计算机科学领域,特别适用于解决与区间相关的动态查询和更新问题。分段树本质上是一种二叉树结构,但它并不是典型的完全二叉树或满二叉树,而是通过对输入数组进行分段并构建树形结构来实现高效的区间操作。

分段树的基本概念:

定义: 分段树主要应用于一个数组或序列中,用于快速查询和更新指定区间内的某个特定属性,如区间和、区间最大值、区间最小值等。每个节点代表一个区间,并且这个区间是其左右子节点区间的合并。

构造过程:

输入是一组数据,通常是一个数组A[0...n-1]。

将整个数组看作一个区间,构造一个包含2^n - 1个节点的树(因此,对于n个元素的数组,树的高度大致为log_2(n))。

树的每个内部节点覆盖两个子区间,它们分别由该节点的左右子节点表示,而叶子节点恰好对应数组的一个单元格。

节点信息:

每个节点不仅存储它所覆盖区间的边界,还存储了一个摘要信息,例如该区间的和、最大值、最小值或其他根据问题需求计算得到的聚合信息。

操作支持:

查询操作:给定一个查询区间,可以在O(log n)时间内找到该区间内的目标信息,如区间和或区间最大值。

更新操作:当数组中的某个元素值发生改变时,可以在O(log n)时间内重新计算受影响的所有区间信息。

实例:

对于一个数值型数组,如果我们想要支持快速查询任意连续子数组的和,那么分段树的每个节点会存储它所管辖的子数组之和。

如果我们关注区间最大值,则每个节点存储其子区间内的最大值。

分段树的实现细节:

在Java或C++等编程语言中,分段树经常通过一个数组实现,而不是实际的二叉树结构。这是因为虽然逻辑上是二叉树,但在内存中我们可以利用数组的连续性减少指针引用的成本。数组的下标与树的层级和位置之间存在一定的转换规则,以便快速定位到相应区间对应的节点。

Java代码展示如何构建一个分段树来维护数组区间和的问题:

public class SegmentTree {
    private int[] tree;
    private int n;

    // 构造函数,传入原始数组arr,构建分段树
    public SegmentTree(int[] arr) {
        n = arr.length;
        tree = new int[n * 2]; // 由于每个节点都会存储信息,所以初始化的空间是原数组的两倍
        build(arr, 0, 0, n - 1); // 递归构建分段树
    }

    // 递归构建分段树
    private void build(int[] arr, int node, int start, int end) {
        if(start == end) {
            // 叶子节点,直接赋值
            tree[node] = arr[start];
        } else {
            // 内部节点,计算左右子区间和
            int mid = start + (end - start) / 2;
            build(arr, 2 * node + 1, start, mid);
            build(arr, 2 * node + 2, mid + 1, end);
            // 合并子区间信息
            tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
        }
    }

    // 区间更新函数,更新区间 [i, j] 的所有元素增加 val
    public void update(int i, int j, int val) {
        updateHelper(i, j, val, 0, 0, n - 1);
    }

    private void updateHelper(int i, int j, int val, int node, int start, int end) {
        if (i > end || j < start) return; // 区间不重叠,直接返回
        if (start >= i && end <= j) { // 区间完全包含在[i, j]内
            tree[node] += (end - start + 1) * val; // 更新节点值
            if (start != end) { // 如果不是叶子节点,还需递归更新子节点
                updateHelper(i, j, val, 2 * node + 1, start, (start + end) / 2);
                updateHelper(i, j, val, 2 * node + 2, (start + end) / 2 + 1, end);
            }
        } else { // 区间部分重叠
            updateHelper(i, j, val, 2 * node + 1, start, (start + end) / 2);
            updateHelper(i, j, val, 2 * node + 2, (start + end) / 2 + 1, end);
            tree[node] = tree[2 * node + 1] + tree[2 * node + 2]; // 重新计算节点值
        }
    }

    // 查询区间 [queryStart, queryEnd] 的和
    public int query(int queryStart, int queryEnd) {
        return queryHelper(queryStart, queryEnd, 0, 0, n - 1);
    }

    private int queryHelper(int queryStart, int queryEnd, int node, int start, int end) {
        if (queryStart > end || queryEnd < start) return 0; // 区间不重叠
        if (queryStart <= start && queryEnd >= end) return tree[node]; // 区间完全包含在查询区间内
        int mid = start + (end - start) / 2;
        return queryHelper(queryStart, queryEnd, 2 * node + 1, start, mid) +
               queryHelper(queryStart, queryEnd, 2 * node + 2, mid + 1, end);
    }
}
目录
相关文章
|
2月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
236 4
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
178 1
|
5月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
148 2
|
7月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
7月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
208 17
|
5月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
178 0
|
7月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
187 7
|
9月前
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
342 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
6月前
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
|
9月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
324 10
 算法系列之数据结构-二叉树

热门文章

最新文章