线段树与树状数组详解:原理、应用场景及代码实现
创作时间:
作者:
@小白创作中心
线段树与树状数组详解:原理、应用场景及代码实现
引用
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上合组织国家电影节,近50场活动展现全球影视新成果
案底人员也能找到适合自己的工作:探讨就业可能性
审判长和审判员的区别
粗茶淡饭和大鱼大肉对健康哪一种更好
如何测量沙发尺寸?这种测量方法有哪些实用技巧?
为什么会得尿毒症?医生提醒:出现这些症状要注意,及时就医!
手办从概念构思到最终成品的完整生产过程
张掖甘州:古城中轴线悄然“更新”
无人机将成为未来战场上的核心装备!学习时报:军用无人机研发的七个趋势
消费者信心指数回升,“慢变量”加快回暖折射哪些趋势?
延伸公证服务链条,释放法律服务效能
深圳十大面积最大的公园排行榜
农村医疗救助:提升乡村健康水平的关键措施
防范DOS攻击应采取哪些措施?
使用ntopng和NetFlow/IPFIX检测DoS攻击(上)
详解最难的账务处理:订单用了各类券
“就业+产业”!多管齐下防止返贫 促脱贫农民就业稳增收
面对强拆,我们该如何理智应对?
揭秘“三钱”科学家:钱学森、钱伟长与钱三强的传奇人生
胆囊炎的原因及治疗措施
“历史终结论”终结之后,福山说了些什么?
混凝土工程施工工艺及注意事项
家用燃气报警器如何正确安装及使用?
卡罗拉发动机故障灯亮怎么消除