首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏desperate633

    LintCode 线段系列问题(线段的构造,线段的构造||,线段的查询,线段的查询II,线段的修改)线段的构造线段的构造 II线段的查询线段查询 II线段的修改

    线段(又称区间), 是一种高级数据结构,他可以支持这样的一些操作: 查找给定的点包含在了哪些区间内 查找给定的区间包含了哪些点 线段的构造 题目 线段是一棵二叉,他的每个节点包含了两个额外的属性 实现一个 build 方法,接受 start 和 end 作为参数, 然后构造一个代表区间 [start, end] 的线段,返回这棵线段的根。 样例 对于数组 [0, 空,2, 3], 对应的线段为: ? 该方法将 root 为跟的线段中 [start, end] = [index, index] 的节点修改为了新的 value ,并确保在修改后,线段的每个节点的 max 属性仍然具有正确的值。 样例 对于线段: ?

    90330发布于 2018-08-22
  • 来自专栏追不上乌龟的兔子

    线段

    线段 (有关线段的定义来自LintCode网站的相关题目) 描述 线段是一棵二叉,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。 说明 线段(又称区间), 是一种高级数据结构,他可以支持这样的一些操作: 查找给定的点包含在了哪些区间内 查找给定的区间包含了哪些点 样例 比如给定start=1, end=6,对应的线段为: 最大线段 纯粹的线段并不能应用于太多的实际问题,一般来说线段的节点除了start和end之外,还会有一个额外的属性值,我们以最大线段为例,最大线段的每一个节点还有一个代表区间中最大值的max 线段的修改方法modify,接受三个参数root、index和value。 该方法将root为根的线段中 [start,end] = [index,index] 的节点修改为了新的value,并确保在修改后,线段的每个节点的max属性仍然具有正确的值。

    4.1K91发布于 2018-06-20
  • 来自专栏魔法书

    线段(区间

    线段一定是满二叉吗?不一定,这里是因为8恰好是2的三次方,刚好可以构成一颗满二叉。   根节点代表整个线段,左孩子代表根节点线段的前半段,右孩子就是根节点线段的后半段。 如果现在数组中有十个元素,相应的线段就不是二叉了,如下: 注意:线段不是完全二叉,但线段是平衡二叉,当然堆也是平衡二叉线段虽然是平衡二叉,不是完全二叉,但是线段任然可以使用数组来表示,如果区间有n个元素,用数组表示需要有多少个节点呢? ,因此我们可以找出数组中的所以和完全二叉中节点的关系,我们在堆和优先队列中已经推到过关系了,虽然线段不是完全二叉,但由于线段是平衡二叉,所以我们在处理时,是将线段作为满二叉在进行处理,满二叉又是特殊的完全二叉 本文讲的是一维线段,当然还有二维线段和三维线段,本文就不做介绍了,你们有兴趣可以去网上查阅相关资料进行学习。

    60810编辑于 2024-01-19
  • 来自专栏阿伟的个人博客

    线段

    为了降低上述两操作的平均时间复杂度,引入线段这种数据结构,使得update 和 query的时间复杂度都变为O(log(N))。 线段的每个节点存储某一个段区间之和,其中每个结点的左子树和右子树分别存储当前结点的前半段之和和后半段之和,叶子结点存储的线段长度为1,根结点存储整个数组之和。 如下举例说明: 对于nums = [1, 2, 3, 4, 5, 6],线段树结构如下图所示: ? 由于我们发现其构成的线段类似完全二叉。因此可以使用像大/小根堆中的存储二叉的方式存储该。 nums.length * 4]; create(0, 0, nums.length - 1); } // left 和 right为nodeIndex对应的nums的线段区间 还是使用递归求解,代码与建树过程类似,不过需要注意的是不需要走完全,只需走完对应的部分即可。

    65410发布于 2020-10-09
  • 来自专栏分享学习

    线段

    简单线段过程详解 #include<iostream> //——————————>debug 了一上午才把这个程序运行的过程在脑子里有了思路 #include<string.h> 这个可定义其他数----------->这个 主要是控制数组的大小, using namespace std; struct node { //结构体 ,相当于创建的二叉

    55310发布于 2020-03-25
  • 来自专栏EmoryHuang's Blog

    线段模板

    线段模板 线段是算法竞赛中常用的用来维护 区间信息 的数据结构。 线段可以在 图片 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 线段 + Lazy(数组) class SegmentTree: def __init__(self, nums) -> None: self.n = len(nums) self.build(1, self.n, 1) def build(self, start, end, idx): # 对 [start, end] 区间建立线段 self.lazy[idx << 1 | 1] += self.lazy[idx] # 清空当前节点的标记 self.lazy[idx] = 0 线段 node.lazy node.right.lazy += node.lazy # 清空当前节点的标记 node.lazy = 0 参考资料 线段

    59010编辑于 2022-10-31
  • 来自专栏机器学习炼丹之旅

    线段(模板)

    刚学了线段,趁现在理解比较清楚,写篇博客供以后翻阅,线段有很多应用,如求区间总和,最大值,最小值等,总之求区间问题都可以想想线段,这里以求和为例 定义全局变量 const int maxn=1e5

    51810编辑于 2022-06-29
  • 来自专栏指点的专栏

    线段初探

    线段更新 好了,通过前面我们已经解决了文章开头留下的问题,下面再来理解一个问题:线段的节点更新。 额外话题 最后上文提到过关于线段是满二叉的正确性问题,我们理解了线段之后再来看这个问题,假设现在有 3 个数:1, 2, 3 ,对应的下标为 0, 1, 2。 现在如果需要用线段来保存对应区间的值,那么构造出来的线段就是这样的: ? 3、线段一旦构造好,其区间范围不能更改,如果要更改区间范围,那么就需要重新构造一颗新的线段。 : 蓝桥杯:操作格子 lintcode:线段的查询 这个网站里面有很多线段的题目,在网站里面搜索一下就好了。

    73630发布于 2019-01-18
  • 来自专栏以终为始

    线段QWQ

    一直没碰过线段,个人认为好长好难,不过这几天做题遇到了裸的线段的题,TAT。 线段我理解就是把二叉的左右节点现在分别看成是两个区间。 那么现在这两个区间的端点怎么存放? 学习建立二叉的时候是用指针、结构体来建立的,依靠指针来找子节点或者根节点,当然在线段中依然可以那么建立,不过 在使用时可能会因为指针的特点,RE之类的错误经常出现,于是就是就有人想到用结构体类型数组来模拟建立 (当时自我感觉认为3倍就够了,但是RE了一次,可以在纸上手动画一下,帮助理解) 线段一般就是来解决比较直观的问题(当然也有好多神级题目来考你的线段,这里暂时忽略一下),比如给你一个N长度的一 组数, 这样的问题就可以用线段来解决了。 线段多做做就好啦,QWQ。

    54020编辑于 2023-03-09
  • 来自专栏yhlin's blog

    图解线段

    线段 ----   线段是算法竞赛中常用的用来维护 区间信息 的数据结构。线段可以在 O(\log_{2}{N}) 的时间复杂度内实现单点修改、区间修改、区间查询等操作。 线段的基本结构 ---- 为数组(假设下标从 1 开始): a[5] = [{1,2,3,4,5}] 构造线段如下图(采用堆式存储): 上述数组 D 用来保存线段,由于采用的是堆式存储 线段的建立 由于递归定义的,因此其建立也是递归的: void buildST(int left, int right, int p, vector<int>& D, vector<int> & mid, p*2, D, a); build(mid+1, right, p*2+1, D, a); D[p] = D[p * 2] + D[p * 2 + 1]; } ---- 线段的区间查询 ---- 区间和: // [left,right] 为待查区间,[cl,cr] 为当前区间,p 为当前节点编号,D 为线段的存储数组 int getSum(int left, int right

    87830编辑于 2023-02-27
  • 来自专栏Unclezhou's Blog

    线段模板

    概述:线段是算法竞赛中常用的数据结构(虽然考场中很少用,毕竟调起来麻烦,区间求和用树状组还是更加方便代码也短)。 线段可以在O(logN)的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 简略的描述一下算法思路,线段是一个二叉的每一个节点存储的都是一个区间内的值(根据具体的题目而定),每个父结点的值由两个子结点的值决定。 但是普通的二分思想并不能体现线段的精髓所在,线段的精髓就在于它的懒标记,具体往下看。算法的实现://建议初学者先看无懒标记版,在最下面。 N的大小void build(int l,int r,int tr){t[tr].l=l;t[tr].r=r;if(l==r) {t[tr].sum=a[l];return;} //如果区间内只有一个

    52320编辑于 2023-07-25
  • 来自专栏yifei的专栏

    线段笔记

    线段就是利用二叉这种数据结构,来维护区间信息的一种数据结构。 简介 二叉的每个结点,都代表一段区间。 下面以区间和问题为例,对线段的实现进行讲解。 单点更新,区间查询 307.Range Sum Query - Mutable 如果做过一些二叉递归类的题,这个应该就挺好理解了。 几年前我尝试学习线段的时候,感觉好难。 后来刷了一些二叉类的题,现在再来学习线段,发现还是挺好理解的。所以如果有些算法学起来困难,可能是前置知识的掌握还不到位。 从入门到进阶 线段标记永久化 学习笔记【线段】 使用线段实现简单的内存管理 线段详解

    73710编辑于 2022-11-14
  • 来自专栏程序员小灰

    什么是 “线段” ?

    线段的概念 线段,英文名称是Segment Tree,其本质也是一个二叉搜索,区别在于线段的每一个节点记录的都是一个区间,每个区间都被平均分为2个子区间,作为它的左右儿子。 线段主要适用于某些相对罕见的应用场景: 比如给定了若干元素,要求统计出不同区间范围内,元素的个数。 现在我们已经知道了什么是线段,那么看一个利用线段的例子。 在学习线段的概念的时候,我们就知道线段的每个节点都存储了一个区间。比如说对于[1,10]这个节点,也就是这棵线段的根节点,那么它的值为1+5+1+3+4+2+0+9+0+9=34。 思考与探究 下面让我们进行一些对于线段的思考与探究: 【思考 1】 线段都应用于什么环境?除了区间和外,能否解决更多问题?比起别的有什么优势? 【答案 1】 线段一般多用于区间问题。 另外就是线段比起别的的特点。线段属于二叉搜索,像我们熟悉的红黑、AVL其实也都属于二叉搜索。只不过不同的二叉搜索用处不相同。线段比起别的,它的最大特点就是用作存储区间的特性。

    1.8K40发布于 2020-06-29
  • 来自专栏算法无遗策

    动画 | 什么是2-3

    2-3正是一种绝对平衡的,任意节点到它所有的叶子节点的深度都是相等的。 2-3的数字代表一个节点有2到3个子树。它也满足二分搜索的基本性质,但它不属于二分搜索2-3查找元素 2-3的查找类似二分搜索的查找,根据元素的大小来决定查找的方向。 动画:2-3插入 2-3删除元素 2-3删除元素相对比较复杂,删除元素也和插入元素一样先进行命中查找,查找成功才进行删除操作。 2-3为满二叉时,删除叶子节点 2-3满二叉的情况下,删除叶子节点是比较简单的。 动画:2-3删除 -----END---

    1.1K10发布于 2020-01-02
  • 来自专栏我是攻城师

    什么是2-3

    2-3 VS 二叉搜索 同样的一组数据,在2-3和二叉搜索里面的对比如下: ? 可以看到2-3的节点分布非常均匀,且叶子节点的高度一致,并且如果这里即使是AVL,那么的高度也比2-3高,而高度的降低则可以提升增删改的效率。 2-3的插入 为了保持平衡性,2-3的插入如果破坏了平衡性,那么本身会产生分裂和合并,然后调整结构以维持平衡性,这一点和AVL为了保持平衡而产生的节点旋转的作用一样,2-3的插入分裂有几种情况如下 2-3的删除 2-3树节点的删除也会破坏平衡性,同样本身也会产生分裂和合并,如下: ? 总结 本篇文章,主要介绍了2-3相关的知识,2-3,2-3-4以及B都不是二叉,但与二叉的大致特点是类似的,它们是一种平衡的多路查找,节点的孩子个数可以允许多于2个,虽然高度降低了,但编码相对复杂

    2.4K20发布于 2019-04-28
  • 来自专栏Android知识点总结

    2-3与红黑

    第一次接触红黑是在关于hashMap,上来就扔五个特性,说满足这五个特点的二分搜索就是红黑。 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 瞬时懵逼……我扔十个特性,是不是能定义一个红绿灯呢。所以一直不明白红黑为什么要这么定义。 直到今天了解了2-3,才豁然开朗。2-3是一种神奇的,它能够保证该是一个完美2-3可以演化成红黑,这便是保证红黑效率的根本。 先说奇葩的2-3,首先2-3满足二分搜索,但每个节点可能存在1或2个数据,对应的该节点就可能存在2或3个子节点 2-3 ? 2-3引入.png 2-3插入操作: ? 2-3.png 2-3演化为红黑 将三节点拆为两个节点,并将左数据节点设为红色来实现2-3同等功能 ? 红黑.png

    62930发布于 2018-09-29
  • 来自专栏wym

    P3372 【模板】线段 1 线段模版+懒惰标记

    【模板】线段 1 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 100005;

    88920发布于 2019-05-06
  • 来自专栏算法无遗策

    动画 | 什么是红黑?(基于2-3

    学习过2-3之后就知道应怎样去理解红黑了,如果直接看「算法导论」里的红黑的性质,是看不出所以然。 此时我们借着2-3去理解基本的红黑,当然我会在后几篇文章介绍2-3-4以及基于2-3-4的红黑。 抛开上面二分搜索满足红黑的性质,我们知道2-3不是二叉,我们把它转换成一颗二叉,2-节点很好转,3-节点转二叉却有两种,如下图: ? (和2-3等价的,任意节点到其叶子节点的高度都是相同的)。 因为2-3不存在永久的4-节点,4-节点终归要分解的(在2-3-4中,为了更好地插入和删除,4-节点可存在于叶子节点和非叶子节点)2-3一样不行,所以在2-3中没有任何一个节点能同时和两条红链接相连

    1.1K20发布于 2020-01-02
  • 来自专栏后台技术底层理解

    线段详解分析

    什么是线段? 是用来存放给定区间(segment, or interval)内对应信息的一种数据结构。 对应于树状数组,线段进行更新(update)的操作为O(logn),进行区间查询(range query)的操作也为O(logn)。 线段是用一个完全二叉来存储对应于其每一个区间(segment)的数据。该二叉的每一个结点中保存着相对应于这一个区间的信息。 同时,线段所使用的这个二叉是用一个数组保存的,与堆(Heap)的实现方式相同。 线段的作用? 线段可以使用log(n) 的时间复杂度来进行更新和查询数组范围的和。 构建线段 线段在初始化时可以创建4倍原数组大小的空间 static class SegmentTree { int[] tree; int N = 100;

    82310发布于 2020-09-10
  • 来自专栏AngelNI

    线段Segment Tree

    迷茫 线段学习 问题导入 给定一个长度为n的数组,有m次操作,每次操作可能如下: 1,修改 a[i] 的值 2,求连续一段区间的和 3, 求连续一段区间的最大值/最小值 4,给区间的每个数加上k 5, 所以线段就诞生了。 线段 线段类似下图树状结构,用蒟蒻语说,就是“树状区间和”,即将一个二分过程表现出来。通过改变大区间的值,来实现短时区间计算。时间复杂度可以优化到O(logn) ? 线段操作 1.建树 建树采用二分的方法 void build(int l,int r,int node) { if(l==r) { scanf("%d",&tree[node

    94410发布于 2020-04-16
领券