线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
CSDN
1.
https://blog.csdn.net/weixin_74850661/article/details/145394365
基础知识
线段树和树状数组都只是一个工具,题目并不会一下子就告诉你这个题目用到线段树和树状数组,这取决于你想使用的数据结构以及所要优化的方向。
线段树和树状数组(也称为二叉索引树)是两种常用的数据结构,主要用于处理数组的区间查询和更新操作。它们的主要区别如下:
适用场景
- 线段树 :
- 适用于需要复杂区间操作的场景,如区间最大值、区间最小值、区间更新等。
- 适合动态性较强的问题。
# 点的更新
class Tree:
def __init__(self,n):
self.st = [0]*(4*n)
# 当前节点o,当前范围是l,r,需要在索引index,更新值为val
def update(self,o,l,r,index,val):
# l,r 是当前区间的范围,index 是要插入的数据的索引
if l==r:
self.st[o] = val
return
mid = (l+r)//2
if index<=mid:
self.update(2*o,l,mid,index,val)
else:
self.update(2*o+1,mid+1,r,index,val)
self.st[o] = max(self.st[2*o],self.st[2*o+1])
# 当前节点为o,当前的节点为l,r,需要查询的范围是L,R
def query(self,o,l,r,L,R):
if l >= L and r <= R:
return self.st[o]
mid = (l+r)//2
res = 0
if L<=mid:
res = max(res,self.query(2*o,l,mid,L,R))
if R > mid:
res = max(res,self.query(2*o+1,mid+1,r,L,R))
return res
- 树状数组 :
- 适用于简单的前缀和查询和单点更新问题。
- 适合静态或半静态问题,且代码实现更简洁。
特性 | 线段树 | 树状数组 |
|---|---|---|
结构 | 二叉树 | 基于数组的树形结构 |
功能 | 支持复杂区间操作 | 主要用于前缀和查询 |
时间复杂度 | O(log n) | O(log n) |
热门推荐
《光伏发电站逆变器电磁兼容性检测技术要求》
打造完美雨林生态缸:从材料选择到日常维护的全攻略
一盔一带 守护生命 | 交通安全知识宣传
“禅师”菲尔·杰克逊和波波·“诸葛维奇”,谁才是教练里的GOAT?
大米生虫?别急着暴晒,试试这3个“土方法”,轻松解决,不生虫
钙缺乏的症状与影响:从疲劳无力到骨质疏松
【NLP入门】一文搞懂 Word2Vec 词向量化技术(小白必会版)
欧洲河流:历史和地理上的特征和重要性
欧洲最长和最重要的河流:历史和地理
家庭教育的智慧:培养孩子的环保意识和责任感
CIS企业识别系统:解密品牌设计三大关键,提升企业形象!
上海最有名的5道传统本帮菜,浓油赤酱,看了肚子就饿了
本帮菜是什么菜?菜系的特色与起源介绍
狗的 10 个常见健康问题及其预防方法
狗吐白沫怎么办?专业兽医建议及紧急处理指南
指甲油美甲贴安全吗?测评结果来了
探秘桃花生长之路(从萌芽到开放,逐步呈现出美丽的景象)
桃花的形态特征及生长习性
皮肤出现红疙瘩后变成水泡?可能是这四种原因
车库投资的收益如何?怎样选择有潜力的车库进行投资?
多个停车场免费!东莞又一镇开放共享车位!800+个!
父母与孩子之间幽默沟通的技巧
中建项目部的十大管理方法
切尔诺贝利惊现核辐射“变异”狗群!40年核污染中进化20代,对污染已免疫?
来,“轻断食”了解一下?
如何增强房屋防风设计
在选择中成长:6篇中考作文精选
出游上春山,带你看懂山峰峦嶂有啥区别
企业律师面试问题汇总:面试官必问问题及应对策略
铜的金属特性对其应用有何影响?怎样合理利用这些特性?