首页 > 其他分享 >树形结构学习笔记

树形结构学习笔记

时间:2023-01-27 12:33:34浏览次数:25  
标签:复杂度 笔记 查询 学习 修改 树形 数组 区间 线段

线段树

引入

假设有这样的问题:有 \(n\) 个数,\(m\) 次操作,操作分为:修改某一个数或者查询一段区间的值。

分析下,如果针对数组元素的修改可以是 \(O(1)\) 完成,求某个区间值需要 \(O(n)\) 才可以完成,如果 \(n\) 和 \(m\) 都很大的情况,这个复杂度就很难接受了。

我们之前学过的前缀和算法可以解决区间求和的问题,并且时间复杂度是 \(O(1)\),但如果涉及到修改操作,前缀和数组都需要重新计算,时间复杂度也是 \(O(n)\)。

有没有什么办法可以兼顾以上两种操作,并且可以将时间复杂度降低?

这就是我们要学习的线段树!把修改和查询的时间复杂度都降到 \(O(logn)\)!

定义

线段树是一种二叉搜索树 , 对于线段树中的每一个非叶子结点 \([a,b]\),它的左儿子表示的区间为 \([a,\frac{a+b}{2}]\),右儿子表示的区间为 \([\frac{a+b}{2}+1,b]\)。因此线段树是平衡二叉树,设最后的子节点数目为 \(N\),即整个线段区间的长度,其空间复杂度为 \(O(n)\)。

若对于一个数组使用前缀和数组保存它的区间和,那么查找区间和时间复杂度为 \(O(1)\),而区间修改时间复杂度为 \(O(n)\)。使用线段树可以快速查找或修改某个区间的值,时间复杂度为 \(O(logN)\)。

区间和与单点修改问题

算法思想

假如有一个数组 \(a\),长度为 \(7\),将 \(a\) 赋值为:

\(a = \{1,10,100,1000,10000,100000,1000000\}\)。

为什么每个数要这么大呢?因为这样就能看出线段树的具体实现方法,后文会讲。

把 \(a\) 数组转化为线段树,就是下图。
image

可以发现,原来数组的值在二叉树都是最底下,节点的父亲都为左儿子与右儿子的和,我们从上到下把权值存入数组 \(z\) 中,\(z = \{1111111,1111,1110000,11,1100,110000,1000000,1,10,100,1000,10000,100000\}\)

那么每个节点表示从下标 \(l\) 到 \(r\) 的和我们也可以表示出来了。

image

查询操作

如何查询从 \(l\) 到 \(r\) 的和?

标签:复杂度,笔记,查询,学习,修改,树形,数组,区间,线段
From: https://www.cnblogs.com/OoXiaoQioO/p/17068796.html

相关文章

  • PLC笔记 知识点汇总 day1
          blog:师万物 本文是学习内容的简单回顾,希望对大家能有所帮助。 电路直流蓄电池交流单相(两线、三相)、两相、三相(三线、四线、五线)发电机:......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实现......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实......
  • 学习笔记——redis中的数据类型(List、Set、Hash)
    2023-01-25一、redis中的数据类型1、redis列表(List)redis列表底层是一个双向链表。(1)从左边/右边插入一个或多个值lpush/rpush<key><value1><value2><value3>例如:......
  • 《RPC实战与核心原理》学习笔记Day10
    11|负载均衡:节点负载差距这么大,为什么收到的流量还一样?什么是负载均衡?当我们的一个服务节点无法支撑现有的访问量时,我们会部署多个节点,组成一个集群,然后通过负载均衡,......
  • 【学习笔记】组合数学学习笔记
    参考资料:《组合数学》,OI-Wiki排列组合四个计数原理加法原理:并列的方案数加和。乘法原理:叠加的方案数相乘。减法原理:正难则反,补集转换。除法原理:目测用处不大......
  • 学习Ucore_lab体会
    纸上得来终觉浅,觉知此事要躬行使能中断物理内存管理虚拟内存管理内核线程管理用户进程管理进程调度同步和互斥文件系统 这些实验的名字都会让我心动。学习uc......
  • MAUI Blazor学习5-BLE低功耗蓝牙
    MAUIBlazor学习5-BLE低功耗蓝牙 MAUIBlazor系列目录MAUIBlazor学习1-移动客户端Shell布局-SunnyTrudeau-博客园(cnblogs.com)MAUIBlazor学习2-创建移动客户......
  • 读Java8函数式编程笔记02_流
    1. 外部迭代1.1. for循环是一个封装了迭代的语法糖1.1.1. 本质上来讲是一种串行化操作1.2. 很难抽象出不同操作2. 内部迭代2.1. 内部迭代中的相应接口:Stream......
  • esp32笔记[1]-blink闪灯
    硬件平台开发板:ESP32DEVKITV1主控模块:ESPWROOM-32获取例程gitclone-bv4.4--recursivehttps://gitee.com/EspressifSystems/esp-idf.git例程在esp-idf/exam......