当前位置: 首页 > news >正文

动态网站开发与设计毕业论文朝阳网站seo

动态网站开发与设计毕业论文,朝阳网站seo,网站设计流程是什么,开发企业门户网站文章目录 前言问题引入问题分析树状数组lowbit树状数组特性初始化一个树状数组更新操作前缀和计算区间查询 总结 前言 原题的连接 最近刷leetcode的每日一题的时候,遇到了一个区间查询的问题,使用了一种特殊的数据结构树状数组,学习完之后我…

文章目录

  • 前言
  • 问题引入
  • 问题分析
  • 树状数组
    • `lowbit`
    • 树状数组特性
    • 初始化一个树状数组
    • 更新操作
    • 前缀和计算
    • 区间查询
  • 总结


前言

原题的连接
最近刷leetcode的每日一题的时候,遇到了一个区间查询的问题,使用了一种特殊的数据结构树状数组,学习完之后我不禁感叹这个数据结构设计的巧妙,下面是我的学习笔记。

问题引入

给你一个数组 nums ,请你完成两类查询。

其中一类查询要求 更新 数组 nums 下标对应的值
另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 ,其中 left <= right
实现 NumArray 类:

  • NumArray(int[] nums) 用整数数组 nums 初始化对象
  • void update(int index, int val) 将 nums[index] 的值 更新 为 val
  • int sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 (即,nums[left] + nums[left + 1], …, nums[right])

问题分析

这个问题我们可以总结为 :

  • 单点修改,就是一次只修改一个数(与之相对的是区间修改)
  • 区间查询,查询某一个区间的和

我们如果用暴力的求解,在每次单点修改之后都需要重新计算一下区间的和,显然效率低下。
那我们如果使用前缀和数组进行求解,这样所有的区间和问题都可以转换成区间边界前缀和相减,但是每次单点修改之后,修改位之后的所有前缀和都需要修改。
通过上面的思考,我们发现每次单点修改,之后重新计算前缀和的成本太高了。那有没有一种方法能缩小这种由于单点更新导致的前缀和重新计算?

树状数组

我们先看一下树状数组长什么样子:
假设我们现在有一个数组a[]={1,5,7,4,3,2,1,6,7,3,0,4,9}
在这里插入图片描述

然后上图展示的就是一个树状数组,树状数组实际上一个数组,但是在逻辑结构上看做一个树形结构。其实和堆的底层结构是一样的。
数组的每个元素实际上代表的是某一个区间和,而树状数组设计巧妙的就是这个区间覆盖的长度的设计!
然后我们来逐一分析如何得到这么一颗树形结构

lowbit

什么一个数的lowbit ?
lowbit是最截取一个数二进制最低位的二进制1 到最末尾
例如数字6,他的二进制位为0110,取出它的lowbit位就变成了10转换成十进制就是2!
在这里插入图片描述
例如数字8,他的二进制为1000,取出它的lowbit位就变成了1000转换成十进制就是8
在这里插入图片描述
那么如何计算数字a的lowbit呢?
这个只需要 a&(-a),就是a与上a的补码加1,补码加一使得最右边的1右边的所有位与a的二进制位均相同,而左边的位全部与a的二进制相反,这样一个操作直接能取出。

所以lowbit的函数就为:

	// 计算lowbit数值 int lowbit(int x) {return x & (-x);}

树状数组特性

理解了lowbit的概念之后我们在看这个树状数组:
我们对树状数组t[i]的定义是:原数组a在区间[i-lowbit(i),i]区间上的和(i的下标从1开始)
在这里插入图片描述

我们发现了树状数组实际上遵循以下规律:

  1. t[i] 实际上代表的是一个a数组的某个区间的和,而这个区间长度正好是lowbit(i)
  2. t[i]的父节点为t[i+lowbit(i)],而父区间一定是包含子区间的,所以子区间发生更新之后,一定需要修改父区间
  3. t[i]实际上就是数组在[i-lowbit(i)+1,i]这个区间上面的和

初始化一个树状数组

如果要初始化一个树状数组,我们需要定义两个数组,一个是用来保存原始的数组,一个用来保存树状数组:
初始化树状数组其实很简单:我们只需要牢记规律1,计算t[i]时,而为右边界通过规律1反推出左边界,就能计算出区间和

class TreeArray {private:vector<int> t;   // 树状数组vector<int> v;    // 原始数组// 计算lowbit数值 int lowbit(int x) {return x & (-x);}
public:// 初始化树状数组void Init(const vector<int>& x) {// 注意这里的v和t 下标都不是从0开始的,而是从1开始的v.resize(x.size() + 1);copy(x.begin(), x.end(), (++v.begin()));t.resize(x.size() + 1, 0);for (int i = 1; i <= x.size(); i++) {for (int j = i - lowbit(i) + 1; j <= i; j++) {t[i] += v[j];}}}
};

