从0开始学算法--基础数据结构(2.9树状数组)
时间:2019-10-21
本文章向大家介绍从0开始学算法--基础数据结构(2.9树状数组),主要包括从0开始学算法--基础数据结构(2.9树状数组)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给你一个数组a[],求一段连续区间的和;
解:可以用sum[i]表示a[1]到a[i]的和,这样求a[l]到a[r]的和就变成了求sum[r]-sum[l-1],预处理O(n)的时间复杂度处理出sum[]之后查询只需要O(1)
(注释:把l-r的问题转化为1-l,1-r的问题是一种常用思想)
但是如果加入另外一个操作给a[i]加上x,发现,如果给第一个元素加上x之后全部元素都会加上x,时间复杂度就会很大
那么应该怎么办?
修改和查询一个操作是O(1),一个操作是O(n)(这不是数组和链表吗)
所以可以用分块的思想分成根号n块,每块记录他的前缀和,这样查询和修改都变成了根号n的时间复杂度
但是这种分配方式并不算好,有没有更好的分配方式呢?
树状数组:
在树状数组中sum[i]代表的是a[i-lowbit(i)]到a[i]的和
lowbit(i)是i在二进制中最后一位1,例如i是二进制数10100,那么lowbit(i)=4(二进制100)
那么可以得到求前n项的和是只有求二进制位为一的项数之和,为1的位数不超过logn所以查询的时间复杂度为logn
同理修改操作也只会影响logn个位置的值,那么修改的操作也是logn的时间复杂度
int lowbit(int x){ return x&(-x); } void add(int x,int y){//给a[x]+y while(x<=n){ sum[x]+=y; x+=lowbit(x); } } int qian_zhui_he(int x){//求a[1]到a[x]的和 int ans=0; while(x>0){ ans+=sum[x]; x+=lowbit(x); } return ans; }
注释:如果a[]初始数组不全为0,那么给每个点做一次add操作即可
原文地址:https://www.cnblogs.com/wz-archer/p/11714535.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 为什么别人不想回答你提的问题?
- python面试题搜集:史上最全python面试题详解(一)
- 一日一技:在 Golang 中如何快速判断字符串是否在一个数组中
- 面试问题之操作系统
- 软技能提升:转转中后台规范落地实践
- python面试题搜集(三)
- 什么是计算机网络?为什么需要网络通信?如何进行网络编程?
- Python中好用又高效的Collections 模块
- 正确创建Python二维数组
- 深入理解Python内存管理与垃圾回收,再也不怕问了(一)
- 走进面向“对象”编程的理想国(一)——深入理解Python中的一切皆对象
- 深入理解Python内存管理与垃圾回收,再也不怕问了(二)
- 如何利用Python实现二分查找(迭代和递归)
- 详解排序算法(Python实现)
- Python垃圾回收机制