| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构: 线段树Segment Tree -> 正文阅读 |
|
[数据结构与算法]数据结构: 线段树Segment Tree |
💕写博客的目的在于巩固所学知识💕 💕为什么要有线段树有这样一个场景:给你一个数组nums ?有两个任务 ? ? ? ? 1.将 nums[index]的值更新为? ????????2.计算子数组? 这两个任务会执行若干次,执行的顺序随机。 对于第一个任务,我们可以利用数组的随机访问能力,在时间复杂度O(1)的情况下就能完成。 但对于第二个任务,我们可以采取累加的方式,从nums[left]一直加到nums[right],时间复杂度为O(n)。 那么问题来了,我们有没有再次基础上进一步的降低时间复杂度? 有!那就是线段树。 线段树的结构?根据上面的数组我们构成出了这样的树,突然看可能觉得很懵。 我们先从叶子节点看起? 可以看出叶子节点从左到右分别为数组nums[index]的值 再看父节点 可以知道父节点为左右两个子节点之和,则根节点则为整个数组之和。 这个时候,如果要我们计算nums[3,7]子数组之和,我们只需要对二叉树进行遍历,找到图中的两个节点即可。 ?💕构造线段树Talk is cheap. Show me the code. 在开始之前,首先要明白线段树其实是一个数状数组 ?把树的每层从左到右依次排序。 可以发现 左子节点 = 父节点 * 2 + 1; 右子节点 = 父节点 * 2 + 2; 填到数组中就是 ?
? 💕更新线段树此时nums[3] = 6,如果我们要把nums[3]改为10,线段树要怎么修改呢? ?先从父节点出发,找到nums[3]在线段树中对应的位置,修改节点后,在把沿途经过的父节点进行修改。
💕查找线段树
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:14:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |