线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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) |
热门推荐
2025年全球8个免税国家:税收政策与投资机遇
艾灸关元穴
再见王树国:一生不变的家国情怀,缔造西安交大十年芳华
令妃到底“令”在哪里?聪明睿智的她才是真正的爽文大女主
科学是玄学的入门基础课,玄学是科学之路的探索者
数据库审计如何清理数据
上天入地,电科智慧让北斗应用“近在身边”
洗牙手术全攻略:术前准备与术后护理要点
怎么样跑步才能达到锻炼身体的最佳效果
矿卡骗取保修:揭秘一种最新的欺诈手段
江门十大宝藏景点大赏:岭南风情的奇幻之旅
航天英雄杨利伟:曾在太空听到诡异“敲门声”,13年后真相被揭开
真正的太阳系模型,到底应该什么样?
手机无法打开PDF文件?八步解决,轻松应对困扰!
极限运动伤害 越冒险 越受伤 越需要照顾
新能源电池盖板镭射二维码:激光打标技术的革新与应用
2025年普通话水平测试考试流程详解
普通高中学业水平考试与会考 你了解吗
NGC 5084星系黑洞“特立独行”,旋转方向与宿主星系不一致
宇宙中的"躺平"黑洞:NGC 5084的奇特结构
科学应对脱发危机:从根源破解”头顶危机”的8大策略
企业如何管理微信销售员
李世民:兼具汉族血脉与鲜卑影响的杰出帝王
职业病预评估:保障员工健康与安全的有效手段
高情商回应女性“你不爱我了”的问题
喝茶会肾结石、钙流失?关于茶的那些流言你掉过几个坑
2025太原近视手术十大医师揭晓
车名字能否反映车辆的性能?
志愿填报特辑:如何准确选择适合自己的医学专业?
中药洗头的正确方法是什么