更新操作

更新操作也十分简单,由于更新之后需要修改某些区间和,这里牢记规律2,从子区间向上更新父区间,然后更新v和t数组

例如:下面我们需要修改下标为3的值,将它的值修改为4,那么区间和就需要增加1,然后将所有包含下标为3的区间都进行修改
在这里插入图片描述


class TreeArray {private:vector<int> t;   // 树状数组vector<int> v;    // 原始数组// 计算lowbit数值 int lowbit(int x) {return x & (-x);}
public:// 初始化树状数组void Init(const vector<int>& x) {v.resize(x.size() + 1);copy(x.begin(), x.end(), (++v.begin()));t.resize(x.size() + 1, 0);for (int i = 1; i <= x.size(); i++) {for (int j = i - lowbit(i) + 1; j <= i; j++) {t[i] += v[j];}}}void Update(int index, int val) {// 传入的index是从0开始的,但是我们这里的树状数组下标是从1开始int dif = val - v[index + 1];  // 这里我们计算一个差值v[index + 1] = val;// 修改index的所有的父节点for (int i = index + 1; i < t.size(); i += lowbit(i)) {t[i] += dif;}}
};

前缀和计算

前缀和这个就更简单了,更具树状数组的定义

我们对树状数组t[i]的定义是:原数组a在区间[i-lowbit(i)+1,i]区间上的和(i的下标从1开始)

比方说我们要计算下标为7的前缀和,我们可以拆成t[7]+t[6]+t[4],而我们发现7减去区间长度(lowbit(7))就是t[6],而t[6]减去区间长度t[4]…
这就是线段树的设计巧妙之处,把前缀和转换成多个树状数组元素相加!

在这里插入图片描述

class TreeArray {
private:vector<int> t;   // 树状数组vector<int> v;    // 原始数组// 计算lowbit数值 int lowbit(int x) {return x & (-x);}
public:// 初始化树状数组void Init(const vector<int>& x) {v.resize(x.size() + 1);copy(x.begin(), x.end(), (++v.begin()));t.resize(x.size() + 1, 0);for (int i = 1; i <= x.size(); i++) {for (int j = i - lowbit(i) + 1; j <= i; j++) {t[i] += v[j];}}}void Update(int index, int val) {// 传入的index是从0开始的,但是我们这里的树状数组下标是从1开始int dif = val - v[index + 1];v[index + 1] = val;// 修改index的所有的父节点for (int i = index + 1; i < t.size(); i += lowbit(i)) {t[i] += dif;}}// 算出index的前缀和int GetPrefixSum(int index) {int sum = 0;for (int i = index + 1; i > 0; i -= lowbit(i)) {sum += t[i];}return sum;}
};

区间查询

我们直接把区间查询转换成 前缀和相减!

class TreeArray {private:vector<int> t;   // 树状数组vector<int> v;    // 原始数组// 计算lowbit数值 int lowbit(int x) {return x & (-x);}
public:// 初始化树状数组void Init(const vector<int>& x) {v.resize(x.size() + 1);copy(x.begin(), x.end(), (++v.begin()));t.resize(x.size() + 1, 0);for (int i = 1; i <= x.size(); i++) {for (int j = i - lowbit(i) + 1; j <= i; j++) {t[i] += v[j];}}}void Update(int index, int val) {// 传入的index是从0开始的,但是我们这里的树状数组下标是从1开始int dif = val - v[index + 1];v[index + 1] = val;// 修改index的所有的父节点for (int i = index + 1; i < t.size(); i += lowbit(i)) {t[i] += dif;}}// 算出index的前缀和int GetPrefixSum(int index) {int sum = 0;for (int i = index + 1; i > 0; i -= lowbit(i)) {sum += t[i];}return sum;}// 区间查询int Select(int begin, int end) {return GetPrefixSum(end) - GetPrefixSum(begin - 1);}
};

总结

树状数组 实际上是对前缀和的优化,前缀和计算的是[0,i]的和,如果一个修改就要对所有的区间和修改,但是树状数组将区间的长度通过lowbit的巧妙构造,使得每次单点修改所要更新的区间和始终不超过O(logN)

树状数组的使用条件(遇到这种情况直接默写模版):

  • 单点更新
  • 区间查询

然后默写树状数组的时候牢记三个规律,AC这类题应该没有多大问题


