- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
树状数组简介
一、前言
我们平日里总是会遇到一些动态的求和问题,一些朴素的方法时间速度上很难让人满意,因此我们需要设计一些算法来解决所遇到的问题。
基本问题
我们下面设法解决这个动态求和问题。
我们定义 N 个整型变量组成的数组 v[1..N],每次操作有两种:
将v[idx] 增加 det
求
朴素解决
朴素的解决这个问题,我们用数组记录当前的数值,然后依次求和。那么操作(1)的复杂度是 O(1),操作(2)的复杂度是 O(idx),令询问数为 Q ,则在最坏情况下为 O(QN)。
这样的复杂度非常不理想,我们要对之优化!
二、倍增,分割和优化
很多时候在处理区间问题的时候,倍增思想都是非常常用的,比如 RMQ和LCA问题,而分割方法也是一个有用的工具,比如线段树。
我们知道线段树是能够解决上面这个基本问题的,但是考虑到线段树的代码比较复杂,这里我们讨论更轻松的方法。
第一个想法
我们发现,在朴素算法中,操作(2)用了很多的时间,我们试着优化这个操作的算法。
参照RMQ的思想,我们可以将一个区间分成一些长度为2的整次幂的小区间。
我们定义f[i][j] 表示区间 [I, i+2^j-1] 的和,那么如果我们能够得到所有 f[i][j] ,那么我们就能够在 O(log N) 的时间里计算出我们需要的和。
具体方法如下:
对于区间 [L,R],我们找到最大的 p ,使得 2^p = R-L+1,而 sum[L,L+2^p-1] = f[L][p],于是我们只要继续计算 [L+2^p,R]就可以了。
由于每次找最大的 p,因次至多计算 log N 次就能得到结果——这就是倍增思想的应用。
但是很不幸,我们再观察操作(1)的时候,我们发现由于和某一个位置相关的 f[i][j] 实在太多了,所以操作(1)的时间就花的过多了,问题并没有得到解决。
看来我们并不能完全照搬 RMQ 问题的经验——RMQ是静态问题,而这里是动态的。
化简问题
我们回过头看我们研究的问题,我们只需要求 [1,idx] 的和,并不需要求出任意区间的和,所以我们保存了大量没用的 f[i][j] ,因此使得我们操作(1)所需要的时间过多。
现在我们要删去我们不需要的 f[i][j],让数据变得更加紧凑。
观察计算区间 [1,R],我们找到最大的 p,满足 2^p = R,我们用到的f[1][p],之后我们会紧接着计算 [2^p+1,R],似乎我们跳过了所有的 f[i][p] (1i2^p+1),那么所有这样的 f[i][p] 是否会用到呢?
答案是否定的。简单证明一下:
反证法:假设计算区间为 [1..R],上次使用的为f[j][q],当前区间为 [2^q+1,R],计算得到最大的p满足 2^p + 2^q = R ,且有 2^q +1 2^p + 1。则 2^p 2^q,2^q = R,因此上次得到的 q,必然不是最大 q,使得 2^q = R,p 比 q 更优。假设不成立。(证毕)
接着我们不难归纳得出,我们只可能用到 f[i][p] (i mod 2^p = 1)。如下图。
方块就表示一个对应的 f[i][p] ,即一段部分和。
可以发现,现在,对于一个下标 idx ,最多只有 log N 个方块在其上方,因此在完成操作(1)的时候,我们只需要 Log N 的时间,就可以了。
进一步的化简
对于区间 [1,R],不难发现,我们是将区间划分成了至多 log N 块小区间,长度为 2^p1,2^p2,2^p3 …… 2^pk。这里 pi pi+1 ,即 p 序列是严格递减的。这正是因为我们每次都找出当前最大的 p 的缘故。
于是,我们发现,上图中的红色方块其实也是不需要储存的。我们将其删去,就有了下图。
整理后发现,每一个数组元素和每一个f[i][p]一一对应。紧接着,我们用t数组记录每个数组元素对应的f[i][p],而这就是树状数组。
至此,我们从基于倍增思想的最朴素的分割方法,不断优化,最后得到了我们需要的东西。
4、树状数组小史
树状数组,Binary Indexed Tree,简称BIT,是1994年由Peter M. Fenwick首先提出的。BIT在快速求和方面有常数小、速度快、空间需求低、代码简洁等许多优点,很短时间便广泛流传。
从英文来看,不难看出,BIT是一个tree,其实设计它的时候本身就是用树的理念设计的。我们如果加一个结点0为根,元素对应的覆盖区域若相邻便连边,很容易建立出这么一颗有根树。
这个树的意义在于:对于区间和 [1,R],只要取出0-R的这条路径 ,并将路径上所有节点的值相加,就是要求的答案!我们称之为——询问树(the interrogation tree)。
而这棵树的深度是 L
您可能关注的文档
- 化工实习分解.doc
- 化工设备机械基础期末考试范围(吉林工商学院)分解.doc
- 化工企业和仓库各种间距表分解.doc
- 煤矿更换掘进机驱动轮及切割部密封的安全技术措施分解.doc
- 化工过程中模型的建立与计算分解.doc
- 煤焦油安全技术说明书分解.doc
- 化工工艺与设备论文分解.doc
- 华中农业大学生物学拔尖创新人才分解.doc
- 华中科技大学同济医学院93-16年病理学考博真题(打印版)分解.doc
- 煤层气开发项目储罐安装监理细则分解.doc
- 2025年山西省晋中市行政职业能力测验题库附答案.docx
- 2025年山东省东营市单招(语文)测试题库有答案.docx
- 2025年山西机电职业技术学院单招(语文)测试模拟题库推荐.docx
- 2025年山西省吕梁市事业单位招聘考试(职业能力倾向测验)题库汇编.docx
- 2025年山东省淄博市选调生考试(行政职业能力测验)综合能力题库完整版.docx
- 2025年山东省滨州地区单招(语文)测试题库一套.docx
- 2025年山东省菏泽地区单招(语文)测试题库一套.docx
- 2025年山东畜牧兽医职业学院单招语文测试模拟题库及完整答案1套.docx
- 2025年山东省枣庄市行政职业能力测验题库新版.docx
- 2025年山东省聊城市单招(语文)测试模拟题库及答案一套.docx
最近下载
- 储能电站项目可行性研究报告.docx
- 2024重庆公共运输职业学院招聘7人笔试备考题库及答案解析.docx VIP
- 华为IPD流程管理体系L1-L5最佳实践及落地实施.pptx VIP
- 铁路内燃机车司机高级技师理论题库(含答案).docx VIP
- 2026届高三语文开学第一课.pptx VIP
- 最新:脑卒中后吞咽障碍患者进食护理——2023中华护理学会团体标准课件.pptx VIP
- 2025重庆公共运输职业学院招聘13人笔试备考试题及答案解析.docx VIP
- 动词过去式不规则变化.doc VIP
- “十八项医疗质量安全核心制度”知识竞赛.docx VIP
- 2024重庆公共运输职业学院招聘1人笔试备考试题及答案解析.docx VIP
文档评论(0)