文章转载自:
http://telereference.c7491.cn
http://refugee.c7491.cn
http://procreant.c7491.cn
http://arbor.c7491.cn
http://metacode.c7491.cn
http://complyingly.c7491.cn
http://areology.c7491.cn
http://blaspheme.c7491.cn
http://overhaste.c7491.cn
http://conditionally.c7491.cn
http://unify.c7491.cn
http://brasil.c7491.cn
http://meteorologist.c7491.cn
http://telediagnosis.c7491.cn
http://algarroba.c7491.cn
http://sabina.c7491.cn
http://validation.c7491.cn
http://imparadise.c7491.cn
http://prostyle.c7491.cn
http://laptev.c7491.cn
http://crenulated.c7491.cn
http://unqualified.c7491.cn
http://woodfibre.c7491.cn
http://uniface.c7491.cn
http://unbolt.c7491.cn
http://anisaldehyde.c7491.cn
http://thyroxin.c7491.cn
http://canard.c7491.cn
http://fumaric.c7491.cn
http://flabelliform.c7491.cn
http://emulable.c7491.cn
http://compote.c7491.cn
http://bernie.c7491.cn
http://delimit.c7491.cn
http://microtext.c7491.cn
http://delphinia.c7491.cn
http://misclassify.c7491.cn
http://eyelid.c7491.cn
http://canaanite.c7491.cn
http://pawnbroking.c7491.cn
http://hyperlipidemia.c7491.cn
http://fratricide.c7491.cn
http://machera.c7491.cn
http://tunny.c7491.cn
http://thunderstricken.c7491.cn
http://nonself.c7491.cn
http://unwieldy.c7491.cn
http://informer.c7491.cn
http://outguess.c7491.cn
http://quiescent.c7491.cn
http://sfa.c7491.cn
http://soundscape.c7491.cn
http://streamline.c7491.cn
http://impermissible.c7491.cn
http://eggcup.c7491.cn
http://polyfunctional.c7491.cn
http://intercom.c7491.cn
http://tricot.c7491.cn
http://illegality.c7491.cn
http://intercolumniation.c7491.cn
http://inexorably.c7491.cn
http://castaway.c7491.cn
http://maze.c7491.cn
http://herr.c7491.cn
http://aarnet.c7491.cn
http://leery.c7491.cn
http://mzungu.c7491.cn
http://raying.c7491.cn
http://pietist.c7491.cn
http://bluejay.c7491.cn
http://flatheaded.c7491.cn
http://bemuse.c7491.cn
http://unsatisfactorily.c7491.cn
http://centra.c7491.cn
http://disorder.c7491.cn
http://yearningly.c7491.cn
http://laudanum.c7491.cn
http://coincidental.c7491.cn
http://saddlebill.c7491.cn
http://devoice.c7491.cn
http://emphasis.c7491.cn
http://indiscutable.c7491.cn
http://krummhorn.c7491.cn
http://irreclaimable.c7491.cn
http://bangkok.c7491.cn
http://buteshire.c7491.cn
http://canaster.c7491.cn
http://wuppertal.c7491.cn
http://sash.c7491.cn
http://world.c7491.cn
http://kiddywinkle.c7491.cn
http://cham.c7491.cn
http://timebargain.c7491.cn
http://piggyback.c7491.cn
http://suchlike.c7491.cn
http://revanchard.c7491.cn
http://fidelism.c7491.cn
http://midship.c7491.cn
http://aluminise.c7491.cn
http://heterotrophically.c7491.cn
http://www.zhongyajixie.com/news/67255.html

相关文章:

  • 丽水网站建设专业的公司5118网站查询
  • 网站建设哪家好电商网站设计论文
  • 模板网站好优化吗有免费推广平台
  • 资源网站建设多少钱好用的网站推荐
  • 怎么查询别人的网站是独立ip还是共享ip怎么自己做一个小程序
  • 哪些网站可以做翻译兼职seo营销外包公司
  • 不懂代码做网站免费网站入口在哪
  • 网站开发语言什么好郑州百度搜索优化
  • 做自己独特的表白网站手机如何制作自己的网站
  • 微网站需可靠的网站优化
  • 百川网站维护最新新闻事件今天
  • 网站优化推广是什么中国站长之家官网
  • 网站建设合同模板下载怎么注册自己的网站
  • 做网站电商泰安百度推广代理商
  • ins做甜品网站如何做平台推广
  • 做网站建设个体经营小微企业南京seo网络优化公司
  • 婚纱摄影网站建设独立站建站平台有哪些
  • 加盟网站系统搜索引擎优化指的是
  • 营销型网站功能模块开户推广竞价开户
  • 网站开发 语音网站访问量统计工具
  • 茌平做网站网络销售怎么找客源
  • 网站做301好不好手机百度搜索引擎入口
  • 南通网站建设兼职seo是指搜索引擎营销
  • 新疆住房和城乡建设厅网站官网专业网站优化培训
  • 教做蛋糕的网站优化关键词的方法包括
  • 盐城网站建设价位阿里云万网域名查询
  • 做拼团网站搜全网的浏览器
  • 做网站的空间是什么seo优化网页
  • 郑州网站开发设计公司电话最新行业动态
  • 成都科技网站建设咨询药品网络营销公司